merge master into develop - CscListRForm.jsp FAQ 아코디언 버그 수정

This commit is contained in:
jilee4unity
2026-05-28 23:34:06 +09:00
7250 changed files with 570509 additions and 25 deletions

View File

@@ -0,0 +1,292 @@
<?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="com.wb.domainserver.domain.gcone.bnft.atend.mapper.BOAtendMapper">
<!-- 혜택 화면 설정 정보 조회 -->
<select id="selectBOBenefitScreenInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 고유 번호
b.USE_AT, -- 사용여부
b.SCR_REPRSNT_IMG, -- 화면 대표 이미지 경로
b.SCR_REPRSNT_LINK_URL, -- 화면 대표 이미지 링크 URL
b.SCR_RWD_IMG, -- 보상 이미지 경로
b.SCR_RWD_LINK_URL, -- 보상 이미지 링크 URL
b.BNF_WORDS_CN, -- 혜택 안내 문구
b.BNF_BGN_DT, -- 진행기간 시작일시
b.BNF_END_DT, -- 진행기간 종료일시
r.MLG_RWD_AMT -- 마일리지 보상 금액
FROM
GC_BENEFIT b
LEFT JOIN GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
WHERE
b.BNF_DV_CD = '010' -- 출석체크 혜택 구분 코드
AND b.USE_AT = 'Y'
AND r.BNF_RWD_CATE_DV_CD = '01010'
AND DATE(NOW()) BETWEEN DATE(b.BNF_BGN_DT) AND DATE(b.BNF_END_DT)
AND b.SOPMAL_CD = #{sopmalCd}
ORDER BY
b.BNF_INNB -- 혜택 고유 번호로 정렬
]]>
</select>
<!-- 출석 보상 정보 조회 -->
<select id="selectAttendanceRewardInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
br.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.MLG_RWD_AMT, -- 마일리지 보상 금액
br.COUPON_INNB, -- 쿠폰 고유 번호
br.ITM_NM AS ITM_NM, -- 보상 상품 이름
br.RWD_CND_CNT, -- 보상 조건 횟수
CASE
WHEN br.BNF_RWD_CATE_DV_CD = '01010' THEN '매일'
WHEN br.BNF_RWD_CATE_DV_CD IN ('01020', '01030') THEN CONCAT('누적 ', br.RWD_CND_CNT, '회')
WHEN br.BNF_RWD_CATE_DV_CD = '01040' THEN '100% 출석'
ELSE ''
END AS reward_condition -- 보상 조건 설명
from GC_BENEFIT gb
LEFT JOIN
GC_BENEFIT_REWARD br
ON gb.BNF_INNB = br.BNF_INNB
WHERE
br.BNF_INNB = #{bnfInnb}
AND gb.SOPMAL_CD = #{sopmalCd}
ORDER BY
br.RWD_CND_CNT;
]]>
</select>
<!-- 월간 출석 현황 조회 -->
<select id="selectMonthlyAttendance" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
DATE_FORMAT(BNF_PRT_DT, '%Y-%m-%d') AS attendanceDate -- 출석 날짜
FROM
GC_BENEFIT_PARTCPTN
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND DATE_FORMAT(BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') -- 현재 월 조건
]]>
</select>
<!-- 일일 출석 보상 정보 조회 -->
<select id="selectDailyAttendanceReward" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 보상 금액
COUPON_INNB, -- 쿠폰 고유 번호
ITM_NM -- 표시명
FROM
GC_BENEFIT_REWARD
WHERE
BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND BNF_RWD_CATE_DV_CD = '01010' -- 일일 출석 보상 코드
]]>
</select>
<!-- 누적 출석 보상 정보 조회 -->
<select id="selectCumulativeAttendanceReward" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
br.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.MLG_RWD_AMT, -- 마일리지 보상 금액
br.COUPON_INNB, -- 쿠폰 고유 번호
COALESCE(cs.COUPON_SNDNG_NM, br.ITM_NM) AS ITM_NM, -- 쿠폰 이름 (쿠폰발송명 우선, 없으면 표시명)
br.RWD_CND_CNT -- 보상 조건 횟수
FROM
GC_BENEFIT_REWARD br
LEFT JOIN GC_COUPON_SNDNG cs ON br.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
WHERE
br.BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND br.BNF_RWD_CATE_DV_CD IN ('01020', '01030', '01040') -- 누적 출석 보상 코드들
ORDER BY
br.RWD_CND_CNT -- 보상 조건 횟수 기준 정렬
]]>
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '010' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 출석체크 참여 -->
<insert id="participateAttendanceCheck" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" useGeneratedKeys="true" keyProperty="bnfPrtInnb" keyColumn="BNF_PRT_INNB">
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB, -- 혜택 고유 번호
BNF_PRT_DT, -- 혜택 참여 일시
MBR_INNB, -- 회원 고유 번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
)
SELECT
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{paidLeafCnt},
#{regusr},
NOW()
WHERE
NOT EXISTS (
SELECT 1
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
)
]]>
</insert>
<!-- 마일리지 적립 (일일/누적 보상 구분) -->
<insert id="insertMileageReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT
(
BNF_RCV_INNB, -- 혜택 보상수령 고유 번호
BNF_PRT_INNB, -- 혜택 참여 고유 번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 보상 금액
COUPON_INNB, -- 쿠폰 고유 번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
)
VALUES
(
#{bnfRcvInnb},
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{regusr},
NOW()
)
]]>
</insert>
<!-- 이번 달 출석 횟수 조회 -->
<select id="selectCurrentMonthAttendanceCount" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COUNT(*) AS currentMonthAttendanceCount -- 이번 달 출석 횟수
FROM
GC_BENEFIT_PARTCPTN
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND DATE_FORMAT(BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') -- 현재 월 조건
]]>
</select>
<!-- 누적 출석 마일리지 조회 -->
<select id="selectTotalAttendanceMileage" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COALESCE(SUM(r.MLG_RWD_AMT), 0) AS totalAttendanceMileage -- 누적 출석 마일리지
FROM
GC_BENEFIT_RECEIPT r
JOIN
GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE
p.MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND r.MLG_RWD_AMT IS NOT NULL
AND r.MLG_RWD_AMT > 0
AND DATE_FORMAT(p.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
]]>
</select>
<!-- 오늘 출석체크 참여 정보 조회 -->
<select id="selectTodayAttendance" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT *
FROM
GC_BENEFIT_PARTCPTN
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND DATE(BNF_PRT_DT) = CURDATE() -- 오늘 날짜 조건
]]>
</select>
<!-- 알림 상태 조회 -->
<select id="selectNotificationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
AGRE_AT -- 동의 여부
FROM
GC_BENEFIT_AGREE
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '010' -- 혜택 구분 코드 (출석체크)
AND BNF_AGRE_DV_CD = '010' -- 혜택 동의 구분 코드 (알림동의)
]]>
</select>
<!-- 알림 신청 -->
<insert id="insertNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO">
<![CDATA[
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
AGRE_AT, -- 동의 여부
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{sopmalCd},
#{mbrInnb},
#{mbrDvCd},
'010', -- 출석체크 혜택 구분 코드
'010', -- 알림동의 구분 코드
'Y', -- 동의함
#{regusr},
NOW()
)
]]>
</insert>
<!-- 알림 on off -->
<update id="updateAtendNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO">
<![CDATA[
UPDATE GC_BENEFIT_AGREE
SET
AGRE_AT = #{agreAt},
REGIST_DT = NOW()
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '010'
AND BNF_AGRE_DV_CD = '010'
]]>
</update>
</mapper>

View File

@@ -0,0 +1,367 @@
<?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="com.wb.domainserver.domain.gcone.bnft.bnftMain.mapper.BOBnftMainMapper">
<!-- 혜택 메인 메뉴 목록 조회 -->
<select id="selectBnftMainList" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
m.BNF_DV_CD,
m.SOPMAL_CD,
m.MENU_SJ_1,
m.MENU_SJ_2,
m.SORT_ORDR,
CASE
WHEN m.BNF_DV_CD = '120' THEN 'Y'
WHEN m.BNF_DV_CD = '140' THEN 'Y'
WHEN m.BNF_DV_CD = '020' AND (
SELECT COALESCE(d.PHAC_AGRE_AT, 'N')
FROM GC_MEMBER_DEVICE_INFO d
WHERE d.MBR_INNB = #{mbrInnb}
AND d.MBR_DV_CD = #{mbrDvCd}
AND d.SOPMAL_CD = #{sopmalCd}
AND d.DEVICE_ID = #{deviceId}
LIMIT 1
) = 'Y' AND EXISTS (
SELECT 1
FROM GC_BENEFIT b
WHERE b.BNF_DV_CD = m.BNF_DV_CD
AND b.SOPMAL_CD = m.SOPMAL_CD
AND b.USE_AT = 'Y'
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT <= NOW())
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT >= NOW())
) THEN 'Y'
WHEN EXISTS (
SELECT 1
FROM GC_BENEFIT b
WHERE b.BNF_DV_CD = m.BNF_DV_CD
AND b.SOPMAL_CD = m.SOPMAL_CD
AND b.USE_AT = 'Y'
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT <= NOW())
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT >= NOW())
) THEN 'Y'
ELSE 'N'
END AS AVAL_AT,
CASE
WHEN m.BNF_DV_CD = '100' AND EXISTS (
SELECT 1
FROM GC_BENEFIT b
JOIN GC_BENEFIT_NTKCHL n ON b.BNF_INNB = n.BNF_INNB
WHERE b.BNF_DV_CD = '100'
AND b.SOPMAL_CD = m.SOPMAL_CD
AND b.USE_AT = 'Y'
AND n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.DEL_AT = 'N'
) THEN 'Y'
ELSE 'N'
END AS NTK_CHL_AT,
(
SELECT b.BNF_INNB
FROM GC_BENEFIT b
JOIN GC_BENEFIT_NTKCHL n ON b.BNF_INNB = n.BNF_INNB
WHERE b.BNF_DV_CD = '100'
AND b.SOPMAL_CD = m.SOPMAL_CD
AND b.USE_AT = 'Y'
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT <= NOW())
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT >= NOW())
AND n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.DEL_AT = 'N'
ORDER BY n.REGIST_DT DESC
LIMIT 1
) AS NTK_BNF_INNB,
CASE
WHEN m.BNF_DV_CD = '050' AND EXISTS (
SELECT
gbcs.BNF_STTUS_INNB,
gbcs.PROGRS_AT,
gbcs.BNF_INNB
from
GC_BENEFIT gb
left join
GC_BENEFIT_CPSLMKN_STTUS gbcs
on gb.BNF_INNB = gbcs.BNF_INNB
WHERE
gbcs.MBR_INNB = #{mbrInnb}
AND gbcs.MBR_DV_CD = #{mbrDvCd}
AND gbcs.PROGRS_AT = 'Y'
AND gb.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND USE_AT = 'Y'
) THEN 'Y'
ELSE 'N'
END AS CPSL_PROGRS_AT,
(
SELECT s.BNF_INNB
FROM GC_BENEFIT_CPSLMKN_STTUS s
JOIN GC_BENEFIT b ON s.BNF_INNB = b.BNF_INNB
WHERE s.MBR_INNB = #{mbrInnb}
AND s.MBR_DV_CD = #{mbrDvCd}
AND s.PROGRS_AT = 'Y'
AND b.SOPMAL_CD = m.SOPMAL_CD
AND b.BNF_DV_CD = '050'
AND b.USE_AT = 'Y'
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT <= NOW())
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT >= NOW())
ORDER BY s.REGIST_DT DESC
LIMIT 1
) AS CPSL_BNF_INNB,
CASE
WHEN EXISTS (
SELECT 1
FROM GC_BENEFIT b2
JOIN GC_BENEFIT_INTEREST bi ON b2.BNF_INNB = bi.BNF_INNB
WHERE b2.BNF_DV_CD = m.BNF_DV_CD
AND b2.SOPMAL_CD = m.SOPMAL_CD
AND bi.USE_AT = 'Y'
AND bi.DEL_AT = 'N'
) THEN 'Y'
ELSE 'N'
END AS INTRST_AVAL_AT,
CASE
WHEN m.BNF_DV_CD = '040' THEN (
COALESCE(
(SELECT SUM(CHG_CNT) FROM GC_BENEFIT_CHARGE
WHERE MBR_INNB = #{mbrInnb} AND BNF_DV_CD = '040')
, 0)
-
COALESCE(
(SELECT COUNT(*) FROM GC_BENEFIT_PARTCPTN BP
INNER JOIN GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE BP.MBR_INNB = #{mbrInnb}
AND B.BNF_DV_CD = '040')
, 0)
)
ELSE 0
END AS ROULETTE_REMAINING_CNT
FROM
GC_BENEFIT_MANAGE_MENU m
WHERE
m.INDICT_AT = 'Y'
AND SOPMAL_CD = #{sopmalCd}
ORDER BY
m.SORT_ORDR asc
]]>
</select>
<!-- 디바이스 권한 조회 -->
<select id="selectDevicePermission" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
PHAC_AGRE_AT
FROM
GC_MEMBER_DEVICE_INFO
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND DEVICE_ID = #{deviceId}
]]>
</select>
<!-- 배너 목록 조회 -->
<select id="selectBannerList" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_BANNER_INNB, -- 혜택 배너 고유번호
SOPMAL_CD, -- 쇼핑몰코드
BANNER_SJ, -- 배너 제목
LINK_URL, -- 링크 URL
IMG_FIL_COURS, -- 이미지 파일 경로
IMG_FIL_NM, -- 이미지 파일명
SORT_ORDR -- 정렬 순서
FROM
GC_BENEFIT_MANAGE_BANNER
WHERE
SOPMAL_CD = #{sopmalCd} -- 파라미터로 받은 쇼핑몰 코드
AND USE_AT = 'Y' -- 사용 여부가 'Y'인 배너만
AND DEL_AT = 'N' -- 삭제되지 않은 배너만
ORDER BY
SORT_ORDR ASC -- 정렬 순서대로 조회
]]>
</select>
<!-- 마케팅동의 여부 조회 -->
<select id="selectMbrMarktAgreeAt" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
MARKT_RECPTN_AGRE_AT
FROM
GC_MARKETING_AGREE
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
]]>
</select>
<!-- 현재 방영 중인 라이브쇼핑 확인 쿼리 -->
<select id="selectCurrentLiveShopping" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
CASE
WHEN EXISTS (
SELECT 1
FROM GC_BENEFIT b
JOIN GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
WHERE b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND b.BNF_DV_CD = '070' -- 라이브쇼핑 혜택 구분 코드
AND b.USE_AT = 'Y' -- 사용 중인 혜택만
AND c.CN_BGN_DT <= NOW() -- 현재 시간이 방송 시작 시간 이후
AND c.CN_END_DT >= NOW() -- 현재 시간이 방송 종료 시간 이전
) THEN 'Y'
ELSE 'N'
END AS IS_LIVE_ON_AIR -- 라이브쇼핑 방영 중 여부
]]>
</select>
<!-- 새로 시작한 비상시적 이벤트 조회 쿼리 -->
<select id="selectNewEvents" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 설정 고유번호
b.BNF_DV_CD, -- 혜택 구분 코드
b.BNF_SJ, -- 혜택 제목
b.BNF_BGN_DT, -- 혜택 시작 일시
b.BNF_END_DT -- 혜택 종료 일시
FROM
GC_BENEFIT b
WHERE
b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND b.USE_AT = 'Y' -- 사용 중인 혜택만
AND b.BNF_DV_CD NOT IN ('010', '020') -- 출석체크, 만보기 제외
AND b.BNF_BGN_DT <= NOW() -- 현재 시간이 혜택 시작 시간 이후
AND b.BNF_END_DT >= NOW() -- 현재 시간이 혜택 종료 시간 이전
AND DATEDIFF(NOW(), b.BNF_BGN_DT) <= 1 -- 시작한지 7일 이내의 이벤트
ORDER BY
b.BNF_BGN_DT DESC -- 최근에 시작한 순으로 정렬
]]>
</select>
<!-- 참여했거나 혜택 지급 완료된 이벤트 조회 쿼리 -->
<select id="selectParticipatedEvents" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT DISTINCT
b.BNF_INNB, -- 혜택 설정 고유번호
b.BNF_DV_CD, -- 혜택 구분 코드
b.BNF_SJ, -- 혜택 제목
p.BNF_PRT_DT, -- 혜택 참여 일시
CASE
WHEN r.BNF_RCV_INNB IS NOT NULL THEN 'Y'
ELSE 'N'
END AS REWARD_RECEIVED -- 보상 수령 여부
FROM
GC_BENEFIT b
JOIN
GC_BENEFIT_PARTCPTN p ON b.BNF_INNB = p.BNF_INNB
LEFT JOIN
GC_BENEFIT_RECEIPT r ON p.BNF_PRT_INNB = r.BNF_PRT_INNB
WHERE
b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND p.MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND p.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND b.BNF_DV_CD != '020' -- 만보기 제외 (참여완료 의미 없음)
AND b.BNF_DV_CD != '040' -- 룰렛 제외 (참여완료 의미 없음)
AND b.BNF_END_DT >= NOW() -- 아직 종료되지 않은 이벤트만
AND DATE(p.BNF_PRT_DT) = CURRENT_DATE() -- 모든 혜택에 대해 오늘 참여한 것만 포함
ORDER BY
p.BNF_PRT_DT DESC -- 최근 참여 순으로 정렬
]]>
</select>
<!-- QR 이벤트 혜택 설정 조회 -->
<select id="selectQrEventBenefit" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 고유 번호
b.BNF_SJ, -- 혜택 제목
b.USE_AT, -- 사용여부
b.BNF_WORDS_CN, -- 혜택 안내 문구
b.BNF_BGN_DT, -- 진행기간 시작일시
b.BNF_END_DT -- 진행기간 종료일시
FROM
GC_BENEFIT b
WHERE
b.BNF_DV_CD = '150' -- QR코드 이벤트 혜택 구분 코드
AND b.USE_AT = 'Y' -- 사용 중인 혜택만
AND b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT <= NOW()) -- 시작일 체크
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT >= NOW()) -- 종료일 체크
ORDER BY
b.BNF_INNB DESC -- 최신 혜택 우선
]]>
</select>
<!-- QR 이벤트 참여 정보 저장 -->
<insert id="insertQrEventParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" useGeneratedKeys="true" keyProperty="bnfPrtInnb" keyColumn="BNF_PRT_INNB">
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB, -- 혜택 고유 번호
BNF_PRT_DT, -- 혜택 참여 일시
MBR_INNB, -- 회원 고유 번호
MBR_DV_CD, -- 회원 구분 코드
STR_INNB, -- 매장 고유번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
)
VALUES (
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{strInnb},
#{mbrInnb},
NOW()
)
</insert>
<!-- QR 이벤트 보상 정보 조회 -->
<select id="selectQrEventReward" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
br.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.MLG_RWD_AMT, -- 마일리지 보상 금액
br.COUPON_INNB, -- 쿠폰 고유 번호
COALESCE(cs.COUPON_SNDNG_NM, br.ITM_NM) AS ITM_NM -- 쿠폰 이름 (쿠폰발송명 우선, 없으면 표시명)
FROM
GC_BENEFIT_REWARD br
LEFT JOIN GC_COUPON_SNDNG cs ON br.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
WHERE
<if test="bnfInnb != null and bnfInnb != ''">
br.BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
</if>
AND br.BNF_RWD_CATE_DV_CD = '15010' -- QR코드 이벤트 보상 코드
ORDER BY
br.MLG_RWD_AMT DESC -- 마일리지 높은 순으로 정렬
</select>
<!-- QR 이벤트 보상 영수증 저장 -->
<insert id="insertQrEventRewardReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.bnftMain.vo.BOBnftMainVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
INSERT INTO GC_BENEFIT_RECEIPT
(
BNF_RCV_INNB, -- 혜택 보상수령 고유 번호
BNF_PRT_INNB, -- 혜택 참여 고유 번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 보상 금액
COUPON_INNB, -- 쿠폰 고유 번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
)
VALUES
(
#{bnfRcvInnb},
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{mbrInnb},
NOW()
)
</insert>
</mapper>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,201 @@
<?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="com.wb.domainserver.domain.gcone.bnft.conrev.mapper.BOConrevMapper">
<!-- 베스트 리뷰 목록 조회 -->
<select id="selectBestReviewList" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
b.BNF_INNB,
b.BNF_SJ,
b.BNF_WORDS_CN,
b.USE_AT,
b.BNF_BGN_DT,
b.BNF_END_DT,
c.CN_SJ,
c.CN_DC,
c.LINK_URL,
c.IMG_FIL_COURS,
c.IMG_FIL_NM,
c.TME_SECND,
CONCAT(SUBSTRING(c.MBR_NM, 1, 4), '***') MBR_NM,
c.WORDS_CN,
r.MLG_RWD_AMT
FROM
GC_BENEFIT b
JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
JOIN
GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
WHERE
b.BNF_DV_CD = '090' -- 베스트 리뷰보기 코드
AND b.USE_AT = 'Y'
AND (b.BNF_BGN_DT IS NULL OR b.BNF_BGN_DT &lt;= NOW())
AND (b.BNF_END_DT IS NULL OR b.BNF_END_DT &gt;= NOW())
AND b.SOPMAL_CD = #{sopmalCd}
ORDER BY
b.BNF_INNB DESC
<!-- LIMIT #{pageSize} OFFSET #{offset} -->
</select>
<!-- 리뷰 상세 정보 조회 -->
<select id="selectReviewDetail" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
b.BNF_INNB,
b.BNF_SJ,
c.CN_SJ AS GOODS_NM,
c.CN_DC AS REVIEW_CONTENT,
c.LINK_URL AS REVIEW_LINK,
c.IMG_FIL_COURS,
c.IMG_FIL_NM,
c.TME_SECND,
c.MBR_NM AS REVIEWER_NAME,
r.MLG_RWD_AMT
FROM
GC_BENEFIT b
JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
JOIN
GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
WHERE
b.BNF_INNB = #{bnfInnb}
</select>
<!-- 베스트 리뷰 보기 마일리지 적립 여부 확인 -->
<select id="checkConrevMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="int">
<![CDATA[
SELECT
COUNT(*) -- 적립 건수
FROM
GC_BENEFIT_PARTCPTN p
JOIN
GC_BENEFIT_RECEIPT r ON p.BNF_PRT_INNB = r.BNF_PRT_INNB
WHERE
p.BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호
AND
p.MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND
p.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
]]>
</select>
<!-- 베스트 리뷰 보기 보상 정보 조회 -->
<select id="selectConrevRewardInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="java.lang.Integer">
<![CDATA[
SELECT
MLG_RWD_AMT -- 마일리지 보상 금액
FROM
GC_BENEFIT gb
LEFT JOIN GC_BENEFIT_REWARD gbr
ON gb.BNF_INNB = gbr.BNF_INNB
WHERE
BNF_RWD_CATE_DV_CD = '09010' -- 베스트리뷰보기 보상 코드
AND gb.BNF_INNB = #{bnfInnb}
AND gb.USE_AT = 'Y'
]]>
</select>
<!-- 리뷰 시간 정보 조회 -->
<select id="selectReviewTime" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="java.lang.Integer">
<![CDATA[
SELECT
TME_SECND -- 시간(초)
FROM
GC_BENEFIT_CONTENT
WHERE
BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호
]]>
</select>
<!-- 베스트 리뷰 보기 참여 정보 삽입 -->
<insert id="insertReviewParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{paidLeafCnt},
#{regusr},
NOW()
)
]]>
</insert>
<!-- 초록잎 지급량 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '090' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 베스트 리뷰 보기 마일리지 적립 정보 삽입 -->
<insert id="insertMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
SELECT
#{bnfRcvInnb},
latest_participation.BNF_PRT_INNB,
'09010', -- 베스트리뷰보기 보상 코드
'010', -- 마일리지 보상 상품 코드
#{mlgRwdAmt},
#{mbrInnb},
NOW()
FROM (
SELECT BNF_PRT_INNB
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
ORDER BY BNF_PRT_DT DESC
LIMIT 1
) AS latest_participation
]]>
</insert>
<!-- 베스트리뷰 안내문 조회 -->
<select id="selectBestReviewGuidance" parameterType="com.wb.domainserver.domain.gcone.bnft.conrev.vo.BOConrevVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_GDCC_INNB, -- 혜택 안내문 고유번호
BNF_DV_CD, -- 혜택 구분코드
SOPMAL_CD, -- 쇼핑몰코드
WORDS_CN_1, -- 안내문 1
WORDS_CN_2, -- 안내문 2
WORDS_CN_3 -- 안내문 3
FROM
GC_BENEFIT_GDCC
WHERE
BNF_DV_CD = '090' -- 베스트리뷰 구분코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰코드
]]>
</select>
</mapper>

View File

@@ -0,0 +1,644 @@
<?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="com.wb.domainserver.domain.gcone.bnft.cpslmkn.mapper.BOCpslmknMapper">
<!-- 캡슐만들기 제품목록 조회 -->
<select id="selectRewardProductList" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
b.BNF_INNB, -- 혜택 설정 고유번호
c.CN_SJ, -- 제품명
c.CN_DC, -- 제품 한줄소개
c.LINK_URL, -- 구매 URL
c.IMG_FIL_COURS, -- 썸네일 이미지 파일 경로
c.IMG_FIL_NM, -- 썸네일 이미지 파일명
r.RWD_CND_CNT, -- 필요한 초록잎 개수
b.USE_AT, -- 사용 여부
c.VALID_DT, -- 유효 날짜
r.MLG_RWD_AMT, -- 마일리지 보상 금액
r.COUPON_INNB, -- 쿠폰 고유번호
#{sopmalCd} -- 쇼핑몰 코드
FROM
GC_BENEFIT b
INNER JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
INNER JOIN
GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
WHERE
b.BNF_DV_CD = '050' -- 캡슐만들기 혜택 구분 코드
AND b.USE_AT = 'Y' -- 사용 중인 혜택만 조회
AND b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
ORDER BY
c.CN_SJ ASC -- 제품명 기준 오름차순 정렬
</select>
<!-- 캡슐만들기 게임 안내 조회 -->
<select id="selectImportantNotice" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
WORDS_CN_1 AS NOTICE_1,
WORDS_CN_2 AS NOTICE_2,
WORDS_CN_3 AS NOTICE_3
FROM GC_BENEFIT_GDCC
WHERE BNF_DV_CD = '050' -- 캡슐만들기의 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!--이전 진행 상황 체크 -->
<select id="checkPreviousProgress" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
gbcs.BNF_STTUS_INNB, -- 상태 고유번호 반환
gbcs.PROGRS_AT,
gbcs.BNF_INNB,
gbcs.PROGRS_STEP, -- 현재 단계도 반환
gbcs.TOT_USE_LEAF_CNT -- 사용된 초록잎도 반환
FROM
GC_BENEFIT gb
LEFT JOIN
GC_BENEFIT_CPSLMKN_STTUS gbcs
ON gb.BNF_INNB = gbcs.BNF_INNB
WHERE
gbcs.MBR_INNB = #{mbrInnb}
AND gbcs.MBR_DV_CD = #{mbrDvCd}
AND gbcs.PROGRS_AT = 'Y' -- 진행 중인 게임만
AND gb.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND gb.USE_AT = 'Y'
AND gb.BNF_INNB = #{bnfInnb} -- 현재 혜택만 조회
ORDER BY gbcs.REGIST_DT DESC -- 최신 게임 우선
LIMIT 1 -- 하나만 조회
</select>
<!--필요한 초록잎 개수 조회 -->
<select id="selectProductInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
r.RWD_CND_CNT -- 필요한 초록잎 개수
FROM
GC_BENEFIT_REWARD r
WHERE
r.BNF_INNB = #{bnfInnb}
</select>
<!-- 게임 진행 현황 -->
<select id="selectCpslmknGameStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PROGRS_STEP, -- 진행 단계
TOT_USE_LEAF_CNT, -- 총 사용 초록잎 개수
BNF_STTUS_INNB -- 게임 상태 고유번호
FROM
GC_BENEFIT_CPSLMKN_STTUS
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND BNF_STTUS_INNB = #{bnfSttusInnb}
AND PROGRS_AT = 'Y'
</select>
<!-- 보유 초록잎 조회 -->
<select id="selectOwnedLeafCount" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="int">
SELECT
COALESCE(
(SELECT SUM(PRT_LEAF_CNT)
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}),
0
) -
COALESCE(
(SELECT SUM(USE_LEAF_CNT)
FROM GC_BENEFIT_CPSLMKN_USELEAF
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}),
0
) AS owned_leaf_count
</select>
<!-- 진행 상태 업데이트 -->
<update id="updateProgressStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
UPDATE GC_BENEFIT_CPSLMKN_STTUS
SET
PROGRS_STEP = #{progrsStep}, -- 진행 단계
TOT_USE_LEAF_CNT = #{totUseLeafCnt},-- 총 사용 초록잎 개수
UPDT_DT = NOW() -- 수정 일시
WHERE
BNF_STTUS_INNB = #{bnfSttusInnb} -- 고유번호만으로 조건 단순화
AND PROGRS_AT = 'Y' -- 진행 중인 게임만 (안전장치)
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
</update>
<!-- 진행 상태 삽입 -->
<insert id="insertProgressStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
INSERT INTO GC_BENEFIT_CPSLMKN_STTUS (
BNF_INNB, -- 혜택 설정 고유번호
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PROGRS_AT, -- 진행 여부
PROGRS_STEP, -- 진행 단계
TOT_USE_LEAF_CNT, -- 총 사용 초록잎 개수
REGIST_DT, -- 등록 일시
UPDT_DT -- 수정 일시
) VALUES (
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
'Y',
#{progrsStep},
#{totUseLeafCnt},
NOW(),
NOW()
)
</insert>
<!-- 초록잎 사용 내역 저장 -->
<insert id="insertLeafUsage" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
INSERT INTO GC_BENEFIT_CPSLMKN_USELEAF (
BNF_INNB, -- 혜택 설정 고유번호
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
USE_LEAF_CNT, -- 사용 초록잎 개수
PROGRS_STEP, -- 진행 단계
REGIST_DT -- 등록 일시
) VALUES (
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
#{useLeafCnt},
#{progrsStep},
NOW()
)
</insert>
<!-- 진행 상태 저장 또는 업데이트 -->
<insert id="upsertProgressStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
INSERT INTO GC_BENEFIT_CPSLMKN_STTUS (
BNF_INNB, -- 혜택 설정 고유번호
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PROGRS_AT, -- 진행 여부
PROGRS_STEP, -- 진행 단계
TOT_USE_LEAF_CNT, -- 총 사용 초록잎 개수
REGIST_DT, -- 등록 일시
UPDT_DT -- 수정 일시
) VALUES (
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
'Y',
#{progrsStep},
#{totUseLeafCnt},
NOW(),
NOW()
) ON DUPLICATE KEY UPDATE
PROGRS_STEP = #{progrsStep},
TOT_USE_LEAF_CNT = #{totUseLeafCnt},
UPDT_DT = NOW()
</insert>
<!-- 현재 진행 상태와 선택한 보상 확인 -->
<select id="selectCurrentProgress" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
s.PROGRS_STEP, -- 현재 단계
s.TOT_USE_LEAF_CNT, -- 총 사용 초록잎 개수
r.BNF_RWD_GODS_DV_CD, -- 선택한 보상 상품 구분 코드
c.CN_SJ, -- 제품명
c.CN_DC, -- 제품 설명
b.BNF_WORDS_CN -- 중요 사항 안내
FROM
GC_BENEFIT_CPSLMKN_STTUS s
JOIN
GC_BENEFIT_REWARD r ON s.BNF_INNB = r.BNF_INNB
JOIN
GC_BENEFIT_CONTENT c ON s.BNF_INNB = c.BNF_INNB
JOIN
GC_BENEFIT b ON s.BNF_INNB = b.BNF_INNB
WHERE
s.MBR_INNB = #{mbrInnb}
AND
s.MBR_DV_CD = #{mbrDvCd}
AND
s.BNF_INNB = #{bnfInnb}
AND s.PROGRS_AT = 'Y'
</select>
<!-- 모달 데이터 조회 -->
<select id="selectProgressModalData" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
s.PROGRS_STEP, -- 현재 진행 단계
s.TOT_USE_LEAF_CNT, -- 총 사용된 초록잎 개수
r.RWD_CND_CNT, -- 필요한 총 초록잎 개수
c.CN_SJ, -- 선물 제목
c.CN_DC, -- 선물 설명
c.IMG_FIL_COURS, -- 선물 이미지 URL
b.BNF_WORDS_CN -- 중요 공지사항
FROM
GC_BENEFIT_CPSLMKN_STTUS s
JOIN GC_BENEFIT_REWARD r ON s.BNF_INNB = r.BNF_INNB
JOIN GC_BENEFIT_CONTENT c ON s.BNF_INNB = c.BNF_INNB
JOIN GC_BENEFIT b ON s.BNF_INNB = b.BNF_INNB
WHERE
s.MBR_INNB = #{mbrInnb}
AND s.MBR_DV_CD = #{mbrDvCd}
AND s.BNF_INNB = #{bnfInnb}
AND s.PROGRS_AT = 'Y'
</select>
<!-- 캡슐 만들기 알림 설정 정보 조회 -->
<select id="selectCpslmknSettingsInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
AGRE_AT, -- 동의 여부
BNF_INNB -- 혜택 설정 고유번호
FROM
GC_BENEFIT_AGREE
WHERE
MBR_INNB = #{mbrInnb}
AND
MBR_DV_CD = #{mbrDvCd}
AND
BNF_DV_CD = '050' -- 캡슐만들기(050) 혜택 코드
AND
BNF_AGRE_DV_CD = '010' -- 알림동의(010) 코드
AND
SOPMAL_CD = #{sopmalCd}
</select>
<!-- 알림 설정 저장 -->
<insert id="upsertNotificationSetting" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰 코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
BNF_INNB, -- 혜택 설정 고유번호
AGRE_AT, -- 동의 여부
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{sopmalCd},
#{mbrInnb},
#{mbrDvCd},
'050', -- 캡슐만들기(050) 혜택 코드
'010', -- 알림동의(010) 코드
#{bnfInnb},
#{agreAt},
#{mbrInnb},
NOW()
) ON DUPLICATE KEY UPDATE
AGRE_AT = #{agreAt},
REGUSR = #{mbrInnb},
REGIST_DT = NOW()
</insert>
<!-- 초록잎 생성, 사용 내역 조회 (최근 6개월) -->
<select id="selectLeafHistory" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT * FROM (
-- 초록잎 생성 내역 (혜택 참여)
SELECT
'CREATE' AS action_type,
CASE b.BNF_DV_CD
WHEN '010' THEN '출석체크'
WHEN '020' THEN '만보기'
WHEN '030' THEN '행운복권'
WHEN '040' THEN '룰렛게임'
WHEN '050' THEN '캡슐만들기 (퍼즐맞추기)'
WHEN '060' THEN '이벤트보기'
WHEN '070' THEN '라이브쇼핑 참여'
WHEN '080' THEN '할인소식 공유'
WHEN '090' THEN '베스트 리뷰보기'
WHEN '100' THEN '섭취챌린지'
WHEN '110' THEN 'GCpay 가입'
WHEN '120' THEN '관심건강분야 설정'
WHEN '130' THEN 'OX퀴즈'
WHEN '140' THEN '모바일스탬프'
WHEN '150' THEN 'QR코드 이벤트'
WHEN '900' THEN '구매확정'
ELSE '기타'
END AS event_name,
DATE_FORMAT(p.BNF_PRT_DT, '%Y-%m-%d %H:%i') AS action_datetime,
p.PRT_LEAF_CNT AS leaf_count,
p.REGIST_DT AS reg_datetime
FROM
GC_BENEFIT_PARTCPTN p
JOIN
GC_BENEFIT b ON p.BNF_INNB = b.BNF_INNB
WHERE
p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.PRT_LEAF_CNT &gt; 0
AND p.BNF_PRT_DT &gt;= DATE_SUB(NOW(), INTERVAL 6 MONTH)
UNION ALL
-- 초록잎 사용 내역 (캡슐 만들기)
SELECT
'USE' AS action_type,
'넣기' AS event_name,
DATE_FORMAT(u.REGIST_DT, '%Y-%m-%d %H:%i') AS action_datetime,
(u.USE_LEAF_CNT * -1) AS leaf_count, -- 사용은 음수로 표시
u.REGIST_DT AS reg_datetime
FROM
GC_BENEFIT_CPSLMKN_USELEAF u
WHERE
u.MBR_INNB = #{mbrInnb}
AND u.MBR_DV_CD = #{mbrDvCd}
AND u.REGIST_DT &gt;= DATE_SUB(NOW(), INTERVAL 6 MONTH)
) history
ORDER BY
reg_datetime DESC
LIMIT
#{offset}, #{limit}
</select>
<!-- 혜택 고유번호로 보상 정보 조회 -->
<select id="selectRewardInfoByBnfInnb" parameterType="long" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB -- 쿠폰고유번호
-- 필요하다면 다른 보상 관련 컬럼도 추가 (예: ITM_NM)
FROM
GC_BENEFIT_REWARD
WHERE
BNF_INNB = #{bnfInnb}
-- 캡슐 만들기 관련 보상은 하나만 존재한다고 가정.
-- 만약 여러 개가 있을 수 있다면 추가적인 조건이나 LIMIT 필요
</select>
<!-- 캡슐만들기 5단계 완료 시 혜택 참여 정보 기록 -->
<insert id="insertBenefitParticipationOnCompletion" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시 (완료 시점)
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
REGIST_DT -- 등록 일시
) VALUES (
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
NOW()
)
</insert>
<!-- 캡슐만들기 완료 후 보상 수령 내역 기록 -->
<insert id="insertBenefitReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB, -- 쿠폰 고유번호
GOODS_INNB, -- 상품 고유번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfRcvInnb},
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{goodsInnb},
#{regusr},
NOW()
)
</insert>
<!-- 특정 혜택의 현재 사용 가능 여부 확인 -->
<select id="checkBenefitAvailability" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="int">
SELECT
COUNT(*)
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '050'
AND USE_AT = 'Y'
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건 추가
AND (BNF_BGN_DT IS NULL OR BNF_BGN_DT &lt;= NOW()) -- 시작일이 없거나 시작일 이후
AND (BNF_END_DT IS NULL OR BNF_END_DT &gt;= NOW()) -- 종료일이 없거나 종료일 이전
</select>
<!-- 같은 날짜의 기존 참여 정보 조회 -->
<select id="selectTodayParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_PRT_INNB,
PRT_LEAF_CNT
FROM
GC_BENEFIT_PARTCPTN
WHERE
BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = DATE(NOW())
ORDER BY BNF_PRT_DT DESC
LIMIT 1
</select>
<!-- 참여 정보 업데이트 (초록잎 추가) -->
<update id="updateBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
UPDATE GC_BENEFIT_PARTCPTN
SET
PRT_LEAF_CNT = PRT_LEAF_CNT + #{useLeafCnt},
STEP_CNT = #{progrsStep},
UPDUSR = #{regusr}, <!-- 명시적으로 updusr 사용 -->
UPDT_DT = NOW()
WHERE
BNF_PRT_INNB = #{bnfPrtInnb}
</update>
<!-- 새 참여 정보 삽입 -->
<insert id="insertBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" useGeneratedKeys="true" keyProperty="bnfPrtInnb">
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수
STEP_CNT, -- 걸음수
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{useLeafCnt},
#{progrsStep}, <!-- 현재 진행 단계를 걸음수로 사용 -->
#{regusr}, <!-- 명시적으로 regusr 사용 -->
NOW()
)
</insert>
<!-- 보상 정보 조회 -->
<select id="selectRewardInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
r.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
r.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
r.MLG_RWD_AMT, -- 마일리지 금액
r.COUPON_INNB -- 쿠폰 고유번호
FROM
GC_BENEFIT_REWARD r
WHERE
r.BNF_INNB = #{bnfInnb}
LIMIT 1
</select>
<!-- 캡슐만들기 정보 조회 - 진행 상태가 없어도 기본 안내 정보 반환 -->
<select id="selectCapsuleGameInfo"
parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
COALESCE(s.PROGRS_STEP, 0) AS currentProgressStep, -- 현재 진행 단계 (없으면 0)
c.CN_SJ AS rewardProductName, -- 현재 리워드 제품 명
c.IMG_FIL_COURS AS productImagePath, -- 제품 이미지 경로
g.WORDS_CN_1 AS notice1, -- 캡슐만들기 게임 안내 1
g.WORDS_CN_2 AS notice2, -- 캡슐만들기 게임 안내 2
g.WORDS_CN_3 AS notice3 -- 캡슐만들기 게임 안내 3
FROM
GC_BENEFIT b
INNER JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
LEFT JOIN
GC_BENEFIT_GDCC g ON b.BNF_DV_CD = g.BNF_DV_CD AND b.SOPMAL_CD = g.SOPMAL_CD
LEFT JOIN
GC_BENEFIT_CPSLMKN_STTUS s ON b.BNF_INNB = s.BNF_INNB
AND s.MBR_INNB = #{mbrInnb}
AND s.MBR_DV_CD = #{mbrDvCd}
AND s.PROGRS_AT = 'Y'
WHERE
b.BNF_DV_CD = '050' -- 캡슐만들기 혜택 구분 코드
AND b.USE_AT = 'Y' -- 사용 중인 혜택만 조회
AND b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (#{bnfInnb} IS NULL OR b.BNF_INNB = #{bnfInnb}) -- 특정 혜택 번호가 있으면 해당 혜택만
LIMIT 1
</select>
<!-- 캡슐 만들기 게임 리셋 : 진행 중인 게임만 리셋 (중간에 그만두고 다시 할 때) -->
<update id="resetCapsuleGame" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
UPDATE GC_BENEFIT_CPSLMKN_STTUS
SET
PROGRS_AT = 'N',
UPDT_DT = NOW()
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND PROGRS_AT = 'Y' -- 진행 중인 게임만
AND BNF_STTUS_INNB = #{bnfSttusInnb} -- 정확한 게임 식별
AND ( -- 완료되지 않은 게임만 리셋 가능
PROGRS_STEP &lt; 5
OR TOT_USE_LEAF_CNT &lt; (
SELECT RWD_CND_CNT
FROM GC_BENEFIT_REWARD
WHERE BNF_INNB = #{bnfInnb}
)
)
</update>
<!-- 초록잎을 받을 수 있는 이벤트 목록 조회 -->
<select id="selectLeafEventList" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
MAX(b.BNF_INNB) AS BNF_INNB, -- 혜택 설정 고유번호 (최신)
b.BNF_DV_CD, -- 혜택 구분 코드
b.SOPMAL_CD, -- 쇼핑몰 코드
MAX(cp.PYMNT_CNT) AS PYMNT_CNT, -- 지급 초록잎 개수
MAX(cp.SPECIAL_AT) AS SPECIAL_AT, -- 스페셜 여부 (Y/N)
MAX(m.MENU_SJ_1) AS BNF_SJ, -- 메뉴 제목 1
MAX(m.MENU_SJ_2) AS MENU_SJ_2, -- 메뉴 제목 2
MAX(m.SORT_ORDR) AS SORT_ORDR -- 정렬순서
FROM
GC_BENEFIT b
INNER JOIN
GC_BENEFIT_CPSLMKN cp ON b.BNF_DV_CD = cp.BNF_DV_CD AND b.SOPMAL_CD = cp.SOPMAL_CD
LEFT JOIN
GC_BENEFIT_MANAGE_MENU m ON b.BNF_DV_CD = m.BNF_DV_CD AND b.SOPMAL_CD = m.SOPMAL_CD
WHERE
b.SOPMAL_CD = #{sopmalCd}
AND (b.BNF_DV_CD = '120' OR b.USE_AT = 'Y') -- 관심분야설정은 USE_AT 체크 제외
AND cp.INDICT_AT = 'Y'
AND (b.BNF_DV_CD = '120' OR (b.BNF_BGN_DT &lt;= NOW() AND b.BNF_END_DT &gt;= NOW())) -- 관심분야설정은 기간 체크 제외
AND (m.INDICT_AT IS NULL OR m.INDICT_AT = 'Y')
GROUP BY
b.BNF_DV_CD, b.SOPMAL_CD -- BNF_DV_CD 기준으로만 그룹핑
ORDER BY
MAX(cp.SPECIAL_AT) DESC, -- 스페셜 이벤트를 먼저 표시
MAX(m.SORT_ORDR) ASC, -- 메뉴 정렬순서 적용
MAX(b.BNF_INNB) -- 그 다음 일반 순서대로
</select>
<!-- 초록잎 이벤트 총 지급 개수 조회 -->
<select id="selectTotalLeafEventPaymentCount" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="int">
SELECT
COALESCE(SUM(cp.PYMNT_CNT), 0) AS totalPaymentCount
FROM
GC_BENEFIT b
INNER JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
INNER JOIN
GC_BENEFIT_CPSLMKN cp ON b.BNF_DV_CD = cp.BNF_DV_CD AND b.SOPMAL_CD = cp.SOPMAL_CD
WHERE
b.SOPMAL_CD = #{sopmalCd}
AND b.USE_AT = 'Y'
AND cp.INDICT_AT = 'Y'
AND b.BNF_BGN_DT &lt;= NOW() AND b.BNF_END_DT &gt;= NOW()
</select>
<!-- 캡슐 게임 완료 처리 전용 메소드 -->
<update id="completeGame" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO">
UPDATE GC_BENEFIT_CPSLMKN_STTUS
SET
PROGRS_AT = 'N', -- 완료 상태로 변경
PROGRS_STEP = 5, -- 완료 단계로 명시적 설정
UPDT_DT = NOW()
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND PROGRS_AT = 'Y' -- 진행 중인 게임만
AND BNF_STTUS_INNB = #{bnfSttusInnb} -- 정확한 게임 식별
AND PROGRS_STEP &gt;= 5 -- 5단계 이상
AND TOT_USE_LEAF_CNT &gt;= ( -- 필요한 초록잎을 모두 사용한 경우만
SELECT RWD_CND_CNT
FROM GC_BENEFIT_REWARD
WHERE BNF_INNB = #{bnfInnb}
)
</update>
<!-- 완료된 게임 확인 (새 게임 시작 가능 여부 판단용) -->
<select id="checkCompletedGame" parameterType="com.wb.domainserver.domain.gcone.bnft.cpslmkn.vo.BOCpslmknVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
gbcs.BNF_STTUS_INNB,
gbcs.PROGRS_AT,
gbcs.BNF_INNB,
gbcs.PROGRS_STEP,
gbcs.TOT_USE_LEAF_CNT,
gbcs.REGIST_DT
FROM
GC_BENEFIT gb
LEFT JOIN
GC_BENEFIT_CPSLMKN_STTUS gbcs ON gb.BNF_INNB = gbcs.BNF_INNB
WHERE
gbcs.MBR_INNB = #{mbrInnb}
AND gbcs.MBR_DV_CD = #{mbrDvCd}
AND gb.SOPMAL_CD = #{sopmalCd}
AND gb.USE_AT = 'Y'
AND gb.BNF_DV_CD = '050' -- 캡슐만들기 혜택
ORDER BY gbcs.REGIST_DT DESC
LIMIT 1
</select>
</mapper>

View File

@@ -0,0 +1,129 @@
<?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="com.wb.domainserver.domain.gcone.bnft.discshar.mapper.BODiscsharMapper">
<!-- 할인소식 공유 혜택 정보 조회 -->
<select id="selectDiscsharBenefitInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.discshar.vo.BODiscsharVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 설정 고유번호
b.SOPMAL_CD, -- 쇼핑몰코드
b.BNF_DV_CD, -- 혜택 구분 코드
b.BNF_SJ, -- 혜택 제목
b.BNF_BGN_DT, -- 진행기간 시작일시
b.BNF_END_DT, -- 진행기간 종료일시
b.SCR_REPRSNT_IMG, -- 화면 대표 이미지
b.SCR_REPRSNT_LINK_URL, -- 화면 대표 링크 URL
b.BNF_WORDS_CN, -- 혜택 안내
c.CN_SJ, -- 내용 제목 (상품명)
c.CN_DC, -- 내용 설명
c.LINK_URL, -- 링크 (구매 링크)
c.IMG_FIL_COURS, -- 이미지파일경로
c.IMG_FIL_NM, -- 이미지파일명
c.VALID_DT, -- 유효일시 (할인 유효기간)
c.TME_SECND, -- 시간(초)
c.DSCNT_UNIT_DV_CD, -- 할인구분코드
c.DSCNT_AMT, -- 할인금액
c.DSCNT_RT, -- 할인율
r.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
r.MLG_RWD_AMT -- 마일리지정보
FROM
GC_BENEFIT b
LEFT JOIN GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
LEFT JOIN GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
WHERE
b.BNF_DV_CD = '080' -- 할인소식 공유 혜택 구분 코드
AND b.USE_AT = 'Y'
ORDER BY
c.VALID_DT ASC -- 유효일시 기준 오름차순 정렬
]]>
</select>
<!-- 할인소식 공유 혜택 참여 정보 삽입 -->
<insert id="insertDiscsharBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.discshar.vo.BODiscsharVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN
(
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
VALUES
(
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{mbrInnb},
NOW()
)
]]>
</insert>
<!-- 할인소식 공유 마일리지 적립 정보 삽입 -->
<insert id="insertDiscsharMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.discshar.vo.BODiscsharVO">
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT
(
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
VALUES
(
(SELECT BNF_PRT_INNB FROM GC_BENEFIT_PARTCPTN WHERE BNF_INNB = #{bnfInnb} AND MBR_INNB = #{mbrInnb} ORDER BY BNF_PRT_DT DESC LIMIT 1),
'08010', -- 할인소식공유 보상 코드
'010', -- 마일리지 보상 상품 코드
(SELECT MLG_RWD_AMT FROM fm_benefit_reward WHERE BNF_INNB = #{bnfInnb} AND BNF_RWD_CATE_DV_CD = '08010'),
#{mbrInnb},
NOW()
)
]]>
</insert>
<!-- 할인소식 공유 마일리지 적립 여부 확인 -->
<select id="checkMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.discshar.vo.BODiscsharVO" resultType="int">
<![CDATA[
SELECT
COUNT(*) -- 적립 건수
FROM
GC_BENEFIT_RECEIPT r
JOIN
GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE
p.BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호
AND
p.MBR_INNB = #{mbrInnb} -- 회원 고유번호
]]>
</select>
<!-- 할인소식 공유 링크 정보 조회 -->
<select id="getDiscsharLinkInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.discshar.vo.BODiscsharVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 설정 고유번호
b.SCR_REPRSNT_LINK_URL, -- 화면 대표 링크 URL
c.LINK_URL, -- 상품 구매 링크
c.VALID_DT -- 유효일시 (할인 유효기간)
FROM
GC_BENEFIT b
JOIN
GC_BENEFIT_CONTENT c ON b.BNF_INNB = c.BNF_INNB
WHERE
b.BNF_INNB = #{bnfInnb}
AND b.USE_AT = 'Y'
AND b.BNF_DV_CD = '080' -- 할인소식 공유 혜택 구분 코드
]]>
</select>
</mapper>

View File

@@ -0,0 +1,175 @@
<?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="com.wb.domainserver.domain.gcone.bnft.evntview.mapper.BOEvntViewMapper">
<!-- 이벤트 보기 혜택 기본 정보 및 보상 정보 통합 조회 -->
<select id="selectEventViewBenefitInfoAndContent" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
a.BNF_INNB, -- 혜택 설정 고유번호
b.CN_DC AS EVENT_DESC, -- 내용 설명
DATE_FORMAT(b.CN_BGN_DT, '%Y-%m-%d %H:%i:%s') AS CN_BGN_DT, -- 시작일시
DATE_FORMAT(b.CN_END_DT, '%Y-%m-%d %H:%i:%s') AS CN_END_DT, -- 종료일시
b.WORDS_CN AS EVENT_DETAIL, -- 안내내용
b.IMG_FIL_COURS AS EVENT_IMG_PATH, -- 이미지파일경로
b.IMG_FIL_NM AS EVENT_IMG_NAME, -- 이미지파일명
b.TME_SECND AS LOADING_TIME, -- 시간(초)
b.LINK_URL AS EVENT_LINK_URL, -- 링크
b.CN_SJ AS EVENT_LINK_TITLE, -- 내용 제목
b.CN_DC AS EVENT_LINK_DESC, -- 내용 설명
-- 보상 정보 추가
r.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
r.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
r.MLG_RWD_AMT, -- 마일리지 금액
r.COUPON_INNB, -- 쿠폰고유번호
r.ITM_NM, -- 표시명
CASE
WHEN EXISTS (
SELECT 1
FROM GC_BENEFIT_RECEIPT rcpt
JOIN GC_BENEFIT_PARTCPTN p ON rcpt.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE p.BNF_INNB = a.BNF_INNB
AND p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
) THEN 'Y'
ELSE 'N'
END AS ACCUMULATED_YN -- 적립 완료 여부
FROM
GC_BENEFIT a -- 혜택 기본 정보 테이블
LEFT JOIN
GC_BENEFIT_CONTENT b ON a.BNF_INNB = b.BNF_INNB -- 혜택 내용설정 정보 테이블
LEFT JOIN
GC_BENEFIT_REWARD r ON a.BNF_INNB = r.BNF_INNB
AND r.BNF_RWD_CATE_DV_CD = '06010' /* 이벤트보기 보상 코드 */
WHERE
a.BNF_DV_CD = '060' /* 이벤트보기 혜택 코드 */
AND a.USE_AT = 'Y' -- 사용여부
AND NOW() BETWEEN b.CN_BGN_DT AND b.CN_END_DT -- gc_benefit_content 테이블의 기간으로 변경
AND a.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
<if test="bnfInnb != null">
AND a.BNF_INNB = #{bnfInnb} -- 특정 혜택 번호 조건
</if>
ORDER BY
a.REGIST_DT DESC -- 등록일시 기준 내림차순 정렬
</select>
<!-- 이벤트 보기 안내문 조회 -->
<select id="selectEventViewInstruction" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
WORDS_CN_2 AS WORDS_CN
FROM
GC_BENEFIT_GDCC
WHERE
BNF_DV_CD = 060
AND SOPMAL_CD = #{sopmalCd}
</select>
<!-- 초록잎 지급량 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '060' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 이벤트 보기 혜택 참여 정보 삽입 -->
<insert id="insertEventViewBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유 번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원고유번호
MBR_DV_CD, -- 회원구분코드
PRT_LEAF_CNT, -- 참여 초록잎 개수 추가
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb},
#{bnfInnb}, -- 혜택 설정 고유번호 파라미터
NOW(), -- 현재 시간
#{mbrInnb}, -- 회원고유번호 파라미터
#{mbrDvCd}, -- 회원구분코드 파라미터
#{paidLeafCnt}, -- 초록잎 개수 파라미터 추가
#{regusr}, -- 등록자 파라미터
NOW() -- 현재 시간
)
</insert>
<!-- 이벤트 보기 혜택 보상 정보 조회 -->
<select id="selectEventViewBenefitRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
r.BNF_INNB, -- 혜택 설정 고유번호
r.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
r.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
r.MLG_RWD_AMT, -- 마일리지 금액
r.COUPON_INNB, -- 쿠폰고유번호
r.ITM_NM -- 표시명
FROM
GC_BENEFIT_REWARD r -- 혜택 보상설정 정보 테이블
JOIN
GC_BENEFIT b ON r.BNF_INNB = b.BNF_INNB -- 혜택 기본 정보 테이블과 조인 추가
WHERE
r.BNF_INNB = #{bnfInnb} -- 특정 혜택 번호 조건
AND r.BNF_RWD_CATE_DV_CD = '06010' /* 이벤트보기 보상 코드 */
AND b.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건 추가
</select>
<!-- 이벤트 보기 마일리지 적립 여부 확인 -->
<select id="checkMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO" resultType="int">
SELECT
COUNT(1) -- 행 수 카운트
FROM
GC_BENEFIT_RECEIPT r -- 혜택 보상수령 내역 테이블
JOIN
GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB -- 혜택 참여 정보 테이블
WHERE
p.BNF_INNB = #{bnfInnb} -- 특정 혜택 번호 조건
AND p.MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND p.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 조건
AND r.BNF_RWD_CATE_DV_CD = '06010' -- 이벤트보기 보상 코드
</select>
<!-- 이벤트 보기 마일리지 적립 정보 삽입 -->
<insert id="insertEventViewMileageAccumulation" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO">
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb}, -- 혜택 참여 고유번호 파라미터
'06010', /* 이벤트보기 보상 코드 */
'010', -- 보상 상품 구분 코드
#{mlgRwdAmt}, -- 마일리지 금액 파라미터
#{regusr}, -- 등록자 파라미터
NOW() -- 현재 시간
)
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<!-- 이벤트 유효성 검증 (날짜 체크) -->
<select id="checkEventValidation" parameterType="com.wb.domainserver.domain.gcone.bnft.evntview.vo.BOEvntViewVO" resultType="int">
SELECT
COUNT(1) -- 유효한 이벤트 수
FROM
GC_BENEFIT a -- 혜택 기본 정보 테이블
JOIN
GC_BENEFIT_CONTENT b ON a.BNF_INNB = b.BNF_INNB -- 혜택 내용설정 정보 테이블
WHERE
a.BNF_INNB = #{bnfInnb} -- 특정 혜택 번호 조건
AND a.BNF_DV_CD = '060' /* 이벤트보기 혜택 코드 */
AND a.USE_AT = 'Y' -- 사용여부
AND NOW() BETWEEN b.CN_BGN_DT AND b.CN_END_DT -- gc_benefit_content 테이블의 기간으로 변경
AND a.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
</mapper>

View File

@@ -0,0 +1,292 @@
<?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="com.wb.domainserver.domain.gcone.bnft.hlthset.mapper.BOHlthsetMapper">
<!-- 관심건강분야 설정 기본 정보 조회 -->
<select id="selectHealthInterestBasicInfo" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
b.BNF_INNB,
r.MLG_RWD_AMT, -- 관심분야 리워드
b.BNF_WORDS_CN, -- 관심분야 안내문구
COALESCE(a.AGRE_AT, 'N') AS AGRE_AT -- 정보받기 동의 여부 (기본값: N)
FROM
GC_BENEFIT b
JOIN GC_BENEFIT_REWARD r ON b.BNF_INNB = r.BNF_INNB
AND r.BNF_RWD_CATE_DV_CD = '12010'
AND r.BNF_RWD_GODS_DV_CD = '010'
LEFT JOIN GC_BENEFIT_AGREE a ON b.BNF_INNB = a.BNF_INNB
AND a.SOPMAL_CD = #{sopmalCd}
AND a.MBR_INNB = #{mbrInnb}
AND a.MBR_DV_CD = #{mbrDvCd}
AND a.BNF_DV_CD = '120'
AND a.BNF_AGRE_DV_CD = '010'
WHERE
b.BNF_DV_CD = '120'
AND b.SOPMAL_CD = #{sopmalCd}
</select>
<!-- 관심분야 목록 조회 -->
<select id="selectInterestAreas"
parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
i.BNF_INTRST_INNB, -- 관심분야 ID
i.INTRST_NM, -- 관심분야명
i.BFE_IMG_FIL_COURS, -- 관심분야 이미지 경로
CASE WHEN pi.CHOISE_AT = 'Y' THEN 'Y' ELSE 'N' END AS CHOISE_AT -- 선택여부
FROM
GC_BENEFIT_INTEREST i
LEFT JOIN GC_BENEFIT_PARTCPTN_INTEREST pi
ON i.BNF_INTRST_INNB = pi.BNF_INTRST_INNB
AND pi.BNF_PRT_INNB = (
SELECT BNF_PRT_INNB
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
ORDER BY BNF_PRT_DT DESC
LIMIT 1
)
WHERE
i.BNF_INNB = #{bnfInnb}
AND i.USE_AT = 'Y'
ORDER BY
i.SORT_ORDR
</select>
<!-- 사용자 기존 관심분야 삭제 -->
<delete id="deleteUserInterestAreas" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO">
<![CDATA[
DELETE FROM GC_BENEFIT_PARTCPTN_INTEREST
WHERE BNF_PRT_INNB = (
SELECT BNF_PRT_INNB
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
ORDER BY BNF_PRT_DT DESC
LIMIT 1
)
]]>
</delete>
<!-- 새로운 사용자 관심분야 저장 -->
<insert id="insertUserInterestAreas" parameterType="java.util.List">
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN_INTEREST (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INTRST_INNB, -- 혜택 관심분야 고유번호
CHOISE_AT -- 선택여부
) VALUES
]]>
<foreach collection="list" item="item" separator=",">
(
#{item.bnfPrtInnb},
#{item.bnfIntrstInnb},
'Y'
)
</foreach>
</insert>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '120' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 혜택 참여 정보 삽입 (gc_benefit_partcptn) -->
<insert id="insertBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{paidLeafCnt},
#{regusr},
NOW()
)
]]>
</insert>
<!-- 사용자 관심분야 정보 수신 동의 저장 (insert 또는 update) -->
<insert id="insertUserInterestAgreement" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO">
<![CDATA[
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰 코드 (예: NC, DT)
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드 (예: GC, DT)
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드 (예: '010' : 알림동의)
BNF_INNB, -- 혜택 설정 고유번호
AGRE_AT, -- 동의 여부 (Y/N)
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{sopmalCd},
#{mbrInnb},
#{mbrDvCd},
'120',
'010',
#{bnfInnb},
#{agreAt},
#{regusr},
NOW()
)
ON DUPLICATE KEY UPDATE
AGRE_AT = VALUES(AGRE_AT),
REGUSR = VALUES(REGUSR),
REGIST_DT = NOW()
]]>
</insert>
<!-- 마일리지 적립 내역 저장 -->
<insert id="insertMileageReward" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfRcvInnb},
#{bnfPrtInnb},
'12010', -- 관심건강분야 보상 코드
'010', -- 보상상품 마일리지 코드
#{mlgRwdAmt},
#{regusr},
NOW()
)
]]>
</insert>
<!-- 사용자 관심분야 조회 -->
<select id="selectUserInterests" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
i.BNF_INTRST_INNB,
i.INTRST_NM
FROM
GC_BENEFIT_PARTCPTN_INTEREST pi
JOIN
GC_BENEFIT_INTEREST i ON pi.BNF_INTRST_INNB = i.BNF_INTRST_INNB
WHERE
pi.BNF_PRT_INNB = (
SELECT BNF_PRT_INNB
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
ORDER BY BNF_PRT_DT DESC
LIMIT 1
)
]]>
</select>
<!-- 해당 월에 마일리지 보상을 받았는지 확인 (수정된 버전) -->
<select id="hasMonthlyMileageReward" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO" resultType="boolean">
<![CDATA[
SELECT EXISTS (
SELECT 1
FROM GC_BENEFIT_RECEIPT r
JOIN GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND r.BNF_RWD_CATE_DV_CD = '12010' -- 관심건강분야 보상 코드
AND DATE_FORMAT(r.REGIST_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
)
]]>
</select>
<!-- 사용자 관심분야 저장 상태 및 마일리지 적립 여부 조회 (수정된 버전) -->
<select id="selectUserInterestSaveStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
CASE WHEN COUNT(DISTINCT pi.BNF_INTRST_INNB) > 0 THEN 'Y' ELSE 'N' END AS saved_yn,
CASE WHEN SUM(r.MLG_RWD_AMT) > 0 THEN 'Y' ELSE 'N' END AS mileage_accumulated_yn,
COALESCE(SUM(r.MLG_RWD_AMT), 0) AS MLG_RWD_AMT
FROM
GC_BENEFIT_PARTCPTN p
LEFT JOIN GC_BENEFIT_PARTCPTN_INTEREST pi ON p.BNF_PRT_INNB = pi.BNF_PRT_INNB
LEFT JOIN GC_BENEFIT_RECEIPT r ON p.BNF_PRT_INNB = r.BNF_PRT_INNB
AND r.BNF_RWD_CATE_DV_CD = '12010'
AND DATE_FORMAT(r.REGIST_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
WHERE
p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND DATE_FORMAT(p.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
]]>
</select>
<!-- 마지막 관심분야 참여 월 조회 -->
<select id="selectLastInterestParticipationMonth" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT DATE_FORMAT(MAX(BNF_PRT_DT), '%Y-%m') AS last_month
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND EXISTS (
SELECT 1
FROM GC_BENEFIT_PARTCPTN_INTEREST pi
WHERE pi.BNF_PRT_INNB = GC_BENEFIT_PARTCPTN.BNF_PRT_INNB
)
]]>
</select>
<!-- 월별 관심분야 초기화 (관심분야 데이터만 삭제) -->
<delete id="resetMonthlyInterestAreas" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO">
<![CDATA[
DELETE pi FROM GC_BENEFIT_PARTCPTN_INTEREST pi
JOIN GC_BENEFIT_PARTCPTN p ON pi.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND DATE_FORMAT(p.BNF_PRT_DT, '%Y-%m') < DATE_FORMAT(NOW(), '%Y-%m')
]]>
</delete>
<!-- 현재 월 참여 정보 조회 -->
<select id="selectCurrentMonthParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.hlthset.vo.BOHlthsetVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_PRT_INNB,
BNF_PRT_DT
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND DATE_FORMAT(BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
ORDER BY BNF_PRT_DT DESC
LIMIT 1
]]>
</select>
</mapper>

View File

@@ -0,0 +1,950 @@
<?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="com.wb.domainserver.domain.gcone.bnft.intakchl.mapper.BOIntakchlMapper">
<!-- 혜택 화면 설정 정보 조회 -->
<select id="selectIntakchlScreenInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_INNB, -- 혜택 고유 번호
SCR_REPRSNT_IMG, -- 화면 대표 이미지 경로
SCR_REPRSNT_LINK_URL, -- 화면 대표 이미지 링크 URL
SCR_RWD_IMG, -- 보상 이미지 경로
SCR_RWD_LINK_URL, -- 보상 이미지 링크 URL
BNF_WORDS_CN -- 혜택 안내 문구
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '100' -- 출석체크 혜택 구분 코드
AND USE_AT = 'Y'
AND SOPMAL_CD = #{sopmalCd}
ORDER BY
BNF_INNB -- 혜택 고유 번호로 정렬
]]>
</select>
<!-- 선택된 제품 추가 -->
<insert id="insertSelectedProducts" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
INSERT INTO GC_BENEFIT_NTKCHL (
BNF_INNB,
MBR_INNB,
MBR_DV_CD,
GOODS_INNB,
SOPMAL_CD,
BNF_NTK_STTUS_DV_CD,
NTK_CNT,
DEL_AT,
REGUSR,
REGIST_DT
)
VALUES
<foreach collection="products" item="product" separator=",">
(
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
#{product.goodsInnb},
#{sopmalCd},
'010', -- 섭취중 상태
0,
'N',
#{regusr},
NOW()
)
</foreach>
</insert>
<!-- 선택한 날짜의 전체 섭취 기록 및 총 섭취율 조회 -->
<select id="selectDailyTotalIntakeRecord" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COALESCE(total_actual, 0) AS TOTAL_ACTUAL_INTAKE, -- 실제 섭취 횟수 합계
COALESCE(total_target, 0) AS TOTAL_TARGET_INTAKE, -- 목표 섭취 횟수 합계
COALESCE(
CASE
WHEN total_target = 0 THEN 0
ELSE ROUND(total_actual * 100.0 / total_target)
END,
0
) AS OVERALL_INTAKE_RATE_PERCENTAGE -- 전체 섭취율 백분율 (NULL 방지)
FROM (
SELECT
SUM(actual_count) AS total_actual, -- 실제 섭취 횟수 합계
SUM(NTK_CNT) AS total_target -- 목표 섭취 횟수 합계
FROM (
SELECT
n.BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
n.NTK_CNT, -- 목표 섭취 횟수
COUNT(p.BNF_PRT_INNB) AS actual_count -- 실제 섭취 횟수
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN GC_BENEFIT_PARTCPTN_NTKCHL nt
ON n.BNF_NTK_INNB = nt.BNF_NTK_INNB
LEFT JOIN GC_BENEFIT_PARTCPTN p
ON nt.BNF_PRT_INNB = p.BNF_PRT_INNB
AND DATE(p.BNF_PRT_DT) = replace(#{selectedDate}, '-', '') -- 날짜 필터링
WHERE n.DEL_AT = 'N' -- 삭제되지 않은 데이터만 조회
AND n.MBR_INNB = #{mbrInnb} -- 회원 고유번호 필터링 추가
AND n.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 필터링 추가
AND n.BNF_NTK_STTUS_DV_CD = '010' -- 섭취중 상태만 조회
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb}) -- 혜택 설정 고유번호 필터링 추가
AND DATE(n.REGIST_DT) <= replace(#{selectedDate}, '-', '') -- 제품 등록일이 선택된 날짜 이전이거나 같은 경우만
GROUP BY n.BNF_NTK_INNB, n.NTK_CNT
) AS product_intake -- 제품별 섭취 정보
) AS totals
]]>
</select>
<!-- 선택한 날짜의 섭취 기록 상세 조회 (제품별) -->
<select id="selectDailyIntakeRecordsDetail" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
n.BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
n.GOODS_INNB, -- 상품 고유번호
n.NTK_CNT AS target_intake_count, -- 목표 섭취 횟수
COUNT(p.BNF_PRT_INNB) AS today_intake_count, -- 오늘 실제 섭취 횟수
CASE
WHEN COUNT(p.BNF_PRT_INNB) >= n.NTK_CNT THEN 'Y'
ELSE 'N'
END AS goal_achieved -- 목표 달성 여부 ('Y': 달성, 'N': 미달성)
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN GC_BENEFIT_PARTCPTN_NTKCHL nt ON n.BNF_NTK_INNB = nt.BNF_NTK_INNB
LEFT JOIN GC_BENEFIT_PARTCPTN p ON nt.BNF_PRT_INNB = p.BNF_PRT_INNB
AND DATE(p.BNF_PRT_DT) = #{selectedDate}
WHERE n.DEL_AT = 'N'
AND n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb})
AND n.SOPMAL_CD = #{sopmalCd}
AND n.BNF_NTK_STTUS_DV_CD = '010' -- 섭취중 상태만 조회 (추가)
GROUP BY n.BNF_NTK_INNB, n.GOODS_INNB, n.NTK_CNT
ORDER BY n.BNF_NTK_INNB
]]>
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '100' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 마일리지 보상 금액 조회 -->
<select id="getMileageRewardAmount" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="java.lang.Double">
SELECT CAST(MLG_RWD_AMT AS DECIMAL(12,2)) -- 마일리지 금액
FROM GC_BENEFIT_REWARD
WHERE BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호
AND BNF_RWD_CATE_DV_CD = '10010' -- 보상 항목 구분 코드 (섭취챌린지 1일 보상)
AND BNF_RWD_GODS_DV_CD = '010' -- 보상 상품 구분 코드 (마일리지)
</select>
<!-- 오늘 이미 마일리지를 적립했는지 확인 -->
<select id="checkMileageAlreadyAwarded" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="boolean">
SELECT EXISTS (
SELECT 1
FROM GC_BENEFIT_RECEIPT r
JOIN GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE p.BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호
AND p.MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND p.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 추가
AND DATE(p.BNF_PRT_DT) = CURDATE() -- 혜택 참여 일시
AND r.BNF_RWD_CATE_DV_CD = '10010' -- 보상 항목 구분 코드 (섭취챌린지 1일 보상)
)
</select>
<!-- 일일 섭취 목표 달성 여부 확인 -->
<select id="checkDailyGoalAchievement" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="boolean">
SELECT
CASE
WHEN COALESCE(SUM(daily_actual), 0) &gt;= COALESCE(SUM(daily_target), 0)
AND COALESCE(SUM(daily_target), 0) &gt; 0 THEN true
ELSE false
END AS goal_achieved
FROM (
SELECT
n.BNF_NTK_INNB,
n.NTK_CNT AS daily_target,
COUNT(p.BNF_PRT_INNB) AS daily_actual
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN GC_BENEFIT_PARTCPTN_NTKCHL nt ON n.BNF_NTK_INNB = nt.BNF_NTK_INNB
LEFT JOIN GC_BENEFIT_PARTCPTN p ON nt.BNF_PRT_INNB = p.BNF_PRT_INNB
AND DATE(p.BNF_PRT_DT) = CURDATE()
WHERE n.BNF_INNB = #{bnfInnb}
AND n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.SOPMAL_CD = #{sopmalCd}
AND n.BNF_NTK_STTUS_DV_CD = '010' -- 섭취중 상태만
AND n.DEL_AT = 'N'
GROUP BY n.BNF_NTK_INNB, n.NTK_CNT
) AS intake_summary
</select>
<!-- 마일리지 적립 처리 -->
<insert id="awardIntakeChallengesMileage" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
SELECT
#{bnfRcvInnb},
(SELECT MAX(BNF_PRT_INNB)
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
),
'10010', -- 섭취챌린지 1일 보상 코드
'010', -- 마일리지 보상 상품 코드
#{mlgRwdAmt},
#{mbrInnb},
NOW()
WHERE NOT EXISTS (
SELECT 1
FROM GC_BENEFIT_RECEIPT r
JOIN GC_BENEFIT_PARTCPTN p ON r.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE p.BNF_INNB = #{bnfInnb}
AND p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND DATE(p.BNF_PRT_DT) = CURDATE()
AND r.BNF_RWD_CATE_DV_CD = '10010'
)
</insert>
<!-- 날짜별 상태 정보 조회 -->
<select id="selectStatsDateClasses" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
WITH RECURSIVE DateRange AS (
-- 날짜 범위 생성 (최근 30일)
SELECT DATE_SUB(CURDATE(), INTERVAL 29 DAY) AS date
UNION ALL
SELECT DATE_ADD(date, INTERVAL 1 DAY)
FROM DateRange
WHERE date < CURDATE()
),
DailyIntakeStatus AS (
SELECT
DATE(p.BNF_PRT_DT) AS participation_date,
n.BNF_NTK_INNB,
n.NTK_CNT AS target_count,
COUNT(pn.BNF_PRT_NTK_INNB) AS actual_count,
CASE
WHEN COUNT(pn.BNF_PRT_NTK_INNB) >= n.NTK_CNT THEN 'DONE'
WHEN COUNT(pn.BNF_PRT_NTK_INNB) > 0 THEN 'ING'
ELSE 'NONE'
END AS daily_status
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN GC_BENEFIT_PARTCPTN_NTKCHL pn ON n.BNF_NTK_INNB = pn.BNF_NTK_INNB
LEFT JOIN GC_BENEFIT_PARTCPTN p ON pn.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.BNF_INNB = #{bnfInnb}
AND n.SOPMAL_CD = #{sopmalCd}
AND n.DEL_AT = 'N'
AND n.BNF_NTK_STTUS_DV_CD = '010' -- 섭취중 상태만
AND p.BNF_PRT_DT >= DATE_SUB(CURDATE(), INTERVAL 29 DAY)
GROUP BY DATE(p.BNF_PRT_DT), n.BNF_NTK_INNB, n.NTK_CNT
),
ConsecutiveStatus AS (
SELECT
participation_date,
COUNT(CASE WHEN daily_status = 'DONE' THEN 1 END) AS done_count,
COUNT(CASE WHEN daily_status = 'ING' THEN 1 END) AS ing_count,
ROW_NUMBER() OVER (ORDER BY participation_date DESC) AS days_ago
FROM DailyIntakeStatus
GROUP BY participation_date
),
ConsecutiveDays AS (
SELECT
participation_date,
done_count,
ing_count,
@consecutive := CASE
WHEN done_count > 0 THEN @consecutive + 1
ELSE 0
END AS consecutive_days
FROM ConsecutiveStatus
CROSS JOIN (SELECT @consecutive := 0) AS vars
ORDER BY participation_date
)
SELECT
dr.date,
COALESCE(cs.done_count, 0) AS done_count,
COALESCE(cs.ing_count, 0) AS ing_count,
CASE
WHEN COALESCE(cs.done_count, 0) > 0 THEN 'stats_done'
WHEN COALESCE(cs.ing_count, 0) > 0 THEN 'stats_ing'
ELSE ''
END AS stats_done,
CASE
WHEN COALESCE(cs.done_count, 0) > 0 THEN 'stats_done'
WHEN COALESCE(cs.ing_count, 0) > 0 THEN 'stats_ing'
ELSE ''
END AS stats_ing,
CASE
WHEN cd.consecutive_days >= 30 THEN 'stats_30done'
ELSE ''
END AS stats_30done
FROM DateRange dr
LEFT JOIN ConsecutiveStatus cs ON dr.date = cs.participation_date
LEFT JOIN ConsecutiveDays cd ON dr.date = cd.participation_date
ORDER BY dr.date DESC
]]>
</select>
<!-- 현재 챌린지 중인 제품을 조회-->
<select id="selectCurrentChallengeProducts" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
n.BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
n.BNF_INNB, -- 혜택 설정 고유번호
n.MBR_INNB, -- 회원 고유번호
n.GOODS_INNB AS productId,-- 상품 고유번호
g.GOODS_NM AS productName,-- 상품명
FN_GET_GOODS_IMAGE(g.SOPMAL_CD, g.GOODS_INNB, '03') AS imageUrl, -- 상품 썸네일 이미지
n.NTK_CNT AS dailyIntakeCount, -- 1일 섭취 횟수
n.BNF_NTK_STTUS_DV_CD, -- 섭취상태 구분코드 (010: 섭취중, 020: 일시중단, 030: 종료)
n.MEMO, -- 메모
n.REGIST_DT, -- 등록일시
(
SELECT COUNT(pn.BNF_PRT_NTK_INNB)
FROM GC_BENEFIT_PARTCPTN_NTKCHL pn
JOIN GC_BENEFIT_PARTCPTN p ON pn.BNF_PRT_INNB = p.BNF_PRT_INNB
WHERE pn.BNF_NTK_INNB = n.BNF_NTK_INNB
AND DATE(p.BNF_PRT_DT) = CASE
WHEN #{selectedDate} IS NOT NULL THEN #{selectedDate}
ELSE CURDATE()
END
) AS todayIntakeCount -- 오늘 섭취 횟수
FROM
GC_BENEFIT_NTKCHL n
LEFT JOIN
GC_GOODS g ON n.GOODS_INNB = g.GOODS_INNB AND n.SOPMAL_CD = g.SOPMAL_CD
WHERE
n.MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND n.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 추가
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb}) -- 혜택 설정 고유번호
AND n.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 필터링 추가
AND n.BNF_NTK_STTUS_DV_CD = '010' -- 섭취중 상태
AND n.DEL_AT = 'N' -- 삭제되지 않은 데이터
AND (#{selectedDate} IS NULL OR DATE(n.REGIST_DT) <= #{selectedDate}) -- 제품 등록일이 선택된 날짜 이전이거나 같은 경우만
ORDER BY
n.REGIST_DT DESC -- 등록일시 기준 내림차순 정렬
]]>
</select>
<!-- 섭취챌린지 제품 상세 정보 조회 -->
<select id="selectIntakeChallengeProductDetail" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
n.BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
n.BNF_INNB, -- 혜택 설정 고유번호
n.MBR_INNB, -- 회원 고유번호
n.GOODS_INNB, -- 상품 고유번호
g.GOODS_NM, -- 상품명
FN_GET_GOODS_IMAGE(g.SOPMAL_CD, g.GOODS_INNB, '03') AS thumbnail, -- 상품 썸네일 이미지
n.NTK_CNT, -- 목표 섭취 횟수
n.BNF_NTK_STTUS_DV_CD, -- 섭취상태 구분코드 (010: 섭취중, 020: 일시중단, 030: 종료)
CASE
WHEN n.BNF_NTK_STTUS_DV_CD = '010' THEN '섭취중'
WHEN n.BNF_NTK_STTUS_DV_CD = '020' THEN '일시중단'
WHEN n.BNF_NTK_STTUS_DV_CD = '030' THEN '종료'
ELSE ''
END AS status_name, -- 섭취상태 이름
n.MEMO, -- 메모
g.SRT_DC AS intake_instructions, -- 섭취방법 (간략설명)
n.REGIST_DT AS start_date, -- 섭취 시작일자 추가
(
SELECT GROUP_CONCAT(
JSON_OBJECT(
'id', c.CTGRY_ID,
'name', c.CTGRY_NM
)
)
FROM GC_CATEGORY_LINK cl
JOIN GC_CATEGORY c ON cl.CTGRY_ID = c.CTGRY_ID AND cl.SOPMAL_CD = c.SOPMAL_CD
WHERE cl.GOODS_INNB = n.GOODS_INNB
AND cl.SOPMAL_CD = n.SOPMAL_CD
) AS categories -- 카테고리 정보 (JSON 형식)
FROM
GC_BENEFIT_NTKCHL n
JOIN
GC_GOODS g ON n.GOODS_INNB = g.GOODS_INNB AND n.SOPMAL_CD = g.SOPMAL_CD
WHERE
n.BNF_NTK_INNB = #{bnfNtkInnb}
AND n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.DEL_AT = 'N'
]]>
</select>
<!-- 일일 섭취 횟수 및 메모 업데이트 -->
<insert id="upsertIntakeChallengeInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
INSERT INTO GC_BENEFIT_NTKCHL (
BNF_NTK_INNB,
BNF_INNB,
MBR_INNB,
MBR_DV_CD,
GOODS_INNB,
SOPMAL_CD,
BNF_NTK_STTUS_DV_CD,
NTK_CNT,
MEMO,
DEL_AT,
REGUSR,
REGIST_DT
) VALUES (
#{bnfNtkInnb},
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
#{goodsInnb},
#{sopmalCd},
#{bnfNtkSttusDvCd},
#{ntkCnt},
#{memo},
'N',
#{regusr},
NOW()
)
ON DUPLICATE KEY UPDATE
NTK_CNT = #{ntkCnt},
MEMO = #{memo},
BNF_NTK_STTUS_DV_CD = #{bnfNtkSttusDvCd},
UPDUSR = #{mbrInnb},
UPDT_DT = NOW()
</insert>
<!-- 섭취챌린지 제품 삭제 (논리적 삭제) -->
<update id="deleteIntakeChallengeProduct" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
UPDATE GC_BENEFIT_NTKCHL
SET
DEL_AT = 'Y', -- 삭제 여부를 'Y'로 설정
UPDUSR = #{mbrInnb}, -- 수정자 (회원 고유번호)
UPDT_DT = NOW() -- 수정일시
WHERE
BNF_NTK_INNB = #{bnfNtkInnb} -- 혜택 섭취챌린지 고유번호
AND MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 추가
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 필터링 추가
AND DEL_AT = 'N' -- 현재 삭제되지 않은 상태인 경우에만 업데이트
</update>
<!-- 모든 상태의 섭취챌린지 제품 목록 조회 (완료여부 Y/N 포함) -->
<select id="selectAllIntakeChallengeProducts" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
WITH ProductConsecutiveDays AS (
SELECT
n.BNF_NTK_INNB,
n.GOODS_INNB,
MAX(consecutive_days) as max_consecutive_days
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN (
SELECT
pn.BNF_NTK_INNB,
MAX(consec.consecutive_days) as consecutive_days
FROM GC_BENEFIT_PARTCPTN_NTKCHL pn
JOIN GC_BENEFIT_PARTCPTN p ON pn.BNF_PRT_INNB = p.BNF_PRT_INNB
JOIN (
SELECT
pn2.BNF_NTK_INNB,
DATE(p2.BNF_PRT_DT) as participation_date,
@consecutive := CASE
WHEN @prev_date = DATE_SUB(DATE(p2.BNF_PRT_DT), INTERVAL 1 DAY)
AND @prev_product = pn2.BNF_NTK_INNB
THEN @consecutive + 1
ELSE 1
END as consecutive_days,
@prev_date := DATE(p2.BNF_PRT_DT),
@prev_product := pn2.BNF_NTK_INNB
FROM GC_BENEFIT_PARTCPTN_NTKCHL pn2
JOIN GC_BENEFIT_PARTCPTN p2 ON pn2.BNF_PRT_INNB = p2.BNF_PRT_INNB
CROSS JOIN (SELECT @consecutive := 0, @prev_date := '', @prev_product := 0) as vars
ORDER BY pn2.BNF_NTK_INNB, DATE(p2.BNF_PRT_DT)
) consec ON pn.BNF_NTK_INNB = consec.BNF_NTK_INNB
GROUP BY pn.BNF_NTK_INNB
) consecutive_data ON n.BNF_NTK_INNB = consecutive_data.BNF_NTK_INNB
WHERE n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb})
AND n.SOPMAL_CD = #{sopmalCd}
AND n.DEL_AT = 'N'
GROUP BY n.BNF_NTK_INNB, n.GOODS_INNB
)
SELECT
n.BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
n.BNF_INNB, -- 혜택 설정 고유번호
n.MBR_INNB, -- 회원 고유번호
n.GOODS_INNB AS productId, -- 상품 고유번호
g.GOODS_NM AS productName, -- 상품명
FN_GET_GOODS_IMAGE(g.SOPMAL_CD, g.GOODS_INNB, '03') AS imageUrl, -- 상품 썸네일 이미지
n.NTK_CNT AS dailyIntakeCount, -- 1일 섭취 횟수
n.BNF_NTK_STTUS_DV_CD, -- 원본 섭취상태 구분코드
CASE
WHEN n.BNF_NTK_STTUS_DV_CD = '010' THEN 'ACTIVE' -- 섭취중
ELSE 'INACTIVE' -- 기타(일시중단, 종료)
END AS challengeStatus, -- 새로운 챌린지 상태
CASE
WHEN COALESCE(pcd.max_consecutive_days, 0) >= 30 THEN 'Y' -- 30일 완료
ELSE 'N'
END AS isCompleted, -- 30일 완료 여부 (Y/N)
CASE
WHEN COALESCE(pcd.max_consecutive_days, 0) >= 30 THEN '완료'
WHEN n.BNF_NTK_STTUS_DV_CD = '010' THEN '섭취중'
WHEN n.BNF_NTK_STTUS_DV_CD = '020' THEN '일시중단'
WHEN n.BNF_NTK_STTUS_DV_CD = '030' THEN '종료'
ELSE ''
END AS statusName, -- 새로운 상태 이름
n.REGIST_DT AS addedDate, -- 챌린지 추가일
COALESCE(pcd.max_consecutive_days, 0) AS maxConsecutiveDays -- 최대 연속 일수
FROM
GC_BENEFIT_NTKCHL n
LEFT JOIN
GC_GOODS g ON n.GOODS_INNB = g.GOODS_INNB AND n.SOPMAL_CD = g.SOPMAL_CD
LEFT JOIN
ProductConsecutiveDays pcd ON n.BNF_NTK_INNB = pcd.BNF_NTK_INNB
WHERE
n.MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND n.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 추가
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb}) -- 혜택 설정 고유번호
AND n.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 필터링
AND n.DEL_AT = 'N' -- 삭제되지 않은 데이터
ORDER BY
n.REGIST_DT DESC -- 등록일시 기준 내림차순 정렬(최근 추가순)
]]>
</select>
<!-- 섭취챌린지 전체 현황 조회 (전체, 섭취중, 완료로 분류) -->
<select id="selectIntakeChallengeCount" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
WITH ProductConsecutiveDays AS (
SELECT
n.BNF_NTK_INNB,
n.BNF_NTK_STTUS_DV_CD,
MAX(consecutive_days) as max_consecutive_days
FROM GC_BENEFIT_NTKCHL n
LEFT JOIN (
SELECT
pn.BNF_NTK_INNB,
MAX(consec.consecutive_days) as consecutive_days
FROM GC_BENEFIT_PARTCPTN_NTKCHL pn
JOIN GC_BENEFIT_PARTCPTN p ON pn.BNF_PRT_INNB = p.BNF_PRT_INNB
JOIN (
SELECT
pn2.BNF_NTK_INNB,
DATE(p2.BNF_PRT_DT) as participation_date,
@consecutive := CASE
WHEN @prev_date = DATE_SUB(DATE(p2.BNF_PRT_DT), INTERVAL 1 DAY)
AND @prev_product = pn2.BNF_NTK_INNB
THEN @consecutive + 1
ELSE 1
END as consecutive_days,
@prev_date := DATE(p2.BNF_PRT_DT),
@prev_product := pn2.BNF_NTK_INNB
FROM GC_BENEFIT_PARTCPTN_NTKCHL pn2
JOIN GC_BENEFIT_PARTCPTN p2 ON pn2.BNF_PRT_INNB = p2.BNF_PRT_INNB
CROSS JOIN (SELECT @consecutive := 0, @prev_date := '', @prev_product := 0) as vars
ORDER BY pn2.BNF_NTK_INNB, DATE(p2.BNF_PRT_DT)
) consec ON pn.BNF_NTK_INNB = consec.BNF_NTK_INNB
GROUP BY pn.BNF_NTK_INNB
) consecutive_data ON n.BNF_NTK_INNB = consecutive_data.BNF_NTK_INNB
WHERE n.MBR_INNB = #{mbrInnb}
AND n.MBR_DV_CD = #{mbrDvCd}
AND (#{bnfInnb} IS NULL OR n.BNF_INNB = #{bnfInnb})
AND n.SOPMAL_CD = #{sopmalCd}
AND n.DEL_AT = 'N'
GROUP BY n.BNF_NTK_INNB, n.BNF_NTK_STTUS_DV_CD
)
SELECT
COUNT(*) AS totalCount, -- 전체 제품 수
SUM(CASE
WHEN COALESCE(max_consecutive_days, 0) >= 30 THEN 0 -- 완료된 제품은 섭취중에서 제외
WHEN BNF_NTK_STTUS_DV_CD = '010' THEN 1
ELSE 0
END) AS activeCount, -- 섭취중인 제품 수 (완료 제외)
SUM(CASE
WHEN COALESCE(max_consecutive_days, 0) >= 30 THEN 1
ELSE 0
END) AS completedCount -- 30일 완료한 제품 수
FROM
ProductConsecutiveDays
]]>
</select>
<!-- 누적 보상 정보 조회 -->
<select id="selectCumulativeRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
SUM(CASE WHEN r.BNF_RWD_CATE_DV_CD = '10010' THEN r.MLG_RWD_AMT ELSE 0 END) AS dailyRewardTotal,
SUM(CASE WHEN r.BNF_RWD_CATE_DV_CD = '10020' THEN r.MLG_RWD_AMT ELSE 0 END) AS consecutiveRewardTotal,
COUNT(CASE WHEN r.BNF_RWD_CATE_DV_CD = '10020' AND r.BNF_RWD_GODS_DV_CD = '020' THEN r.COUPON_INNB ELSE NULL END) AS couponCount
FROM
GC_BENEFIT_RECEIPT rec
JOIN
GC_BENEFIT_PARTCPTN p ON rec.BNF_PRT_INNB = p.BNF_PRT_INNB
JOIN
GC_BENEFIT_REWARD r ON p.BNF_INNB = r.BNF_INNB AND rec.BNF_RWD_CATE_DV_CD = r.BNF_RWD_CATE_DV_CD
WHERE
p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
</select>
<!-- 연속 성공 기간 조회 -->
<select id="selectConsecutiveSuccessDays" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
WITH DateRange AS (
SELECT
ADDDATE('1970-01-01', t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) as date
FROM
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
WHERE
ADDDATE('1970-01-01', t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) BETWEEN
(SELECT MIN(REGIST_DT) FROM GC_BENEFIT_NTKCHL WHERE MBR_INNB = #{mbrInnb} AND MBR_DV_CD = #{mbrDvCd} AND BNF_INNB = #{bnfInnb} AND SOPMAL_CD = #{sopmalCd} AND DEL_AT = 'N')
AND CURDATE()
),
SuccessDates AS (
SELECT DISTINCT DATE(p.BNF_PRT_DT) as success_date
FROM GC_BENEFIT_PARTCPTN p
WHERE p.MBR_INNB = #{mbrInnb} AND p.MBR_DV_CD = #{mbrDvCd} AND p.BNF_INNB = #{bnfInnb}
),
DateStatus AS (
SELECT
d.date,
CASE WHEN s.success_date IS NOT NULL THEN 1 ELSE 0 END as is_success,
CASE WHEN @consec := IF(s.success_date IS NOT NULL, @consec + 1, 0) THEN @consec ELSE 0 END as consecutive_count
FROM
DateRange d
LEFT JOIN
SuccessDates s ON d.date = s.success_date
CROSS JOIN
(SELECT @consec := 0) as vars
ORDER BY
d.date
),
ConsecutiveGroups AS (
SELECT
date,
consecutive_count,
@group_id := IF(consecutive_count = 0, @group_id + 1, @group_id) as group_id
FROM
DateStatus
CROSS JOIN
(SELECT @group_id := 0) as vars
ORDER BY
date
),
ConsecutivePeriods AS (
SELECT
group_id,
MIN(date) as start_date,
MAX(date) as end_date,
MAX(consecutive_count) as consecutive_days
FROM
ConsecutiveGroups
WHERE
consecutive_count > 0
GROUP BY
group_id
)
SELECT
start_date,
end_date,
consecutive_days,
CASE WHEN end_date = CURDATE() THEN 'Y' ELSE 'N' END as is_today_completion,
CASE WHEN consecutive_days >= 30 THEN 'Y' ELSE 'N' END as is_30days_completed,
CASE
WHEN consecutive_days >= 30 THEN CEILING(consecutive_days / 30)
ELSE 0
END as completed_cycles,
CASE
WHEN consecutive_days >= 30 THEN consecutive_days % 30
ELSE consecutive_days
END as current_cycle_days
FROM
ConsecutivePeriods
WHERE
(end_date = CURDATE() OR CURDATE() BETWEEN start_date AND end_date)
ORDER BY
end_date DESC
LIMIT 1
]]>
</select>
<!-- 현재 챌린지 상태 종합 정보 조회 -->
<select id="selectChallengeStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
CASE
WHEN EXISTS (
SELECT 1 FROM GC_BENEFIT_NTKCHL
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND SOPMAL_CD = #{sopmalCd}
AND BNF_NTK_STTUS_DV_CD = '020'
AND DEL_AT = 'N'
) THEN '020' -- 중단 상태
WHEN EXISTS (
SELECT 1 FROM GC_BENEFIT_PARTCPTN p
JOIN GC_BENEFIT_NTKCHL n ON p.MBR_INNB = n.MBR_INNB AND p.BNF_INNB = n.BNF_INNB
WHERE p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND DATE(p.BNF_PRT_DT) = CURDATE()
AND n.BNF_NTK_STTUS_DV_CD = '010'
AND n.MBR_DV_CD = #{mbrDvCd}
AND n.SOPMAL_CD = #{sopmalCd}
AND n.DEL_AT = 'N'
) THEN '100' -- 오늘 성공
ELSE '010' -- 진행중
END as challenge_status,
(
SELECT COUNT(DISTINCT DATE(BNF_PRT_DT))
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
) as total_success_days,
(
SELECT DATEDIFF(CURDATE(), MIN(REGIST_DT)) + 1
FROM GC_BENEFIT_NTKCHL
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND SOPMAL_CD = #{sopmalCd}
AND BNF_NTK_STTUS_DV_CD = '010'
AND DEL_AT = 'N'
) as total_challenge_days
FROM dual
</select>
<!-- 섭취챌린지 알림설정 조회 -->
<select id="selectIntakeChallengeNotifications" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_NTK_NTCN_INNB, -- 혜택 섭취챌린지 알림 고유번호
NULL AS BNF_NTK_INNB, -- 혜택 섭취챌린지 고유번호
NTCN_TME, -- 알림 시간
USE_AT, -- 사용 여부
REGIST_DT -- 등록일시
FROM
GC_BENEFIT_NTKCHL_NTCN
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
ORDER BY
NTCN_TME ASC
</select>
<!-- 기본 알림 설정 생성 쿼리 (신규 사용자) -->
<insert id="insertDefaultNotificationTimes" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
INSERT INTO GC_BENEFIT_NTKCHL_NTCN (
BNF_INNB,
MBR_INNB,
MBR_DV_CD,
NTCN_TME,
USE_AT,
REGUSR,
REGIST_DT
)
SELECT
#{bnfInnb}, #{mbrInnb}, #{mbrDvCd}, '07:00:00', 'N', #{regusr}, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM GC_BENEFIT_NTKCHL_NTCN
WHERE MBR_INNB = #{mbrInnb} AND BNF_INNB = #{bnfInnb} AND MBR_DV_CD = #{mbrDvCd} AND NTCN_TME = '07:00:00'
)
UNION ALL
SELECT
#{bnfInnb}, #{mbrInnb}, #{mbrDvCd}, '12:00:00', 'N', #{regusr}, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM GC_BENEFIT_NTKCHL_NTCN
WHERE MBR_INNB = #{mbrInnb} AND BNF_INNB = #{bnfInnb} AND MBR_DV_CD = #{mbrDvCd} AND NTCN_TME = '12:00:00'
)
UNION ALL
SELECT
#{bnfInnb}, #{mbrInnb}, #{mbrDvCd}, '19:00:00', 'N', #{regusr}, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM GC_BENEFIT_NTKCHL_NTCN
WHERE MBR_INNB = #{mbrInnb} AND BNF_INNB = #{bnfInnb} AND MBR_DV_CD = #{mbrDvCd} AND NTCN_TME = '19:00:00'
)
</insert>
<!-- 섭취시간 알림 설정 업데이트 -->
<update id="updateIntakeChallengeNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
UPDATE GC_BENEFIT_NTKCHL_NTCN
SET
NTCN_TME = #{ntcnTme},
USE_AT = #{useAt}
WHERE
BNF_NTK_NTCN_INNB = #{bnfNtkNtcnInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
</update>
<!-- 섭취챌린지 미완료 알림 설정 조회 -->
<select id="selectIntakeChallengeIncompleteNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
ps.BNF_PUSH_EVT_SETUP_INNB,
ps.PUSH_SJ,
ps.PUSH_CN,
ps.USE_AT
FROM
GC_BENEFIT_PUSH_EVT_SETUP ps
WHERE
ps.BNF_PUSH_CND_DV_CD = '10020' -- 섭취챌린지 미완료시
AND ps.SOPMAL_CD = #{sopmalCd}
</select>
<!-- 미완료 알림 설정 업데이트 -->
<update id="updateIntakeChallengeIncompleteNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
UPDATE GC_BENEFIT_PUSH_EVT_SETUP
SET
USE_AT = #{useAt}
WHERE
BNF_PUSH_EVT_SETUP_INNB = #{bnfPushEvtSetupInnb}
AND BNF_PUSH_CND_DV_CD = '10020' -- 섭취챌린지 미완료시
AND SOPMAL_CD = #{sopmalCd}
</update>
<!-- 섭취챌린지 알림설정 조회 -->
<select id="checkUserNotificationSettings" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="boolean">
SELECT EXISTS (
SELECT 1
FROM GC_BENEFIT_NTKCHL_NTCN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
)
</select>
<!-- 특정 유저의 모든 알림 설정 삭제 -->
<delete id="deleteAllNotifications" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
DELETE FROM GC_BENEFIT_NTKCHL_NTCN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
</delete>
<!-- 특정 알림 설정 삭제 -->
<delete id="deleteNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
DELETE FROM GC_BENEFIT_NTKCHL_NTCN
WHERE BNF_NTK_NTCN_INNB = #{bnfNtkNtcnInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
</delete>
<!-- 오늘 참여기록 확인 -->
<select id="selectTodayParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_PRT_INNB,
PRT_LEAF_CNT,
BNF_PRT_DT
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
</select>
<!-- 오늘 참여기록 생성 (첫 참여시에만) -->
<insert id="insertTodayParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB,
BNF_INNB,
MBR_INNB,
MBR_DV_CD,
BNF_PRT_DT,
REGUSR,
REGIST_DT
) VALUES (
#{bnfPrtInnb},
#{bnfInnb},
#{mbrInnb},
#{mbrDvCd},
NOW(),
#{regusr},
NOW()
)
</insert>
<!-- 개별 섭취 기록 추가 -->
<insert id="insertIntakeRecord" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
<selectKey keyProperty="bnfPrtNtkInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_NTK_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN_NTKCHL
</selectKey>
INSERT INTO GC_BENEFIT_PARTCPTN_NTKCHL (
BNF_PRT_NTK_INNB,
BNF_PRT_INNB,
BNF_NTK_INNB
) VALUES (
#{bnfPrtNtkInnb},
#{bnfPrtInnb},
#{bnfNtkInnb}
)
</insert>
<!-- 오늘 보상 지급 여부 확인 -->
<select id="checkTodayRewardAwarded" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="boolean">
SELECT EXISTS (
SELECT 1
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
AND (PRT_LEAF_CNT IS NOT NULL AND PRT_LEAF_CNT > 0)
)
</select>
<!-- 오늘 보상 업데이트 (마일리지 + 초록잎) -->
<update id="updateTodayRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO">
UPDATE GC_BENEFIT_PARTCPTN
SET PRT_LEAF_CNT = #{paidLeafCnt},
UPDUSR = #{updusr},
UPDT_DT = NOW()
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
</update>
<!-- 초록잎 지급 여부 확인 -->
<select id="checkLeafAlreadyAwarded" parameterType="com.wb.domainserver.domain.gcone.bnft.intakchl.vo.BOIntakchlVO" resultType="boolean">
SELECT EXISTS (
SELECT 1
FROM GC_BENEFIT_PARTCPTN p
WHERE p.BNF_INNB = #{bnfInnb}
AND p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND DATE(p.BNF_PRT_DT) = CURDATE()
AND p.PRT_LEAF_CNT IS NOT NULL
AND p.PRT_LEAF_CNT &gt; 0
)
</select>
</mapper>

View File

@@ -0,0 +1,250 @@
<?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="com.wb.domainserver.domain.gcone.bnft.lucklott.mapper.BOLucklottMapper">
<!-- 행운복권 혜택 기본 정보 조회 -->
<select id="selectLucklottBenefitInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_INNB, -- 혜택 설정 고유번호
USE_AT, -- 사용여부
SOPMAL_CD, -- 쇼핑몰코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_SJ, -- 혜택 제목
SCR_REPRSNT_IMG, -- 화면 대표 이미지
SCR_REPRSNT_LINK_URL, -- 화면 대표 링크 URL
SCR_RWD_IMG, -- 화면 보상 이미지
SCR_RWD_LINK_URL, -- 화면 보상 링크 URL
BNF_BGN_DT, -- 진행기간 시작일시
BNF_END_DT, -- 진행기간 종료일시
BNF_WORDS_CN -- 혜택 안내
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '030' -- 행운복권 혜택 구분 코드 (문자열로 수정)
AND USE_AT = 'Y'
AND SOPMAL_CD = #{sopmalCd}
AND DATE(NOW()) BETWEEN DATE(BNF_BGN_DT) AND DATE(BNF_END_DT)
ORDER BY BNF_INNB DESC
]]>
</select>
<!-- 행운복권 혜택 보상 및 쿠폰 정보 조회 -->
<select id="selectLucklottBenefitRewardsAndCoupons" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
R.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
R.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
R.ITM_NM, -- 표시명
R.MLG_RWD_AMT, -- 마일리지 보상 금액
C.COUP_NM, -- 쿠폰명
C.COUPON_DC -- 쿠폰설명
FROM
GC_BENEFIT B
LEFT JOIN GC_BENEFIT_REWARD R ON B.BNF_INNB = R.BNF_INNB
LEFT JOIN GC_COUPON C ON R.COUPON_INNB = C.COUPON_INNB
AND C.USE_AT = 'Y'
WHERE
B.BNF_DV_CD = '030' -- 행운복권 혜택 구분 코드
AND B.USE_AT = 'Y'
AND B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건 추가
]]>
</select>
<!-- 행운복권 혜택 보상 정보 조회 -->
<select id="selectLucklottBenefitRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
R.BNF_INNB, -- 혜택 설정 고유번호
R.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
R.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
R.MLG_RWD_AMT, -- 마일리지 금액
R.COUPON_INNB, -- 쿠폰 고유번호
R.ITM_NM, -- 표시명
R.PRZWIN_QY, -- 당첨수량
R.PRZWIN_PRC, -- 당첨확률
R.DSCNT_AMT, -- 할인금액
C.COUP_NM, -- 쿠폰명
C.COUPON_DC -- 쿠폰설명
FROM
GC_BENEFIT_REWARD R
LEFT JOIN GC_COUPON C ON R.COUPON_INNB = C.COUPON_INNB
AND C.USE_AT = 'Y'
WHERE
R.BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호 조건
AND R.PRZWIN_QY > 0 -- 수량이 있는 경우만
ORDER BY R.BNF_RWD_CATE_DV_CD ASC -- 등수 순서대로 정렬 (03010, 03020, 03030, 03040)
]]>
</select>
<!-- 오늘 참여 횟수 조회 -->
<select id="selectTodayParticipationCount" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="int">
<![CDATA[
SELECT IFNULL(COUNT(*), 0)
FROM GC_BENEFIT_PARTCPTN
WHERE BNF_INNB = #{bnfInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE(BNF_PRT_DT) = CURDATE()
]]>
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '030' -- 혜택 구분 코드 (행운복권)
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 행운복권 혜택 참여 정보 삽입 (초록잎 적립 포함) -->
<insert id="insertLucklottBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN
(
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수 (추가)
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
VALUES
(
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{paidLeafCnt}, -- 초록잎 지급량
#{regusr},
NOW()
)
]]>
</insert>
<!-- 행운복권 혜택 보상 수령 정보 삽입 -->
<insert id="insertLucklottBenefitReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB, -- 쿠폰고유번호
GOODS_INNB, -- 상품고유번호
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb}, -- 혜택 참여 고유번호 (파라미터)
#{bnfRwdCateDvCd}, -- 보상 항목 구분 코드 (파라미터)
#{bnfRwdGodsDvCd}, -- 보상 상품 구분 코드 (파라미터)
#{mlgRwdAmt}, -- 마일리지 금액 (파라미터, 해당 없으면 NULL)
#{couponInnb}, -- 쿠폰고유번호 (파라미터, 해당 없으면 NULL)
#{goodsInnb}, -- 상품고유번호 (파라미터, 해당 없으면 NULL)
#{regUsr}, -- 등록자 번호 (파라미터)
NOW() -- 현재 시간
)
]]>
</insert>
<!-- 특정 상품의 당첨된 수량 조회 -->
<select id="selectIssuedGoodsQuantity" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="int">
<![CDATA[
SELECT
COUNT(brec.BNF_RCV_INNB) AS issuedGoodsQuantity -- 당첨된 수량
FROM
GC_BENEFIT_REWARD br -- 혜택 보상설정 정보 테이블
LEFT JOIN
GC_BENEFIT_PARTCPTN bp ON br.BNF_INNB = bp.BNF_INNB -- 혜택 참여 정보 테이블과 조인
LEFT JOIN
GC_BENEFIT_RECEIPT brec ON bp.BNF_PRT_INNB = brec.BNF_PRT_INNB -- 혜택 보상수령 내역 테이블과 조인
AND br.BNF_RWD_CATE_DV_CD = brec.BNF_RWD_CATE_DV_CD
AND br.BNF_RWD_GODS_DV_CD = brec.BNF_RWD_GODS_DV_CD
WHERE
br.BNF_INNB = #{bnfInnb} -- 특정 혜택 설정 번호 선택
AND br.BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd} -- 특정 보상 항목 구분 코드 선택
AND br.BNF_RWD_GODS_DV_CD = #{bnfRwdGodsDvCd} -- 특정 보상 상품 구분 코드 선택
GROUP BY
br.BNF_INNB, br.BNF_RWD_CATE_DV_CD, br.BNF_RWD_GODS_DV_CD, br.ITM_NM
]]>
</select>
<!-- 특정 상품의 남은 수량 조회 -->
<select id="selectRemainingGoodsQuantity" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="int">
<![CDATA[
SELECT
br.PRZWIN_QY - COALESCE(COUNT(brec.BNF_RCV_INNB), 0) AS remainingGoodsQuantity -- 남은 당첨 수량
FROM
GC_BENEFIT_REWARD br -- 혜택 보상설정 정보 테이블
LEFT JOIN
GC_BENEFIT_PARTCPTN bp ON br.BNF_INNB = bp.BNF_INNB -- 혜택 참여 정보 테이블과 조인
LEFT JOIN
GC_BENEFIT_RECEIPT brec ON bp.BNF_PRT_INNB = brec.BNF_PRT_INNB -- 혜택 보상수령 내역 테이블과 조인
AND br.BNF_RWD_CATE_DV_CD = brec.BNF_RWD_CATE_DV_CD
AND br.BNF_RWD_GODS_DV_CD = brec.BNF_RWD_GODS_DV_CD
WHERE
br.BNF_INNB = #{bnfInnb} -- 특정 혜택 설정 번호
AND br.BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd} -- 특정 보상 항목 구분 코드로 검색
GROUP BY
br.BNF_INNB, br.BNF_RWD_CATE_DV_CD, br.BNF_RWD_GODS_DV_CD, br.ITM_NM, br.PRZWIN_QY -- 그룹화 기준
ORDER BY
br.BNF_INNB, br.BNF_RWD_CATE_DV_CD, br.BNF_RWD_GODS_DV_CD -- 정렬 기준
]]>
</select>
<!-- 모든 등수 상품의 수량 체크 -->
<select id="selectAllRewardsQuantityStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
br.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.ITM_NM, -- 상품명
br.PRZWIN_QY, -- 총 당첨수량
COALESCE(COUNT(brec.BNF_RCV_INNB), 0) AS issuedQuantity, -- 지급된 수량
br.PRZWIN_QY - COALESCE(COUNT(brec.BNF_RCV_INNB), 0) AS remainingQuantity, -- 남은 수량
CASE
WHEN br.PRZWIN_QY - COALESCE(COUNT(brec.BNF_RCV_INNB), 0) > 0 THEN 'Y'
ELSE 'N'
END AS hasStock -- 재고 여부
FROM
GC_BENEFIT_REWARD br
LEFT JOIN GC_BENEFIT_PARTCPTN bp ON br.BNF_INNB = bp.BNF_INNB
LEFT JOIN GC_BENEFIT_RECEIPT brec ON bp.BNF_PRT_INNB = brec.BNF_PRT_INNB
AND br.BNF_RWD_CATE_DV_CD = brec.BNF_RWD_CATE_DV_CD
AND br.BNF_RWD_GODS_DV_CD = brec.BNF_RWD_GODS_DV_CD
WHERE
br.BNF_INNB = #{bnfInnb}
GROUP BY
br.BNF_RWD_CATE_DV_CD, br.BNF_RWD_GODS_DV_CD, br.ITM_NM, br.PRZWIN_QY
ORDER BY
br.BNF_RWD_CATE_DV_CD
]]>
</select>
<!-- 보상 수량 감소 쿼리 제거 -->
<!--
<update id="updateRewardQuantity" parameterType="com.wb.domainserver.domain.gcone.bnft.lucklott.vo.BOLucklottVO">
<![CDATA[
UPDATE GC_BENEFIT_REWARD
SET PRZWIN_QY = PRZWIN_QY - 1
WHERE BNF_INNB = #{bnfInnb}
AND BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd}
AND BNF_RWD_GODS_DV_CD = #{bnfRwdGodsDvCd}
AND PRZWIN_QY > 0
]]>
</update>
-->
</mapper>

View File

@@ -0,0 +1,224 @@
<?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="com.wb.domainserver.domain.gcone.bnft.lvshop.mapper.BOLvshopMapper">
<!-- 현재 진행중인 라이브 쇼핑 정보 조회 -->
<select id="selectCurrentLiveShoppingInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB AS BNF_INNB, -- 혜택 고유번호
BC.CN_SJ AS BENEFIT_TITLE, -- 혜택 제목 (방송명)
BC.IMG_FIL_COURS AS THUMBNAIL_IMAGE_URL,-- 방송 썸네일 이미지 URL
BG.WORDS_CN_2 AS BENEFIT_DESC_2, -- 혜택 안내문 2 (이벤트 설명)
BC.WORDS_CN AS BROADCAST_DESC, -- 방송 안내
BC.CN_DC AS CONTENT_DESC, -- 내용 설명 (방송 소개)
BC.TME_SECND AS REQUIRED_WATCH_TIME,-- 필수 시청 시간(초)
BC.LINK_URL AS PARTICIPATION_URL, -- 참여 링크 URL 추가
TIMESTAMPDIFF(SECOND, BC.CN_BGN_DT, NOW()) AS ELAPSED_TIME_IN_SECONDS, -- 방송 경과 시간(초)
BR.MLG_RWD_AMT AS MILEAGE_REWARD -- 마일리지 보상 금액
FROM
GC_BENEFIT B -- 혜택 기본 정보 테이블
INNER JOIN
GC_BENEFIT_CONTENT BC ON B.BNF_INNB = BC.BNF_INNB -- 혜택 내용설정 정보 테이블 조인
LEFT JOIN
GC_BENEFIT_REWARD BR ON B.BNF_INNB = BR.BNF_INNB AND BR.BNF_RWD_CATE_DV_CD = '07010' -- 혜택 보상설정 정보 테이블 조인 (라이브 쇼핑 참여 보상)
LEFT JOIN
GC_BENEFIT_GDCC BG ON B.BNF_DV_CD = BG.BNF_DV_CD AND B.SOPMAL_CD = BG.SOPMAL_CD -- 혜택 안내문 정보 테이블 조인
WHERE
B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건
AND B.BNF_DV_CD = '070' -- 혜택 구분 코드 (라이브 쇼핑) 조건
AND B.USE_AT = 'Y' -- 사용 여부 조건
AND NOW() BETWEEN BC.CN_BGN_DT AND BC.CN_END_DT -- 현재 진행 중인 방송 조건
LIMIT 1 -- 가장 최근 1건 조회
</select>
<!-- 다음 방송 예고 목록 조회 -->
<select id="selectUpcomingLiveShoppingList" parameterType="string" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB AS BNF_INNB, -- 혜택 고유번호
B.BNF_SJ AS BENEFIT_TITLE, -- 방송명
BC.IMG_FIL_COURS AS THUMBNAIL_IMAGE_URL, -- 방송 썸네일 이미지 URL
BC.CN_DC AS CONTENT_DESC, -- 방송소개
BC.WORDS_CN AS BROADCAST_DESC, -- 방송 안내
BC.CN_BGN_DT AS BROADCAST_START_TIME, -- 방송 시작 시간 추가
BG.WORDS_CN_1 AS BENEFIT_DESC_1, -- 혜택 안내문 1
BG.WORDS_CN_2 AS BENEFIT_DESC_2, -- 혜택 안내문 2
BG.WORDS_CN_3 AS BENEFIT_DESC_3, -- 혜택 안내문 3
TIMESTAMPDIFF(SECOND, NOW(), BC.CN_BGN_DT) AS REMAINING_TIME -- 방송 시작까지 남은 시간 (초)
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_CONTENT BC ON B.BNF_INNB = BC.BNF_INNB
LEFT JOIN
GC_BENEFIT_GDCC BG ON B.BNF_DV_CD = BG.BNF_DV_CD AND B.SOPMAL_CD = BG.SOPMAL_CD -- 혜택 안내문 정보 테이블 조인
WHERE
B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 (문자열 파라미터)
AND B.BNF_DV_CD = '070' -- 혜택 구분 코드 (라이브쇼핑)
AND B.USE_AT = 'Y' -- 사용 여부
AND NOW() &lt; BC.CN_BGN_DT -- 아직 방송 시작 전인 경우 (예고 방송)
ORDER BY
B.BNF_BGN_DT ASC -- 방송 시작 시간이 빠른 순 정렬
</select>
<!-- 라이브 쇼핑 알림 신청 상태 조회 -->
<select id="selectLiveShoppingNotificationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO" resultType="string">
SELECT
AGRE_AT -- 동의 여부
FROM
GC_BENEFIT_AGREE -- 혜택 동의 내역 테이블
WHERE
SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건
AND MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 조건
AND BNF_DV_CD = '070' -- 혜택 구분 코드 (라이브 쇼핑) 조건
AND BNF_AGRE_DV_CD = '010' -- 혜택 동의 구분 코드 (알림동의) 조건
</select>
<!-- 라이브 쇼핑 알림 신청 정보 삽입 (중복 시 업데이트) -->
<insert id="insertLiveShoppingNotification" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO">
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰 코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
AGRE_AT, -- 동의 여부
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{sopmalCd}, -- 쇼핑몰 코드
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
'070', -- 혜택 구분 코드 (라이브 쇼핑)
'010', -- 혜택 동의 구분 코드 (알림 동의)
#{agreAt}, -- 동의 여부
#{regusr}, -- 등록자 (회원 고유번호)
NOW() -- 현재 시간
)
ON DUPLICATE KEY UPDATE
BNF_DV_CD = #{bnfDvCd},
BNF_AGRE_DV_CD = #{bnfAgreDvCd},
AGRE_AT = #{agreAt}, -- 동의 여부 업데이트
REGUSR = #{regusr}, -- 수정자 (회원 고유번호)
REGIST_DT = NOW() -- 수정 시간 (현재 시간)
</insert>
<!-- 라이브쇼핑 알림 상태 조회 (기존 쿼리 - 필요시 유지) -->
<select id="getLvshopNotificationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO" resultType="string">
SELECT
AGRE_AT -- 동의 여부
FROM
GC_BENEFIT_AGREE -- 혜택 동의 내역 테이블
WHERE
SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건
AND MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 조건
AND BNF_INNB = #{bnfInnb} -- 혜택 고유번호 조건
AND BNF_DV_CD = '070' -- 혜택 구분 코드 (라이브 쇼핑) 조건
AND BNF_AGRE_DV_CD = '010'; -- 혜택 동의 구분 코드 (알림 동의) 조건
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '070' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 라이브쇼핑 혜택 참여 정보 삽입 -->
<insert id="insertLvshopBenefitParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 고유번호
BNF_PRT_DT, -- 혜택 참여 일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfPrtInnb}, -- 혜택 참여 고유번호
#{bnfInnb}, -- 혜택 고유번호
NOW(), -- 현재 시간
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
#{paidLeafCnt}, -- 참여 초록잎 개수
#{regusr}, -- 등록자 (회원 고유번호)
NOW() -- 현재 시간
)
</insert>
<!-- 라이브쇼핑 마일리지 적립 여부 확인 -->
<select id="checkLiveShoppingRewardReceived" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO" resultType="int">
SELECT COUNT(1)
FROM GC_BENEFIT_RECEIPT R
JOIN GC_BENEFIT_PARTCPTN P ON P.BNF_PRT_INNB = R.BNF_PRT_INNB
JOIN GC_BENEFIT B ON B.BNF_INNB = P.BNF_INNB
WHERE B.BNF_DV_CD = '070' <!-- 라이브쇼핑 혜택 -->
<!-- 회원 고유번호 -->
AND P.MBR_INNB = #{mbrInnb}
<!-- 회원 구분 코드 -->
AND P.MBR_DV_CD = #{mbrDvCd}
<!-- 쇼핑몰 코드 -->
<if test="sopmalCd != null and sopmalCd != ''">
AND B.SOPMAL_CD = #{sopmalCd}
</if>
<!-- 특정 혜택(방송)만 점검하고 싶을 때 -->
<if test="bnfInnb != null">
AND P.BNF_INNB = #{bnfInnb}
</if>
</select>
<!-- 라이브쇼핑 마일리지 적립 정보 삽입 -->
<insert id="insertLiveShoppingRewardReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
REGUSR, -- 등록자
REGIST_DT -- 등록 시간
) VALUES (
#{bnfRcvInnb}, -- 혜택 보상수령 고유번호
#{bnfPrtInnb}, -- 혜택 참여 고유번호
'07010', -- 보상 항목 구분 코드 (라이브 쇼핑 참여 보상)
'010', -- 보상 상품 구분 코드 (마일리지)
#{mlgRwdAmt}, -- 마일리지 금액
#{regusr}, -- 등록자 (회원 고유번호)
NOW() -- 현재 시간
)
</insert>
<!-- 라이브쇼핑 혜택 정보 조회 (기존 쿼리 - 필요시 유지) -->
<select id="selectLvshopInfo" parameterType="long" resultType="com.wb.domainserver.domain.gcone.bnft.lvshop.vo.BOLvshopVO">
SELECT
BNF_INNB, -- 혜택 고유번호
SOPMAL_CD, -- 쇼핑몰 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_SJ, -- 혜택 제목
USE_AT, -- 사용 여부
BNF_BGN_DT, -- 혜택 시작 일시
BNF_END_DT -- 혜택 종료 일시
-- 필요한 컬럼 추가
FROM
GC_BENEFIT -- 혜택 기본 정보 테이블
WHERE
BNF_INNB = #{bnfInnb}; -- 혜택 고유번호 조건
</select>
</mapper>

View File

@@ -0,0 +1,344 @@
<?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="com.wb.domainserver.domain.gcone.bnft.oxquiz.mapper.BOOxquizMapper">
<!-- OX 퀴즈 기본 정보 조회 -->
<select id="selectOxquizBasicInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_INNB, -- 혜택 설정 고유번호
BNF_SJ, -- 혜택 제목
SCR_REPRSNT_IMG, -- 화면 대표 이미지
BNF_BGN_DT, -- 진행기간 시작일시
BNF_END_DT, -- 진행기간 종료일시
BNF_WORDS_CN -- 혜택 안내
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '130' -- OX 퀴즈 혜택 구분 코드
AND USE_AT = 'Y'
AND DATE(NOW()) BETWEEN DATE(BNF_BGN_DT) AND DATE(BNF_END_DT)
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
]]>
</select>
<select id="selectOxquizDetailInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_QUIZ_INNB, -- 퀴즈 고유번호
QUIZ_CN, -- 퀴즈 내용
QUIZ_CNSR, -- 퀴즈 정답
HINT_URL, -- 힌트 url
QUIZ_SEQ -- 퀴즈 순서
FROM (
SELECT
c.*,
ROW_NUMBER() OVER (PARTITION BY c.BNF_INNB ORDER BY c.BNF_QUIZ_INNB) as QUIZ_SEQ
FROM
GC_BENEFIT_OXQUIZ c
WHERE
c.DEL_AT = 'N'
) numbered
WHERE
BNF_INNB = #{bnfInnb}
ORDER BY
QUIZ_SEQ ASC
]]>
</select>
<!-- 사용자의 OX 퀴즈 참여 정보 조회 -->
<select id="selectUserOxquizParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
p.BNF_INNB, -- 혜택 설정 고유번호
po.BNF_QUIZ_INNB, -- 퀴즈 고유번호
po.ANSW_CN AS USER_ANSWER, -- 사용자 답변
CASE
WHEN po.ANSW_CN = c.QUIZ_CNSR THEN 'O'
WHEN po.ANSW_CN IS NOT NULL THEN 'X'
ELSE NULL
END AS IS_CORRECT -- 정답 여부
FROM
GC_BENEFIT_PARTCPTN p
JOIN GC_BENEFIT_PARTCPTN_OXQUIZ po ON p.BNF_PRT_INNB = po.BNF_PRT_INNB
JOIN GC_BENEFIT_OXQUIZ c ON po.BNF_QUIZ_INNB = c.BNF_QUIZ_INNB
WHERE
p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
]]>
</select>
<!-- 사용자 당일 참여 조회 -->
<select id="selectTodayParticipationCount" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="int">
<![CDATA[
SELECT COUNT(*)
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb}
AND DATE(BNF_PRT_DT) = CURDATE()
]]>
</select>
<!-- 사용자가 맞춘 정답 수 조회 -->
<select id="selectUserCorrectAnswerCount" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="int">
<![CDATA[
SELECT COUNT(*)
FROM GC_BENEFIT_PARTCPTN p
JOIN GC_BENEFIT_PARTCPTN_OXQUIZ po ON p.BNF_PRT_INNB = po.BNF_PRT_INNB
JOIN GC_BENEFIT_OXQUIZ o ON po.BNF_QUIZ_INNB = o.BNF_QUIZ_INNB
WHERE p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND po.ANSW_CN = o.QUIZ_CNSR
]]>
</select>
<!-- 특정 보상 코드에 해당하는 보상 정보 조회 -->
<select id="selectRewardInfoByCode" parameterType="map" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB -- 쿠폰 고유번호
FROM
GC_BENEFIT_REWARD
WHERE
BNF_RWD_CATE_DV_CD = #{rewardCode}
AND BNF_INNB = #{bnfInnb}
]]>
</select>
<!-- 현재 퀴즈 개수 조회 -->
<select id="selectCurrentQuizCount" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="int">
<![CDATA[
SELECT COUNT(*)
FROM GC_BENEFIT_OXQUIZ A
JOIN GC_BENEFIT B ON A.BNF_INNB = B.BNF_INNB
WHERE A.BNF_INNB = #{bnfInnb}
AND A.DEL_AT = 'N'
AND B.SOPMAL_CD = #{sopmalCd}
]]>
</select>
<!-- 특정 번호의 퀴즈 조회 -->
<select id="selectCurrentOxquiz" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_QUIZ_INNB, -- 혜택 퀴즈 고유번호
QUIZ_CN, -- 퀴즈 내용
QUIZ_CNSR, -- 퀴즈 정답
HINT_URL -- 힌트보기 링크
FROM
GC_BENEFIT_OXQUIZ
WHERE
BNF_INNB = #{bnfInnb}
AND BNF_QUIZ_INNB = #{bnfQuizInnb}
]]>
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '130' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- OX 퀴즈 참여 정보 저장 (초록잎 적립 포함) -->
<insert id="insertOxquizParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
BNF_PRT_DT, -- 혜택 참여일시
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
PRT_LEAF_CNT, -- 참여 초록잎 개수 (추가)
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfPrtInnb},
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{paidLeafCnt}, -- 초록잎 지급량 (추가)
#{regusr},
NOW()
)
]]>
</insert>
<!-- OX 퀴즈 현재 퀴즈 번호 -->
<select id="selectCurrentQuizNumber" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="int">
<![CDATA[
SELECT
CASE
WHEN MIN(not_participated.QUIZ_SEQ) IS NULL THEN
(SELECT MAX(QUIZ_SEQ) FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY o.BNF_INNB ORDER BY o.BNF_QUIZ_INNB) as QUIZ_SEQ
FROM GC_BENEFIT_OXQUIZ o
WHERE o.BNF_INNB = #{bnfInnb} AND o.DEL_AT = 'N'
) all_quiz)
ELSE MIN(not_participated.QUIZ_SEQ)
END as current_quiz
FROM (
SELECT
o.*,
ROW_NUMBER() OVER (PARTITION BY o.BNF_INNB ORDER BY o.BNF_QUIZ_INNB) as QUIZ_SEQ
FROM
GC_BENEFIT_OXQUIZ o
WHERE
o.BNF_INNB = #{bnfInnb}
AND o.DEL_AT = 'N'
AND NOT EXISTS (
SELECT 1
FROM GC_BENEFIT_PARTCPTN p
JOIN GC_BENEFIT_PARTCPTN_OXQUIZ po ON p.BNF_PRT_INNB = po.BNF_PRT_INNB
WHERE p.MBR_INNB = #{mbrInnb}
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb}
AND po.BNF_QUIZ_INNB = o.BNF_QUIZ_INNB
)
) not_participated
]]>
</select>
<!-- OX 퀴즈 참여 상세 정보 저장 -->
<insert id="insertOxquizParticipationDetail" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO">
<selectKey keyProperty="bnfPrtQuizInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_QUIZ_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN_OXQUIZ
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN_OXQUIZ (
BNF_PRT_QUIZ_INNB, -- 혜택 참여 OX퀴즈 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_QUIZ_INNB, -- 혜택 퀴즈 고유번호
ANSW_CN, -- 답변내용
CNSR_AT -- 정답여부
) VALUES (
#{bnfPrtQuizInnb},
#{bnfPrtInnb},
#{bnfQuizInnb},
#{answCn},
#{cnsrAt}
)
]]>
</insert>
<!-- 알림 상태 조회 -->
<select id="selectNotificationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
AGRE_AT -- 동의여부
FROM
GC_BENEFIT_AGREE
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '130' -- OX 퀴즈 혜택 구분 코드
AND BNF_AGRE_DV_CD = '010' -- 알림동의 구분 코드
]]>
</select>
<!-- 알림 상태 변경 -->
<update id="updateNotificationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO">
<![CDATA[
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
BNF_INNB, -- 혜택 설정 고유번호
AGRE_AT, -- 동의여부
REGUSR, -- 등록자
REGIST_DT -- 등록일시
)
SELECT
#{sopmalCd},
#{mbrInnb},
#{mbrDvCd},
'130', -- OX 퀴즈 혜택 구분 코드
'010', -- 알림동의 구분 코드
#{bnfInnb},
#{agreAt},
#{regusr},
NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM GC_BENEFIT_AGREE
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '130'
AND BNF_AGRE_DV_CD = '010'
);
UPDATE GC_BENEFIT_AGREE
SET
AGRE_AT = #{agreAt},
REGUSR = #{regusr},
REGIST_DT = NOW()
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '130'
AND BNF_AGRE_DV_CD = '010';
]]>
</update>
<!-- 보상 정보 조회 -->
<select id="selectRewardInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB -- 쿠폰 고유번호
FROM
GC_BENEFIT_REWARD
WHERE
BNF_INNB = #{bnfInnb}
AND BNF_RWD_CATE_DV_CD IN ('13010', '13020', '13030') -- OX 퀴즈 보상 코드
]]>
</select>
<!-- 보상 지급 -->
<insert id="insertReward" parameterType="com.wb.domainserver.domain.gcone.bnft.oxquiz.vo.BOOxquizVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB, -- 쿠폰 고유번호
REGUSR, -- 등록자
REGIST_DT -- 등록일시
) VALUES (
#{bnfRcvInnb},
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{regusr},
NOW()
)
]]>
</insert>
</mapper>

View File

@@ -0,0 +1,933 @@
<?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="com.wb.domainserver.domain.gcone.bnft.purstmp.mapper.BOPurstmpStampMapper">
<!-- gc_order 테이블에서 매장 구매 정보 조회 (스탬프 적립/차감 처리용) -->
<select id="selectStoreOrdersForStamp"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- gc_order 테이블에서 매장 구매 정보 조회 (디바이스 등록일 기준 조회기간 적용)
SELECT
O.ORDR_INNB AS ORDR_INNB, -- 주문 고유번호
O.STR_INNB AS STR_INNB, -- 매장 고유번호
O.RL_SETLE_AMT AS RL_SETLE_AMT, -- 실 결제금액
CASE
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
ELSE CONCAT('매장_', O.STR_INNB)
END AS STR_NM, -- 매장명
DATE_FORMAT(O.SETLE_COMPT_DT, '%Y-%m-%d %H:%i:%s') AS SETLE_COMPT_DT, -- 결제완료일시
O.SLE_ENVRN_CD AS SLE_ENVRN_CD, -- 판매환경코드
O.SKN_ENVRN_CD AS SKN_ENVRN_CD, -- 스킨환경코드
O.ORDR_STTUS_CD AS ORDR_STTUS_CD, -- 주문상태코드 추가
CASE
WHEN O.ORDR_STTUS_CD IN ('25', '30', '35', '40', '45', '50', '55', '60', '65', '70', '75', '80') THEN 'ACCUMULATE'
WHEN O.ORDR_STTUS_CD IN ('85', '95', '99') THEN 'DEDUCT'
ELSE 'IGNORE'
END AS STAMP_ACTION -- 스탬프 처리 액션 (적립/차감/무시)
FROM
GC_ORDER O
LEFT JOIN
GC_STORE ST ON O.STR_INNB = ST.STR_INNB
LEFT JOIN
GC_BENEFIT_STMP BS ON O.ORDR_INNB = BS.ORDR_INNB
AND O.MBR_INNB = BS.MBR_INNB
AND O.SOPMAL_CD = BS.SOPMAL_CD
-- 회원 디바이스 정보 JOIN 추가 (조회 기간 산정용)
LEFT JOIN
GC_MEMBER_DEVICE_INFO MDI ON O.MBR_INNB = MDI.MBR_INNB
AND O.MBR_DV_CD = MDI.MBR_DV_CD
AND O.SOPMAL_CD = MDI.SOPMAL_CD
WHERE
O.MBR_INNB = #{mbrInnb}
AND O.MBR_DV_CD = #{mbrDvCd}
AND O.SOPMAL_CD = #{sopmalCd}
AND O.USE_AT = 'Y'
AND (
-- 스탬프 적립 대상 (정상 결제완료 상태)
O.ORDR_STTUS_CD IN ('25', '30', '35', '40', '45', '50', '55', '60', '65', '70', '75', '80')
OR
-- 스탬프 차감 대상 (결제취소/주문무효/결제실패)
O.ORDR_STTUS_CD IN ('85')
)
AND (
-- gc_order 참고사항: 매장 구매금액 조건
O.SLE_ENVRN_CD IN ('S1', 'S2', 'S3')
OR O.SKN_ENVRN_CD = 'POS'
)
-- 차감 대상은 이미 처리된 주문도 포함
AND (
(O.ORDR_STTUS_CD IN ('25', '30', '35', '40', '45', '50', '55', '60', '65', '70', '75', '80') AND BS.ORDR_INNB IS NULL) -- 적립: 미처리만
OR
(O.ORDR_STTUS_CD IN ('85') AND BS.ORDR_INNB IS NOT NULL AND BS.REFUND_AT = 'N') -- 차감: 이미 적립된 것만
)
<if test="strInnb != null and strInnb != '' and strInnb != 'null'">
AND O.STR_INNB = #{strInnb}
</if>
AND O.SETLE_COMPT_DT IS NOT NULL
-- 디바이스 등록일부터 현재까지 조회 (디바이스 정보 없으면 전체 조회)
<if test="true">
AND (MDI.REGIST_DT IS NULL OR O.SETLE_COMPT_DT &gt;= DATE(MDI.REGIST_DT))
</if>
AND O.SETLE_COMPT_DT &lt;= NOW() -- 현재까지
ORDER BY
O.SETLE_COMPT_DT DESC
</select>
<!-- 매장별 적립카드 조회 (유효기간 내, 교환권 포함) - 정렬 수정 -->
<select id="selectStampCards" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 매장별 진행 중인 스탬프 적립카드와 교환권 정보 조회 (쿠폰 정보 포함, 매장명 개선)
SELECT
SE.BNF_EXTIKET_INNB AS BNF_EXTIKET_INNB, -- 교환권 고유번호
SE.SOPMAL_CD AS SOPMAL_CD, -- 쇼핑몰코드
SE.STR_INNB AS STR_INNB, -- 매장 고유번호
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', SE.STR_INNB)
END AS STR_NM, -- 매장명 (gc_store 테이블 연동)
SE.MBR_INNB AS MBR_INNB, -- 회원 고유번호
SE.MBR_DV_CD AS MBR_DV_CD, -- 회원 구분코드
SE.EXTIKET_STMP_CNT AS EXTIKET_STMP_CNT, -- 교환권 스탬프 수
DATE_FORMAT(SE.STMP_VALID_DT, '%Y-%m-%d') AS STMP_VALID_DT, -- 스탬프 유효일시
SE.EXCHNG_AT AS EXCHNG_AT, -- 교환여부
SE.COUPON_INNB AS COUPON_INNB, -- 쿠폰고유번호
DATE_FORMAT(SE.REGIST_DT, '%Y-%m-%d') AS REGIST_DT, -- 등록일시
CASE
WHEN SE.EXCHNG_AT = 'Y' THEN 'COMPLETED'
WHEN NOW() &gt; SE.STMP_VALID_DT THEN 'EXPIRED'
ELSE 'ACTIVE'
END AS STATUS,
CASE
WHEN SE.COUPON_INNB IS NOT NULL THEN 'Y'
ELSE 'N'
END AS HAS_COUPON
FROM
GC_BENEFIT_STMP_EXTIKET SE
LEFT JOIN
GC_STORE ST ON SE.STR_INNB = ST.STR_INNB
WHERE
SE.MBR_INNB = #{mbrInnb}
AND SE.MBR_DV_CD = #{mbrDvCd}
AND SE.SOPMAL_CD = #{sopmalCd}
<if test="strInnb != null and strInnb != '' and strInnb > 0">
AND SE.STR_INNB = #{strInnb}
</if>
AND (
-- 유효기간 내의 카드이거나 교환권 발급 완료된 카드
(NOW() &lt;= SE.STMP_VALID_DT OR SE.EXCHNG_AT = 'Y')
)
ORDER BY
-- 교환되지 않은 카드를 먼저 표시
CASE WHEN SE.EXCHNG_AT = 'N' THEN 0 ELSE 1 END ASC,
SE.REGIST_DT ASC
</select>
<!-- 보유한 적립카드 개수 조회 (교환권 발급 완료 건도 포함) -->
<select id="selectTotalCardCount" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO" resultType="int">
-- 보유한 적립카드 개수 조회 (교환권 발급 완료 건도 포함)
SELECT
COUNT(*) AS CARD_COUNT
FROM
GC_BENEFIT_STMP_EXTIKET SE
WHERE
SE.MBR_INNB = #{mbrInnb}
AND SE.MBR_DV_CD = #{mbrDvCd}
AND SE.SOPMAL_CD = #{sopmalCd}
AND NOW() &lt;= SE.STMP_VALID_DT
</select>
<!-- 스탬프 적립 내역 조회 -->
<select id="selectRecentPurchasesWithStamps"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 최근 스탬프 적립 내역 조회 (매장명 연동)
SELECT
BS.BNF_STMP_INNB AS BNF_STMP_INNB,
BS.ORDR_INNB AS ORDR_INNB,
BS.REFUND_AT AS REFUND_AT,
BS.PURCHS_AMT AS PURCHS_AMT,
BS.RL_SETLE_AMT AS RL_SETLE_AMT,
BS.STMP_CNT AS STMP_CNT,
BS.AMT_FOR_CHG AS AMT_FOR_CHG,
DATE_FORMAT(BS.SETLE_COMPT_DT, '%Y-%m-%d %H:%i:%s') AS SETLE_COMPT_DT,
DATE_FORMAT(BS.REGIST_DT, '%Y-%m-%d %H:%i:%s') AS REGIST_DT,
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', BS.STR_INNB)
END AS BRANCH_NAME -- 매장명 (gc_store 테이블 연동)
FROM
GC_BENEFIT_STMP BS
LEFT JOIN
GC_STORE ST ON BS.STR_INNB = ST.STR_INNB
WHERE
BS.MBR_INNB = #{mbrInnb}
AND BS.MBR_DV_CD = #{mbrDvCd}
AND BS.SOPMAL_CD = #{sopmalCd}
AND (BS.REFUND_AT IS NULL OR BS.REFUND_AT != 'Y') -- 환불된 건 제외
<if test="strInnb != null and strInnb != ''">
AND BS.STR_INNB = #{strInnb}
</if>
AND BS.REGIST_DT &gt;= DATE_SUB(NOW(), INTERVAL 12 MONTH)
ORDER BY
BS.REGIST_DT DESC
LIMIT 20
</select>
<!-- 스탬프 적립 내역 추가 로딩 (스크롤 시 20개 추가) - 컬럼 추가 -->
<select id="selectMorePurchasesWithStamps"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 스크롤 시 추가 로딩할 스탬프 적립 내역 조회
SELECT
BS.BNF_STMP_INNB AS BNF_STMP_INNB,
BS.ORDR_INNB AS ORDR_INNB,
BS.REFUND_AT AS REFUND_AT,
BS.PURCHS_AMT AS PURCHS_AMT,
BS.RL_SETLE_AMT AS RL_SETLE_AMT,
BS.STMP_CNT AS STMP_CNT,
BS.AMT_FOR_CHG AS AMT_FOR_CHG,
DATE_FORMAT(BS.SETLE_COMPT_DT, '%Y-%m-%d %H:%i:%s') AS SETLE_COMPT_DT,
DATE_FORMAT(BS.REGIST_DT, '%Y-%m-%d %H:%i:%s') AS REGIST_DT,
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', BS.STR_INNB)
END AS BRANCH_NAME
FROM
GC_BENEFIT_STMP BS
LEFT JOIN
GC_STORE ST ON BS.STR_INNB = ST.STR_INNB
WHERE
BS.MBR_INNB = #{mbrInnb}
AND BS.MBR_DV_CD = #{mbrDvCd}
AND BS.SOPMAL_CD = #{sopmalCd}
AND (BS.REFUND_AT IS NULL OR BS.REFUND_AT != 'Y') -- 환불된 건 제외
<if test="strInnb != null and strInnb != ''">
AND BS.STR_INNB = #{strInnb}
</if>
AND BS.REGIST_DT &gt;= DATE_SUB(NOW(), INTERVAL 12 MONTH)
<if test="lastStmpInnb != null and lastStmpInnb &gt; 0">
AND BS.REGIST_DT &lt; (
SELECT REGIST_DT
FROM GC_BENEFIT_STMP
WHERE BNF_STMP_INNB = #{lastStmpInnb}
)
</if>
ORDER BY
BS.REGIST_DT DESC
LIMIT 20
</select>
<!-- 새로운 스탬프 적립 기록 추가 -->
<insert id="insertNewPurchase" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
-- 새로운 구매 기록 추가 및 스탬프 적립
INSERT INTO GC_BENEFIT_STMP (
SOPMAL_CD, -- 쇼핑몰코드
STR_INNB, -- 매장고유번호
ORDR_INNB, -- 주문 고유번호
REFUND_AT, -- 환불여부
MBR_INNB, -- 회원고유번호
MBR_DV_CD, -- 회원구분코드
PURCHS_INNB, -- 구매식별 고유번호
PURCHS_AMT, -- 구매금액
RL_SETLE_AMT, -- 실 결제금액
SETLE_COMPT_DT, -- 결제완료일시
STMP_CNT, -- 적립 스탬프 수
AMT_FOR_CHG, -- 충전필요금액
REGIST_DT -- 등록일시
) VALUES (
#{sopmalCd},
#{strInnb},
#{ordrInnb},
IFNULL(#{refundAt}, 'N'),
#{mbrInnb},
#{mbrDvCd},
#{purchsInnb},
#{purchsAmt},
#{rlSetleAmt},
#{setleCmptDt},
#{stmpCnt},
#{amtForChg},
NOW()
)
</insert>
<!-- 새로운 적립카드(교환권) 생성 -->
<insert id="insertExchangeTicket"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
useGeneratedKeys="true"
keyProperty="bnfExtiketInnb">
-- 새로운 교환권(스탬프 적립카드) 생성
INSERT INTO GC_BENEFIT_STMP_EXTIKET (
SOPMAL_CD,
STR_INNB,
MBR_INNB,
MBR_DV_CD,
EXTIKET_STMP_CNT,
STMP_VALID_DT,
EXCHNG_AT,
REGIST_DT
) VALUES (
#{sopmalCd},
#{strInnb},
#{mbrInnb},
#{mbrDvCd},
#{extiketStmpCnt},
<choose>
<when test="stmpValidDt != null">
#{stmpValidDt}
</when>
<otherwise>
DATE_ADD(NOW(), INTERVAL 12 MONTH) -- 기본: 현재시점으로부터 12개월
</otherwise>
</choose>,
IFNULL(#{exchngAt}, 'N'),
NOW()
)
</insert>
<!-- Step 1: 교환권 완료 대상 PK 조회 -->
<select id="selectExchangeTicketForComplete"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="Long">
-- 교환권 완료 처리 대상 PK 조회
SELECT
BNF_EXTIKET_INNB
FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND EXCHNG_AT = 'N'
AND EXTIKET_STMP_CNT = #{requiredStampCnt}
AND NOW() &lt;= STMP_VALID_DT
ORDER BY
REGIST_DT ASC
LIMIT 1
</select>
<!-- Step 2: PK 기준 교환권 완료 처리 (쿠폰 포함) -->
<update id="completeExchangeTicketWithCoupon"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
-- PK 기준 교환권 완료 처리 (쿠폰 정보 포함)
UPDATE
GC_BENEFIT_STMP_EXTIKET
SET
EXCHNG_AT = 'Y',
EXCHNG_DT = NOW(),
COUPON_INNB = #{couponInnb},
UPDT_DT = NOW()
WHERE
BNF_EXTIKET_INNB = #{bnfExtiketInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
</update>
<!-- ✅ 새로 추가: 쿠폰 번호만 업데이트하는 쿼리 -->
<update id="updateExchangeTicketCouponOnly"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
-- 교환권에 쿠폰 번호만 업데이트
UPDATE
GC_BENEFIT_STMP_EXTIKET
SET
COUPON_INNB = #{couponInnb},
UPDT_DT = NOW()
WHERE
BNF_EXTIKET_INNB = #{bnfExtiketInnb}
AND EXCHNG_AT = 'Y' -- 이미 완료된 상태에서만 업데이트
-- 추가 조건 제거하여 업데이트 확률 높임
</update>
<!-- 교환권 사용 완료 후 적립카드 삭제 처리 -->
<update id="deleteCompletedExchangeTicket" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
-- 교환권 사용 완료 후 적립카드 삭제 처리
DELETE FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
BNF_EXTIKET_INNB = #{bnfExtiketInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND EXCHNG_AT = 'Y'
</update>
<!-- 총 미교환 스탬프 수 조회 -->
<select id="selectTotalUnexchangedStamps"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="int">
-- ✅ 수정: 실제 사용 가능한 스탬프 수 조회 (완료된 교환권의 스탬프만 제외)
SELECT
GREATEST(0,
(
-- 총 적립된 스탬프 수
SELECT IFNULL(SUM(STMP_CNT), 0)
FROM GC_BENEFIT_STMP
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND REFUND_AT = 'N'
) - (
-- 완료된 교환권의 스탬프만 차감 (진행 중인 것은 제외)
SELECT IFNULL(SUM(EXTIKET_STMP_CNT), 0)
FROM GC_BENEFIT_STMP_EXTIKET
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND EXCHNG_AT = 'Y' -- 완료된 교환권만 차감
)
) AS AVAILABLE_STAMPS
</select>
<!-- 잔액 조회 수정 (동적 스탬프 기준 금액 적용) -->
<select id="selectRemainingAmount"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="java.lang.Double">
-- 간단한 잔액 조회 (0으로 고정 - 매번 새로운 구매로 처리)
SELECT 0.0 AS REMAINING_AMOUNT
</select>
<!-- 교환권 갯수 조회 -->
<select id="selectTotalRowCountFromBenefitExtiket"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="int">
-- 특정 회원의 유효한 교환권 개수 조회
SELECT
COUNT(*) AS TOTAL_COUNT
FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
<if test="strInnb != null and strInnb != ''">
AND STR_INNB = #{strInnb}
</if>
AND NOW() &lt;= STMP_VALID_DT
</select>
<!-- 스탬프 화면 정보 조회 (gc_benefit_content 테이블 연동) -->
<select id="selectPurstmpScreenInfo"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 스탬프 적립 이벤트의 화면 정보 조회
SELECT
B.BNF_INNB AS BNF_INNB, -- 혜택 설정 고유번호
BC.CN_SJ AS CN_SJ, -- 컨텐츠 제목
BC.IMG_FIL_COURS AS IMG_FIL_COURS, -- 이미지 파일 경로
BC.WORDS_CN AS WORDS_CN -- 안내 내용
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_CONTENT BC ON B.BNF_INNB = BC.BNF_INNB
WHERE
B.BNF_DV_CD = '140' -- 스탬프 적립 이벤트 코드 (140)
AND B.SOPMAL_CD = #{sopmalCd}
ORDER BY
B.BNF_INNB DESC
LIMIT 1
</select>
<!-- 관리자 설정 이달의 선물 정보 조회 -->
<select id="selectMonthlyGiftInfo"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB AS BNF_INNB, -- 혜택 설정 고유번호
BC.COUPON_INNB AS COUPON_INNB -- 쿠폰 고유번호
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_REWARD BC ON B.BNF_INNB = BC.BNF_INNB
WHERE
B.BNF_DV_CD = '140' -- 스탬프 적립 이벤트 코드 (140)
AND B.SOPMAL_CD = #{sopmalCd}
ORDER BY
B.BNF_INNB DESC
</select>
<!-- selectCurrentExchangeTicket 수정 -->
<select id="selectCurrentExchangeTicket"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_EXTIKET_INNB AS bnfExtiketInnb,
EXTIKET_STMP_CNT AS extiketStmpCnt
FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND EXCHNG_AT = 'N'
AND EXTIKET_STMP_CNT &lt; 10
AND NOW() &lt;= STMP_VALID_DT
ORDER BY
REGIST_DT ASC
LIMIT 1
</select>
<!-- 교환권 스탬프 수 업데이트 -->
<update id="updateExchangeTicketStampCount">
-- 교환권의 스탬프 수를 업데이트
UPDATE
GC_BENEFIT_STMP_EXTIKET
SET
EXTIKET_STMP_CNT = EXTIKET_STMP_CNT + #{newStampCount},
UPDT_DT = NOW()
WHERE
BNF_EXTIKET_INNB = #{extiketInnb}
</update>
<!-- 쿠폰(교환권) 목록 조회 - 정렬 수정 -->
<select id="selectCouponList"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 회원의 쿠폰(교환권) 목록 조회 (쿠폰 정보 포함, 매장명 개선)
SELECT
SE.BNF_EXTIKET_INNB AS bnfExtiketInnb,
SE.SOPMAL_CD AS sopmalCd,
SE.STR_INNB AS strInnb,
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', SE.STR_INNB)
END AS branchName, -- 매장명 (gc_store 테이블 연동)
SE.MBR_INNB AS mbrInnb,
SE.MBR_DV_CD AS mbrDvCd,
SE.EXTIKET_STMP_CNT AS extiketStmpCnt,
DATE_FORMAT(SE.STMP_VALID_DT, '%Y-%m-%d %H:%i:%s') AS stmpValidDt,
SE.EXCHNG_AT AS exchngAt,
DATE_FORMAT(SE.EXCHNG_DT, '%Y-%m-%d %H:%i:%s') AS exchngDt,
DATE_FORMAT(SE.REGIST_DT, '%Y-%m-%d %H:%i:%s') AS registDt,
DATE_FORMAT(SE.UPDT_DT, '%Y-%m-%d %H:%i:%s') AS updtDt,
SE.COUPON_INNB AS couponInnb,
CASE
WHEN SE.EXCHNG_AT = 'N' AND NOW() &lt;= SE.STMP_VALID_DT AND SE.EXTIKET_STMP_CNT >= 10 THEN 'Y'
ELSE 'N'
END AS exchangeable,
CASE
WHEN SE.COUPON_INNB IS NOT NULL THEN 'Y'
ELSE 'N'
END AS hasCoupon
FROM
GC_BENEFIT_STMP_EXTIKET SE
LEFT JOIN
GC_STORE ST ON SE.STR_INNB = ST.STR_INNB
WHERE
SE.MBR_INNB = #{mbrInnb}
AND SE.MBR_DV_CD = #{mbrDvCd}
AND SE.SOPMAL_CD = #{sopmalCd}
<if test="strInnb != null and strInnb != ''">
AND SE.STR_INNB = #{strInnb}
</if>
ORDER BY
-- 교환되지 않은 쿠폰을 먼저 표시
CASE WHEN SE.EXCHNG_AT = 'N' THEN 0 ELSE 1 END ASC,
-- 교환되지 않은 쿠폰들은 최신순으로, 교환된 쿠폰들도 최신순으로
SE.REGIST_DT DESC
</select>
<!-- 특정 교환권 정보 조회 -->
<select id="selectSpecificVoucherInfo"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 특정 교환권의 상세 정보 조회
SELECT
SE.BNF_EXTIKET_INNB AS bnfExtiketInnb,
SE.SOPMAL_CD AS sopmalCd,
SE.STR_INNB AS strInnb,
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', SE.STR_INNB)
END AS branchName,
SE.MBR_INNB AS mbrInnb,
SE.MBR_DV_CD AS mbrDvCd,
SE.EXTIKET_STMP_CNT AS extiketStmpCnt,
DATE_FORMAT(SE.STMP_VALID_DT, '%Y-%m-%d %H:%i:%s') AS stmpValidDt,
SE.EXCHNG_AT AS exchngAt,
DATE_FORMAT(SE.EXCHNG_DT, '%Y-%m-%d %H:%i:%s') AS exchngDt,
DATE_FORMAT(SE.REGIST_DT, '%Y-%m-%d %H:%i:%s') AS registDt,
DATE_FORMAT(SE.UPDT_DT, '%Y-%m-%d %H:%i:%s') AS updtDt
FROM
GC_BENEFIT_STMP_EXTIKET SE
LEFT JOIN
GC_STORE ST ON SE.STR_INNB = ST.STR_INNB
WHERE
SE.BNF_EXTIKET_INNB = #{bnfExtiketInnb}
AND SE.MBR_INNB = #{mbrInnb}
AND SE.MBR_DV_CD = #{mbrDvCd}
AND SE.SOPMAL_CD = #{sopmalCd}
</select>
<!-- 기존 구매 데이터 개수 조회 (더 정확한 조건) -->
<select id="countExistingPurchaseData"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="int">
-- 특정 회원의 기존 구매 데이터 개수 확인
SELECT
COUNT(*) AS PURCHASE_COUNT
FROM
GC_BENEFIT_STMP
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND REGIST_DT &gt;= DATE_SUB(NOW(), INTERVAL 6 MONTH) -- 최근 6개월 데이터만 확인
</select>
<!-- 기존 교환권 데이터 개수 조회 (더 정확한 조건) -->
<select id="countExistingTicketData"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="int">
-- 특정 회원의 기존 교환권 데이터 개수 확인
SELECT
COUNT(*) AS TICKET_COUNT
FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND REGIST_DT &gt;= DATE_SUB(NOW(), INTERVAL 6 MONTH) -- 최근 6개월 데이터만 확인
</select>
<!-- 스탬프 교환 보상 정보 조회 (gc_benefit_reward에서) -->
<select id="selectStampExchangeReward"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 스탬프 교환 보상 정보 조회 (쿠폰/마일리지)
SELECT
br.BNF_RWD_CATE_DV_CD AS BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD AS BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.MLG_RWD_AMT AS MLG_RWD_AMT, -- 마일리지 보상 금액
br.COUPON_INNB AS COUPON_INNB, -- 쿠폰 고유 번호
COALESCE(cs.COUPON_SNDNG_NM, br.ITM_NM) AS ITM_NM -- 쿠폰 이름
FROM
GC_BENEFIT_REWARD br
LEFT JOIN
GC_COUPON_SNDNG cs ON br.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
WHERE
br.BNF_INNB = #{bnfInnb}
AND br.BNF_RWD_CATE_DV_CD LIKE '14%' -- 모바일스탬프(140) 관련 보상
ORDER BY
br.BNF_RWD_CATE_DV_CD
LIMIT 1
</select>
<!-- 스탬프 혜택 참여 정보 저장 -->
<insert id="insertStampParticipation"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
useGeneratedKeys="true"
keyProperty="bnfPrtInnb"
keyColumn="BNF_PRT_INNB">
-- 스탬프 적립 시 혜택 참여 정보 저장
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB, -- 혜택 고유 번호
BNF_PRT_DT, -- 혜택 참여 일시
MBR_INNB, -- 회원 고유 번호
MBR_DV_CD, -- 회원 구분 코드
STR_INNB, -- 매장 고유번호 (스탬프용)
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{strInnb},
#{regusr},
NOW()
)
</insert>
<!-- 스탬프 혜택 설정 정보 조회 -->
<select id="selectStampBenefitInfo"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
-- 스탬프 혜택 설정 정보 조회
SELECT
BNF_INNB, -- 혜택 고유 번호
USE_AT, -- 사용여부
BNF_BGN_DT, -- 진행기간 시작일시
BNF_END_DT, -- 진행기간 종료일시
SCR_REPRSNT_IMG, -- 화면 대표 이미지 경로
SCR_RWD_IMG, -- 보상 이미지 경로
BNF_WORDS_CN -- 혜택 안내 문구
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '140' -- 모바일스탬프 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd}
ORDER BY
BNF_INNB DESC
LIMIT 1
]]>
</select>
<!-- 혜택 보상 영수증 저장 수정 -->
<insert id="insertMileageReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
useGeneratedKeys="true" keyProperty="bnfRcvInnb" keyColumn="BNF_RCV_INNB">
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_PRT_INNB, -- 혜택 참여 고유 번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 보상 금액
COUPON_INNB, -- 쿠폰 고유 번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{regusr},
NOW()
)
</insert>
<!-- Step 2: PK 기준 교환권 완료 처리 -->
<update id="completeExchangeTicketByPk"
parameterType="Long">
-- PK 기준 교환권 완료 처리
UPDATE
GC_BENEFIT_STMP_EXTIKET
SET
EXCHNG_AT = 'Y',
EXCHNG_DT = NOW(),
UPDT_DT = NOW()
WHERE
BNF_EXTIKET_INNB = #{bnfExtiketInnb}
</update>
<!-- 스탬프 적립 기준 금액 조회 (gc_benefit_chg_config에서) -->
<select id="selectStampAccumulationAmount"
parameterType="String"
resultType="java.lang.Double">
-- 스탬프 적립 기준 금액 조회 (gc_benefit_chg_config 테이블에서)
SELECT
AMT_FOR_CHG AS AMT_FOR_CHG
FROM
GC_BENEFIT_CHG_CONFIG
WHERE
SOPMAL_CD = #{sopmalCd}
AND BNF_DV_CD = '140' -- 모바일스탬프 구분 코드
LIMIT 1
</select>
<!-- 아직 스탬프 적립되지 않은 구매건만 조회 -->
<select id="selectUnprocessedStoreOrders"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 아직 스탬프 적립되지 않은 매장 구매건만 조회
SELECT
O.ORDR_INNB AS ordrInnb, -- 주문 고유번호
O.STR_INNB AS strInnb, -- 매장 고유번호
O.RL_SETLE_AMT AS rlSetleAmt, -- 실 결제금액
CASE
WHEN ST.STR_NM IS NOT NULL THEN ST.STR_NM
WHEN ST.TENTCPN_NM IS NOT NULL THEN ST.TENTCPN_NM
ELSE CONCAT('매장_', O.STR_INNB)
END AS strNm, -- 매장명
DATE_FORMAT(O.SETLE_COMPT_DT, '%Y-%m-%d %H:%i:%s') AS setleComptDt, -- 결제완료일시
O.SLE_ENVRN_CD AS sleEnvrnCd, -- 판매환경코드
O.SKN_ENVRN_CD AS sknEnvrnCd -- 스킨환경코드
FROM
GC_ORDER O
LEFT JOIN
GC_STORE ST ON O.STR_INNB = ST.STR_INNB
LEFT JOIN
GC_BENEFIT_STMP BS ON O.ORDR_INNB = BS.PURCHS_INNB
AND O.MBR_INNB = BS.MBR_INNB
AND O.MBR_DV_CD = BS.MBR_DV_CD
AND O.SOPMAL_CD = BS.SOPMAL_CD
WHERE
O.MBR_INNB = #{mbrInnb}
AND O.MBR_DV_CD = #{mbrDvCd}
AND O.SOPMAL_CD = #{sopmalCd}
AND O.USE_AT = 'Y'
AND O.ORDR_STTUS_CD IN ('25', '30', '35', '40', '45', '50', '55', '60', '65', '70', '75', '80') -- 결제완료 이후 상태만
AND (
-- gc_order 참고사항: 매장 구매금액 조건
O.SLE_ENVRN_CD IN ('S1', 'S2', 'S3')
OR O.SKN_ENVRN_CD = 'POS'
)
<if test="strInnb != null and strInnb != '' and strInnb != 'null'">
AND O.STR_INNB = #{strInnb}
</if>
AND O.SETLE_COMPT_DT IS NOT NULL
AND O.SETLE_COMPT_DT &gt;= DATE_SUB(NOW(), INTERVAL 12 MONTH) -- 최근 12개월 데이터만
AND BS.BNF_STMP_INNB IS NULL -- 아직 스탬프 적립 기록이 없는 주문만
ORDER BY
O.SETLE_COMPT_DT DESC
</select>
<!-- 첫 스탬프 적립일 조회 -->
<select id="selectFirstStampAccumulationDate"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="java.sql.Date">
-- 해당 매장의 첫 스탬프 적립일 조회
SELECT
MIN(DATE(REGIST_DT)) AS FIRST_STAMP_DATE
FROM
GC_BENEFIT_STMP
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
</select>
<!-- 특정 주문으로 적립된 스탬프 기록 조회 -->
<select id="selectStampsByPurchaseOrder"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_STMP_INNB,
STMP_CNT,
REFUND_AT, -- EXCHNG_AT 대신 REFUND_AT 사용
ORDR_INNB
FROM
GC_BENEFIT_STMP
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND ORDR_INNB = #{ordrInnb}
AND STR_INNB = #{strInnb}
AND REFUND_AT = 'N' -- 환불되지 않은 기록만 조회
</select>
<!-- 스탬프 기록 삭제 → 환불 처리로 변경 -->
<update id="updateStampRefundStatus" parameterType="Long">
-- 스탬프 환불 처리 (삭제 대신 상태 변경)
UPDATE GC_BENEFIT_STMP
SET
REFUND_AT = 'Y',
REGIST_DT = NOW()
WHERE
BNF_STMP_INNB = #{bnfStmpInnb}
AND REFUND_AT = 'N'
</update>
<!-- 환불 처리 시 스탬프 차감용 UPDATE 쿼리 추가 -->
<update id="updateRefundStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
-- 환불 처리 시 스탬프 차감
UPDATE GC_BENEFIT_STMP
SET
REFUND_AT = 'Y',
UPDT_DT = NOW()
WHERE
ORDR_INNB = #{ordrInnb}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND REFUND_AT = 'N'
</update>
<!-- 특정 주문의 스탬프 정보 조회 -->
<select id="selectStampByOrder"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
-- 주문번호로 스탬프 정보 조회
SELECT
BS.BNF_STMP_INNB AS BNF_STMP_INNB,
BS.ORDR_INNB AS ORDR_INNB,
BS.REFUND_AT AS REFUND_AT,
BS.PURCHS_AMT AS PURCHS_AMT,
BS.RL_SETLE_AMT AS RL_SETLE_AMT,
BS.STMP_CNT AS STMP_CNT,
BS.AMT_FOR_CHG AS AMT_FOR_CHG,
DATE_FORMAT(BS.SETLE_COMPT_DT, '%Y-%m-%d %H:%i:%s') AS SETLE_COMPT_DT,
DATE_FORMAT(BS.REGIST_DT, '%Y-%m-%d %H:%i:%s') AS REGIST_DT
FROM
GC_BENEFIT_STMP BS
WHERE
BS.ORDR_INNB = #{ordrInnb}
AND BS.MBR_INNB = #{mbrInnb}
AND BS.MBR_DV_CD = #{mbrDvCd}
AND BS.SOPMAL_CD = #{sopmalCd}
</select>
<!-- 주문 처리 여부 확인 쿼리 추가 -->
<select id="countProcessedOrder"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="int">
SELECT COUNT(*)
FROM GC_BENEFIT_STMP
WHERE SOPMAL_CD = #{sopmalCd}
AND MBR_INNB = #{mbrInnb}
AND ORDR_INNB = #{purchsInnb}
</select>
<!-- 환불로 인해 영향받은 교환권 삭제 -->
<delete id="deleteAffectedExchangeTickets"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
<![CDATA[
-- 환불된 스탬프로 인해 유효하지 않은 교환권 삭제
DELETE FROM GC_BENEFIT_STMP_EXTIKET
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND EXCHNG_AT = 'N' -- 미교환 교환권만
AND EXTIKET_STMP_CNT > (
-- 현재 유효한 스탬프 수보다 교환권 스탬프가 많으면 삭제
SELECT IFNULL(SUM(STMP_CNT), 0)
FROM GC_BENEFIT_STMP
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND REFUND_AT = 'N'
)
]]>
</delete>
<!-- 교환안된 교환권 조회 (오래된 순) -->
<select id="selectUnexchangedTicketsForDeduction"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO"
resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_EXTIKET_INNB,
EXTIKET_STMP_CNT
FROM
GC_BENEFIT_STMP_EXTIKET
WHERE
MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND SOPMAL_CD = #{sopmalCd}
AND STR_INNB = #{strInnb}
AND EXCHNG_AT = 'N' -- 교환안된 것만
ORDER BY
REGIST_DT ASC -- 오래된 것부터 처리
</select>
<!-- 교환권 스탬프 수 감소 -->
<update id="reduceExchangeTicketStamps"
parameterType="com.wb.domainserver.domain.gcone.bnft.purstmp.vo.BOPurstmpStampVO">
UPDATE GC_BENEFIT_STMP_EXTIKET
SET
EXTIKET_STMP_CNT = EXTIKET_STMP_CNT - #{deductStampCnt},
UPDT_DT = NOW()
WHERE
BNF_EXTIKET_INNB = #{bnfExtiketInnb}
AND EXTIKET_STMP_CNT >= #{deductStampCnt}
</update>
<!-- 특정 교환권 삭제 -->
<delete id="deleteSpecificExchangeTicket" parameterType="Long">
DELETE FROM GC_BENEFIT_STMP_EXTIKET
WHERE BNF_EXTIKET_INNB = #{bnfExtiketInnb}
</delete>
</mapper>

View File

@@ -0,0 +1,234 @@
<?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="com.wb.domainserver.domain.gcone.bnft.qrevnt.mapper.BOQREvntMapper">
<!-- QR이벤트 혜택 정보 조회 -->
<select id="selectQREventBenefitInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
b.BNF_INNB, -- 혜택 고유 번호
b.BNF_SJ, -- 혜택 제목
b.USE_AT, -- 사용여부
b.BNF_BGN_DT, -- 진행기간 시작일시
b.BNF_END_DT, -- 진행기간 종료일시
b.SCR_REPRSNT_IMG, -- 화면 대표 이미지
b.SCR_REPRSNT_IMG_NM, -- 화면 대표 이미지명
b.SCR_REPRSNT_LINK_URL, -- 화면 대표 링크 URL
b.SCR_RWD_IMG, -- 화면 보상 이미지
b.SCR_RWD_IMG_NM, -- 화면 보상 이미지명
b.SCR_RWD_LINK_URL, -- 화면 보상 링크 URL
b.BNF_WORDS_CN, -- 혜택 안내
gd.WORDS_CN_1, -- 안내문 1 (이벤트 설명)
gd.WORDS_CN_2, -- 안내문 2 (쿠폰 사용법)
gd.WORDS_CN_3 -- 안내문 3 (기타 안내)
FROM
GC_BENEFIT b
LEFT JOIN GC_BENEFIT_GDCC gd ON b.BNF_DV_CD = gd.BNF_DV_CD
AND b.SOPMAL_CD = gd.SOPMAL_CD
WHERE
b.BNF_DV_CD = '150' -- QR이벤트 혜택 구분 코드
AND b.USE_AT = 'Y'
AND DATE(NOW()) BETWEEN DATE(b.BNF_BGN_DT) AND DATE(b.BNF_END_DT)
AND b.SOPMAL_CD = #{sopmalCd}
ORDER BY
b.BNF_INNB
]]>
</select>
<!-- QR이벤트 보상 정보 조회 -->
<select id="selectQREventRewardInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
br.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
br.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
br.MLG_RWD_AMT, -- 마일리지 보상 금액
br.COUPON_INNB, -- 쿠폰 고유 번호
COALESCE(cs.COUPON_SNDNG_NM, br.ITM_NM) AS ITM_NM, -- 쿠폰 이름
br.PRZWIN_QY, -- 당첨수량
br.PRZWIN_PRC, -- 당첨확률
cs.DWLD_BGN_DT, -- 다운로드 시작일 (사용유효시작일 대체)
cs.DWLD_END_DT, -- 다운로드 종료일 (사용유효종료일 대체)
cs.COUPON_SNDNG_DC -- 쿠폰 설명 (사용조건내용 대체)
FROM
GC_BENEFIT_REWARD br
LEFT JOIN GC_COUPON_SNDNG cs ON br.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
WHERE
br.BNF_INNB = #{bnfInnb}
ORDER BY
br.PRZWIN_PRC DESC
]]>
</select>
<!-- 매장별 참여 여부 확인 -->
<select id="selectStoreParticipationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COUNT(*) AS participationCount -- 참여 횟수
FROM
GC_BENEFIT_PARTCPTN
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND STR_INNB = #{strInnb} -- 매장 고유 번호
AND DATE(BNF_PRT_DT) BETWEEN DATE(#{bnfBgnDt}) AND DATE(#{bnfEndDt}) -- 이벤트 기간 내
]]>
</select>
<!-- 전체 참여 여부 확인 (아이디당 1회) -->
<select id="selectTotalParticipationStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COUNT(*) AS totalParticipationCount -- 전체 참여 횟수
FROM
GC_BENEFIT_PARTCPTN
WHERE
MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
AND DATE(BNF_PRT_DT) BETWEEN DATE(#{bnfBgnDt}) AND DATE(#{bnfEndDt}) -- 이벤트 기간 내
]]>
</select>
<!-- 매장 정보 조회 -->
<select id="selectStoreInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
STR_INNB, -- 매장 고유번호
STR_NM, -- 매장명
STR_CD, -- 매장 코드
STR_ADRES, -- 매장 주소
STR_RNM_ADRES, -- 매장 도로명 주소
STR_TELNB, -- 매장 전화번호
CTY_DO, -- 시도
CTY_GUN_GU -- 시군구
FROM
GC_STORE
WHERE
STR_INNB = #{strInnb}
AND TENT_STTUS = '02' -- 개점 상태
]]>
</select>
<!-- QR이벤트 참여 처리 -->
<insert id="participateQREvent" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" useGeneratedKeys="true" keyProperty="bnfPrtInnb" keyColumn="BNF_PRT_INNB">
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB, -- 혜택 고유 번호
BNF_PRT_DT, -- 혜택 참여 일시
MBR_INNB, -- 회원 고유 번호
MBR_DV_CD, -- 회원 구분 코드
STR_INNB, -- 매장 고유 번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfInnb},
NOW(),
#{mbrInnb},
#{mbrDvCd},
#{strInnb},
#{regusr},
NOW()
)
]]>
</insert>
<!-- QR이벤트 당첨 결과 처리 (쿠폰 발급) -->
<insert id="insertQREventReward" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유 번호
BNF_PRT_INNB, -- 혜택 참여 고유 번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 보상 금액
COUPON_INNB, -- 쿠폰 고유 번호
GOODS_INNB, -- 상품 고유 번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfRcvInnb},
#{bnfPrtInnb},
#{bnfRwdCateDvCd},
#{bnfRwdGodsDvCd},
#{mlgRwdAmt},
#{couponInnb},
#{goodsInnb},
#{regusr},
NOW()
)
]]>
</insert>
<!-- QR이벤트 참여 내역 조회 -->
<select id="selectQREventParticipationHistory" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
p.BNF_PRT_INNB, -- 혜택 참여 고유 번호
p.BNF_PRT_DT, -- 혜택 참여 일시
p.STR_INNB, -- 매장 고유 번호
s.STR_NM, -- 매장명
s.STR_ADRES, -- 매장 주소
r.BNF_RCV_INNB, -- 보상 수령 고유 번호 (당첨 여부 확인용)
r.BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
r.BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
r.MLG_RWD_AMT, -- 마일리지 보상 금액
r.COUPON_INNB, -- 쿠폰 고유 번호
COALESCE(cs.COUPON_SNDNG_NM, br.ITM_NM) AS couponName, -- 쿠폰명
cs.DWLD_BGN_DT, -- 다운로드 시작일 (사용유효시작일 대체)
cs.DWLD_END_DT, -- 다운로드 종료일 (사용유효종료일 대체)
cs.COUPON_SNDNG_DC -- 쿠폰 설명 (사용조건내용 대체)
FROM
GC_BENEFIT_PARTCPTN p
LEFT JOIN GC_STORE s ON p.STR_INNB = s.STR_INNB
LEFT JOIN GC_BENEFIT_RECEIPT r ON p.BNF_PRT_INNB = r.BNF_PRT_INNB
LEFT JOIN GC_BENEFIT_REWARD br ON p.BNF_INNB = br.BNF_INNB
AND r.BNF_RWD_CATE_DV_CD = br.BNF_RWD_CATE_DV_CD
AND r.BNF_RWD_GODS_DV_CD = br.BNF_RWD_GODS_DV_CD
LEFT JOIN GC_COUPON_SNDNG cs ON r.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
WHERE
p.MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND p.MBR_DV_CD = #{mbrDvCd}
AND p.BNF_INNB = #{bnfInnb} -- 혜택 고유 번호
ORDER BY
p.BNF_PRT_DT DESC
]]>
</select>
<!-- QR이벤트 당첨 정보 상세 조회 -->
<select id="selectQREventWinningDetail" parameterType="com.wb.domainserver.domain.gcone.bnft.qrevnt.vo.BOQREvntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
p.BNF_PRT_INNB, -- 혜택 참여 고유 번호
p.BNF_PRT_DT, -- 혜택 참여 일시
s.STR_NM, -- 참여 매장명
s.STR_ADRES, -- 매장 주소
r.BNF_RCV_INNB, -- 보상 수령 고유 번호
r.COUPON_INNB AS couponNb, -- 쿠폰 번호 (발송 고유번호로 대체)
cs.COUPON_SNDNG_NM AS couponName, -- 쿠폰명
cs.COUPON_SNDNG_DC AS useCndtnCn, -- 쿠폰 설명 (사용조건으로 사용)
br.DSCNT_AMT AS dscntAmt, -- 할인 금액
br.DSCNT_RT AS dscntRt, -- 할인 율
DATE_FORMAT(cs.DWLD_END_DT, '%Y-%m-%d') AS expiryDateTime -- 유효기간
FROM
GC_BENEFIT_PARTCPTN p
INNER JOIN GC_STORE s ON p.STR_INNB = s.STR_INNB
INNER JOIN GC_BENEFIT_RECEIPT r ON p.BNF_PRT_INNB = r.BNF_PRT_INNB
INNER JOIN GC_COUPON_SNDNG cs ON r.COUPON_INNB = cs.COUPON_SNDNG_INNB
AND cs.SOPMAL_CD = #{sopmalCd}
INNER JOIN GC_BENEFIT_REWARD br ON p.BNF_INNB = br.BNF_INNB
AND r.BNF_RWD_CATE_DV_CD = br.BNF_RWD_CATE_DV_CD
AND r.BNF_RWD_GODS_DV_CD = br.BNF_RWD_GODS_DV_CD
WHERE
p.BNF_PRT_INNB = #{bnfPrtInnb} -- 혜택 참여 고유 번호
AND p.MBR_INNB = #{mbrInnb} -- 회원 고유 번호
AND p.MBR_DV_CD = #{mbrDvCd}
]]>
</select>
</mapper>

View File

@@ -0,0 +1,297 @@
<?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="com.wb.domainserver.domain.gcone.bnft.rougame.mapper.BORougameMapper">
<!-- 룰렛 혜택 기본 정보 조회 -->
<select id="selectRougameBenefitInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_INNB, -- 혜택 설정 고유번호
BNF_DV_CD, -- 혜택 구분 코드
USE_AT, -- 사용여부
BNF_BGN_DT, -- 진행기간 시작일시
BNF_END_DT, -- 진행기간 종료일시
SCR_REPRSNT_IMG, -- 화면 대표 이미지
SCR_REPRSNT_LINK_URL, -- 화면 대표 링크 URL
SCR_RWD_IMG, -- 화면 보상 이미지
SCR_RWD_LINK_URL, -- 화면 보상 링크 URL
BNF_WORDS_CN -- 혜택 안내
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '040' -- 룰렛 혜택 구분 코드
AND USE_AT = 'Y'
AND DATE(NOW()) BETWEEN DATE(BNF_BGN_DT) AND DATE(BNF_END_DT)
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
]]>
</select>
<!-- 남은 게임 참여 기회 횟수 조회 수정 -->
<select id="selectRemainingGameChances" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
#{mbrInnb} as MBR_INNB, -- 회원 고유번호
'040' as BNF_DV_CD, -- 혜택 구분 코드
(
-- 할당된 총 기회 계산
COALESCE(
(SELECT SUM(CHG_CNT) FROM GC_BENEFIT_CHARGE
WHERE MBR_INNB = #{mbrInnb} AND BNF_DV_CD = '040' AND SOPMAL_CD = #{sopmalCd} AND MBR_DV_CD = #{mbrDvCd})
, 0)
-
-- 사용한 기회 계산
COALESCE(
(SELECT COUNT(*) FROM GC_BENEFIT_PARTCPTN BP
INNER JOIN GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE BP.MBR_INNB = #{mbrInnb}
AND B.BNF_DV_CD = '040' AND B.SOPMAL_CD = #{sopmalCd} AND BP.MBR_DV_CD = #{mbrDvCd})
, 0)
) as remainingGameChances, -- 남아있는 게임 횟수
-- 실제 GC_BENEFIT_CHARGE 테이블에 레코드가 있는지 확인
(
SELECT COUNT(*) FROM GC_BENEFIT_CHARGE
WHERE MBR_INNB = #{mbrInnb} AND BNF_DV_CD = '040' AND SOPMAL_CD = #{sopmalCd} AND MBR_DV_CD = #{mbrDvCd}
) as hasChargeRecord
]]>
</select>
<!-- 룰렛 보상 정보 조회 -->
<select id="selectRougameRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
BNF_INNB, -- 혜택 설정 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB, -- 쿠폰 고유번호
ITM_NM, -- 표시명
PRZWIN_QY, -- 당첨수량
PRZWIN_PRC, -- 당첨확률
DSCNT_AMT, -- 할인금액
DSCNT_RT -- 할인비율
FROM
GC_BENEFIT_REWARD
WHERE
BNF_INNB = #{bnfInnb} -- 혜택 설정 고유번호 조건
]]>
</select>
<!-- 초록잎 지급량 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.atend.vo.BOAtendVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '040' -- 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 룰렛 참여 정보 저장 (초록잎 적립 포함) -->
<insert id="insertRougameParticipation" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO">
<selectKey keyProperty="bnfPrtInnb" resultType="java.lang.Long" order="BEFORE">
SELECT IFNULL(MAX(BNF_PRT_INNB), 0) + 1 FROM GC_BENEFIT_PARTCPTN
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_INNB, -- 혜택 설정 고유번호
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_PRT_DT, -- 혜택 참여 일시
PRT_LEAF_CNT, -- 참여 초록잎 개수 (추가)
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfPrtInnb}, -- 혜택 참여 고유번호
#{bnfInnb}, -- 혜택 설정 고유번호
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
NOW(), -- 혜택 참여 일시 (현재 시간)
#{paidLeafCnt}, -- 초록잎 지급량 (추가)
#{regusr}, -- 등록자
NOW() -- 등록 일시 (현재 시간)
)
]]>
</insert>
<!-- 마지막으로 삽입된 참여 고유번호 조회 -->
<select id="selectLastInsertedParticipationId" resultType="long">
<![CDATA[
SELECT LAST_INSERT_ID()
]]>
</select>
<!-- 혜택 보상 수령 정보 저장 -->
<insert id="insertRougameReceipt" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
<![CDATA[
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유번호
BNF_PRT_INNB, -- 혜택 참여 고유번호
BNF_RWD_CATE_DV_CD, -- 보상 항목 구분 코드
BNF_RWD_GODS_DV_CD, -- 보상 상품 구분 코드
MLG_RWD_AMT, -- 마일리지 금액
COUPON_INNB, -- 쿠폰고유번호
GOODS_INNB, -- 상품고유번호
REGUSR, -- 등록자
REGIST_DT -- 등록 일시
) VALUES (
#{bnfRcvInnb}, -- 혜택 보상수령 고유번호
#{bnfPrtInnb}, -- 혜택 참여 고유번호
#{bnfRwdCateDvCd}, -- 보상 항목 구분 코드
#{bnfRwdGodsDvCd}, -- 보상 상품 구분 코드
#{mlgRwdAmt}, -- 마일리지 금액
#{couponInnb}, -- 쿠폰고유번호
#{goodsInnb}, -- 상품고유번호
#{regusr}, -- 등록자
NOW() -- 등록 일시 (현재 시간)
)
]]>
</insert>
<!-- 보상 당첨 수량 차감 -->
<update id="decrementRewardQuantity" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO">
<![CDATA[
UPDATE GC_BENEFIT_REWARD
SET PRZWIN_QY = CASE
WHEN PRZWIN_QY > 0 THEN PRZWIN_QY - 1
ELSE 0
END
WHERE BNF_INNB = #{bnfInnb}
AND BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd}
]]>
</update>
<!-- 혜택 충전 설정 정보 조회 -->
<select id="selectBenefitChgConfig" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
AMT_FOR_CHG -- 기회 제공 기준 금액
FROM
GC_BENEFIT_CHG_CONFIG
WHERE
BNF_DV_CD = '040' -- 룰렛 혜택 구분 코드
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 추가
]]>
</select>
<!-- 게임 기회 신규 등록 -->
<insert id="insertGameChances" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO">
<![CDATA[
INSERT INTO GC_BENEFIT_CHARGE (
BNF_PURCHS_RCV_LOG_INNB, -- 혜택 구매확정 수신 로그 고유번호
SOPMAL_CD, -- 쇼핑몰 코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드 추가
BNF_DV_CD, -- 혜택 구분 코드
CHG_CNT, -- 충전 횟수
REGIST_DT -- 등록 일시
) VALUES (
0, -- 혜택 구매확정 수신 로그 고유번호
#{sopmalCd}, -- 쇼핑몰 코드
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
'040', -- 혜택 구분 코드 (룰렛)
#{remainingGameChances}, -- 계산된 게임 기회
NOW() -- 등록 일시 (현재 시간)
)
]]>
</insert>
<!-- 게임 기회 업데이트 -->
<update id="updateGameChances" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO">
<![CDATA[
UPDATE GC_BENEFIT_CHARGE
SET CHG_CNT = #{remainingGameChances},
REGIST_DT = NOW()
WHERE
SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드 조건 추가
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드 추가
AND BNF_DV_CD = '040'
]]>
</update>
<!-- 전체 보상 수량 상태 조회 -->
<select id="selectAllRewardsQuantityStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
COUNT(*) as totalRewards, -- 전체 보상 종류 수
COUNT(CASE WHEN PRZWIN_QY > 0 THEN 1 END) as availableRewards, -- 수량이 있는 보상 수
SUM(PRZWIN_QY) as totalQuantity -- 전체 남은 수량 합계
FROM
GC_BENEFIT_REWARD
WHERE
BNF_INNB = #{bnfInnb}
]]>
</select>
<!-- 실제 남은 수량을 계산하는 보상 조회 -->
<select id="selectAvailableRewards" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
r.BNF_INNB,
r.BNF_RWD_CATE_DV_CD,
r.BNF_RWD_GODS_DV_CD,
r.MLG_RWD_AMT,
r.COUPON_INNB,
r.ITM_NM,
r.PRZWIN_QY, -- 설정된 당첨 수량
r.PRZWIN_PRC,
r.DSCNT_AMT,
r.DSCNT_RT,
-- 실제 당첨된 수량 계산
COALESCE(
(SELECT COUNT(*)
FROM GC_BENEFIT_RECEIPT rcpt
INNER JOIN GC_BENEFIT_PARTCPTN part ON rcpt.BNF_PRT_INNB = part.BNF_PRT_INNB
WHERE part.BNF_INNB = r.BNF_INNB
AND rcpt.BNF_RWD_CATE_DV_CD = r.BNF_RWD_CATE_DV_CD), 0
) as ISSUED_QY, -- 실제 당첨된 수량
-- 남은 수량 계산
(r.PRZWIN_QY - COALESCE(
(SELECT COUNT(*)
FROM GC_BENEFIT_RECEIPT rcpt
INNER JOIN GC_BENEFIT_PARTCPTN part ON rcpt.BNF_PRT_INNB = part.BNF_PRT_INNB
WHERE part.BNF_INNB = r.BNF_INNB
AND rcpt.BNF_RWD_CATE_DV_CD = r.BNF_RWD_CATE_DV_CD), 0
)) as REMAINING_QY -- 남은 수량
FROM
GC_BENEFIT_REWARD r
WHERE
r.BNF_INNB = #{bnfInnb}
-- 남은 수량이 0보다 큰 보상만 조회
AND (r.PRZWIN_QY - COALESCE(
(SELECT COUNT(*)
FROM GC_BENEFIT_RECEIPT rcpt
INNER JOIN GC_BENEFIT_PARTCPTN part ON rcpt.BNF_PRT_INNB = part.BNF_PRT_INNB
WHERE part.BNF_INNB = r.BNF_INNB
AND rcpt.BNF_RWD_CATE_DV_CD = r.BNF_RWD_CATE_DV_CD), 0
)) > 0
ORDER BY r.PRZWIN_PRC DESC
]]>
</select>
<!-- 회원 디바이스 등록일 조회 -->
<select id="selectMemberDeviceRegistDate" parameterType="com.wb.domainserver.domain.gcone.bnft.rougame.vo.BORougameVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
<![CDATA[
SELECT
DATE_FORMAT(MDI.REGIST_DT, '%Y-%m-%d') as DEVICE_REGIST_DT
FROM
GC_MEMBER_DEVICE_INFO MDI
INNER JOIN
GC_MEMBER M ON MDI.MBR_INNB = M.MBR_INNB
AND MDI.MBR_DV_CD = M.MBR_DV_CD
WHERE
MDI.SOPMAL_CD = #{sopmalCd}
AND MDI.MBR_INNB = #{mbrInnb}
AND MDI.MBR_DV_CD = #{mbrDvCd}
ORDER BY MDI.REGIST_DT ASC
LIMIT 1
]]>
</select>
</mapper>

View File

@@ -0,0 +1,431 @@
<?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="com.wb.domainserver.domain.gcone.bnft.stepcnt.mapper.BOStepcntMapper">
<!-- 현재 회원의 최신 걸음 수 조회 -->
<select id="selectCurrentStepCount" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BP.BNF_PRT_INNB as BNF_PRT_INNB, -- 혜택 참여 고유번호
BP.STEP_CNT as STEP_CNT, -- 현재 걸음 수
BP.BNF_PRT_DT as participationDate, -- 참여 일시
BP.MBR_INNB as memberNo -- 회원 고유번호
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND BP.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE(BP.BNF_PRT_DT) = CURDATE() -- 오늘 날짜 기준
ORDER BY
BP.BNF_PRT_DT DESC -- 최신 정보 우선
LIMIT 1
</select>
<!-- 이번 달 만보 달성 현황 조회 -->
<select id="selectMonthlyStepCountAchievement" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
DATE(BP.BNF_PRT_DT) as achievementDate, -- 달성 일자
MAX(BP.STEP_CNT) as stepCount, -- 일별 최대 걸음 수
CASE WHEN MAX(BP.STEP_CNT) &gt;= 10000 THEN 'Y' ELSE 'N' END as isAchieved -- 만보 달성 여부
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND BP.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE_FORMAT(BP.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') -- 이번 달 필터링
GROUP BY
DATE(BP.BNF_PRT_DT) -- 일자별 그룹화
ORDER BY
DATE(BP.BNF_PRT_DT) -- 날짜순 정렬
</select>
<!-- 이번 달 만보 달성 횟수 조회 -->
<select id="selectMonthlyStepCountAchievementCount" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="int">
SELECT
COUNT(DISTINCT DATE(BP.BNF_PRT_DT)) as achievementCount -- 만보 달성한 날짜 수
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND BP.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE_FORMAT(BP.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') -- 이번 달 필터링
AND BP.STEP_CNT &gt;= 10000 -- 만보 이상 조건
</select>
<!-- 선택한 달의 일별 걸음 수 내역 조회 -->
<select id="selectDailyStepCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
DATE(BP.BNF_PRT_DT) as recordDate, -- 기록 일자
MAX(BP.STEP_CNT) as stepCount, -- 일별 최대 걸음 수
CASE
WHEN MAX(BP.STEP_CNT) &gt;= 10000 THEN 100
ELSE FLOOR(MAX(BP.STEP_CNT) * 100 / 10000)
END as achievementRate, -- 달성률(%) 계산
CASE
WHEN MAX(BP.STEP_CNT) &gt;= 10000 THEN 4 -- 만보 달성
WHEN MAX(BP.STEP_CNT) &gt;= 7500 THEN 3 -- 7500 이상
WHEN MAX(BP.STEP_CNT) &gt;= 5000 THEN 2 -- 5000 이상
WHEN MAX(BP.STEP_CNT) &gt;= 2500 THEN 1 -- 2500 이상
ELSE 0 -- 2500 미만
END as achievementLevel -- 달성 레벨(0~4)
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb} -- 회원 고유번호 조건
AND BP.MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE_FORMAT(BP.BNF_PRT_DT, '%Y-%m') = #{yearMonth} -- 선택한 년월 기준
GROUP BY
DATE(BP.BNF_PRT_DT) -- 일자별 그룹화
ORDER BY
DATE(BP.BNF_PRT_DT) -- 날짜순 정렬
</select>
<!-- 이번 달 만보기 사용 통계 조회 -->
<select id="selectMonthlyStepCountStats" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
ROUND((SELECT AVG(STEP_CNT)
FROM GC_BENEFIT_PARTCPTN
WHERE MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND DATE_FORMAT(BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
), 0) as avgStepCount, -- 하루 평균 걸음 수 (조인 영향 없이 계산)
rewardStats.surpriseGiftCount, -- 깜짝선물 획득 수
rewardStats.totalMileage -- 획득한 마일리지 합계
FROM (
SELECT
COUNT(CASE WHEN BR.BNF_RWD_CATE_DV_CD IN ('02030','02031','02032','02033','02034','02035','02036') THEN 1 END) as surpriseGiftCount,
SUM(CASE WHEN BR.BNF_RWD_GODS_DV_CD = '010' THEN BR.MLG_RWD_AMT ELSE 0 END) as totalMileage
FROM
GC_BENEFIT_PARTCPTN BP
LEFT JOIN
GC_BENEFIT_RECEIPT BR ON BR.BNF_PRT_INNB = BP.BNF_PRT_INNB
LEFT JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB AND B.BNF_DV_CD = '020'
WHERE
BP.MBR_INNB = #{mbrInnb}
AND BP.MBR_DV_CD = #{mbrDvCd}
AND DATE_FORMAT(BP.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m')
) rewardStats
</select>
<!-- 보상 정보 조회 -->
<select id="selectStepCountReward" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB as bnfInnb, -- 혜택 고유번호
BR.BNF_RWD_CATE_DV_CD as rewardCategoryCode, -- 보상 항목 구분 코드
BR.BNF_RWD_GODS_DV_CD as rewardGoodsCode, -- 보상 상품 구분 코드
BR.MLG_RWD_AMT as mileageAmount, -- 마일리지 보상 금액
BR.COUPON_INNB as couponNo, -- 쿠폰 고유번호
BR.RWD_CND_CNT as rewardConditionCount -- 보상 조건 걸음 수
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_REWARD BR ON B.BNF_INNB = BR.BNF_INNB
WHERE
B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND B.USE_AT = 'Y' -- 사용 여부 체크
AND B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (B.BNF_BGN_DT IS NULL OR B.BNF_BGN_DT &lt;= NOW()) -- 시작일 체크
AND (B.BNF_END_DT IS NULL OR B.BNF_END_DT &gt;= NOW()) -- 종료일 체크
AND BR.BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd} -- 요청한 보상 카테고리
</select>
<!-- 깜짝 선물 위치 정보 조회 (요일에 따라 변경) -->
<select id="selectSurpriseGiftPosition" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB as bnfInnb, -- 혜택 고유번호
BR.BNF_RWD_CATE_DV_CD as rewardCategoryCode, -- 보상 항목 구분 코드
BR.RWD_CND_CNT as surprisePosition -- 깜짝 선물 위치 (테이블에 정의된 값)
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_REWARD BR ON B.BNF_INNB = BR.BNF_INNB
WHERE
B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND B.USE_AT = 'Y' -- 사용 여부 체크
AND B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (B.BNF_BGN_DT IS NULL OR B.BNF_BGN_DT &lt;= NOW()) -- 시작일 체크
AND (B.BNF_END_DT IS NULL OR B.BNF_END_DT &gt;= NOW()) -- 종료일 체크
AND BR.BNF_RWD_CATE_DV_CD = CONCAT('0203', WEEKDAY(NOW())) -- 요일에 맞는 깜짝선물 코드
LIMIT 1
</select>
<!-- 초록잎 지급 개수 조회 -->
<select id="selectLeafCounts" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
PYMNT_CNT, -- 지급 초록잎 개수
SPECIAL_CNT -- 스페셜 지급 초록잎 개수
FROM
GC_BENEFIT_CPSLMKN
WHERE
BNF_DV_CD = '020' -- 만보기 혜택 구분 코드로 수정
AND SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
</select>
<!-- 걸음수 정보 저장/업데이트 -->
<insert id="insertOrUpdateStepCount" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO">
INSERT INTO GC_BENEFIT_PARTCPTN (
BNF_INNB,
BNF_PRT_DT,
MBR_INNB,
MBR_DV_CD,
STEP_CNT,
REGIST_DT,
PRT_LEAF_CNT,
REGUSR
) VALUES (
#{bnfInnb}, -- 혜택 고유번호
NOW(), -- 현재 시간
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
#{stepCnt}, -- 걸음 수
NOW(), -- 등록 시간
#{paidLeafCnt}, -- 적립된 초록잎 개수
#{regusr} -- 등록자
) ON DUPLICATE KEY UPDATE
STEP_CNT = #{stepCnt}, -- 걸음 수 업데이트
UPDT_DT = NOW(), -- 수정 시간
UPDUSR = #{updusr}, -- 수정자
PRT_LEAF_CNT = CASE
WHEN #{stepCnt} &gt;= 10000 AND STEP_CNT &lt; 10000 THEN #{paidLeafCnt}
WHEN #{stepCnt} &gt;= 10000 THEN PRT_LEAF_CNT
ELSE PRT_LEAF_CNT
END -- 만보 최초 달성 시에만 초록잎 추가
</insert>
<!-- 보상 수령 내역 저장 -->
<insert id="insertStepCountReward" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO">
<selectKey keyProperty="bnfRcvInnb" resultType="java.math.BigInteger" order="BEFORE">
SELECT IFNULL(MAX(BNF_RCV_INNB), 0) + 1 FROM GC_BENEFIT_RECEIPT
</selectKey>
INSERT INTO GC_BENEFIT_RECEIPT (
BNF_RCV_INNB, -- 혜택 보상수령 고유 번호
BNF_PRT_INNB,
BNF_RWD_CATE_DV_CD,
BNF_RWD_GODS_DV_CD,
MLG_RWD_AMT,
COUPON_INNB,
REGUSR,
REGIST_DT
) VALUES (
#{bnfRcvInnb}, -- 생성된 고유 번호
#{bnfPrtInnb}, -- 혜택 참여 고유번호
#{bnfRwdCateDvCd}, -- 보상 항목 구분 코드
#{bnfRwdGodsDvCd}, -- 보상 상품 구분 코드
#{mlgRwdAmt}, -- 마일리지 금액
#{couponInnb}, -- 쿠폰 고유번호
#{regusr}, -- 등록자(회원)
NOW() -- 등록 시간
)
</insert>
<!-- 10회 달성 시 추가 보상 대상 상품 정보 조회 -->
<select id="selectMonthlyAchievementReward" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB as bnfInnb, -- 혜택 고유번호
B.BNF_SJ as bnfTitle, -- 혜택 제목
B.SCR_RWD_IMG as rewardImageUrl, -- 보상 이미지 URL
B.SCR_RWD_LINK_URL as rewardLinkUrl, -- 보상 링크 URL
BR.MLG_RWD_AMT as mileageAmount, -- 마일리지 보상 금액
BR.ITM_NM as itemName -- 표시명
FROM
GC_BENEFIT B
INNER JOIN
GC_BENEFIT_REWARD BR ON B.BNF_INNB = BR.BNF_INNB
WHERE
B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND B.USE_AT = 'Y' -- 사용 여부 체크
AND B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (B.BNF_BGN_DT IS NULL OR B.BNF_BGN_DT &lt;= NOW()) -- 시작일 체크
AND (B.BNF_END_DT IS NULL OR B.BNF_END_DT &gt;= NOW()) -- 종료일 체크
AND BR.BNF_RWD_CATE_DV_CD = '02020' -- 만보기 월누적10회 코드
LIMIT 1
</select>
<!-- 만보기 동의 상태 조회 -->
<select id="selectStepcntAgreement" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
AGRE_AT
FROM
GC_BENEFIT_AGREE
WHERE
SOPMAL_CD = #{sopmalCd}
AND MBR_INNB = #{mbrInnb}
AND MBR_DV_CD = #{mbrDvCd}
AND BNF_DV_CD = '020'
AND BNF_AGRE_DV_CD = '020'
</select>
<!-- 만보기 동의 정보 저장/업데이트 -->
<insert id="insertStepcntAgreement" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO">
INSERT INTO GC_BENEFIT_AGREE (
SOPMAL_CD, -- 쇼핑몰 코드
MBR_INNB, -- 회원 고유번호
MBR_DV_CD, -- 회원 구분 코드
BNF_DV_CD, -- 혜택 구분 코드
BNF_AGRE_DV_CD, -- 혜택 동의 구분 코드
BNF_INNB, -- 혜택 고유번호
AGRE_AT, -- 동의 여부
REGUSR, -- 등록자
REGIST_DT -- 등록 시간
) VALUES (
#{sopmalCd}, -- 쇼핑몰 코드
#{mbrInnb}, -- 회원 고유번호
#{mbrDvCd}, -- 회원 구분 코드
'020', -- 혜택 구분 코드(만보기)
'020', -- 혜택 동의 구분 코드(만보기)
#{bnfInnb}, -- 혜택 고유번호
#{agreeYn}, -- 동의 여부
#{regusr}, -- 등록자(회원)
NOW() -- 등록 시간
)
</insert>
<!-- 만보기 동의 정보 업데이트 -->
<update id="updateStepcntAgreement" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO">
UPDATE GC_BENEFIT_AGREE
SET AGRE_AT = #{agreeYn}, -- 동의 여부
REGIST_DT = NOW(), -- 등록 시간
REGUSR = #{regusr} -- 등록자(회원)
WHERE SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND MBR_INNB = #{mbrInnb} -- 회원 고유번호
AND MBR_DV_CD = #{mbrDvCd} -- 회원 구분 코드
AND BNF_DV_CD = '020' -- 혜택 구분 코드(만보기)
AND BNF_AGRE_DV_CD = '020' -- 혜택 동의 구분 코드(만보기)
</update>
<!-- 만보기 화면의 기본 정보 조회 -->
<select id="selectStepcntBaseInfo" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
B.BNF_INNB as BNF_INNB, -- 혜택 고유번호
B.BNF_SJ as BNF_TITLE, -- 혜택 제목
B.BNF_WORDS_CN as BNF_GUIDANCE, -- 혜택 안내
B.SCR_RWD_IMG as REWARD_IMG, -- 화면 대표 이미지
B.SCR_REPRSNT_LINK_URL as REPRESENT_LINK_URL, -- 화면 대표 링크 URL
B.SCR_RWD_LINK_URL as REWARD_LINK_URL, -- 화면 보상 링크 URL
(
SELECT BCT.CN_DC
FROM GC_BENEFIT_CONTENT BCT
WHERE BCT.BNF_INNB = B.BNF_INNB
LIMIT 1
) as CONTENT_DESCRIPTION, -- 내용 설명
(
SELECT GROUP_CONCAT(BR.BNF_RWD_CATE_DV_CD)
FROM GC_BENEFIT_REWARD BR
WHERE BR.BNF_INNB = B.BNF_INNB
) as REWARD_CATEGORIES, -- 보상 항목 구분 코드 목록
(
SELECT BR.ITM_NM
FROM GC_BENEFIT_REWARD BR
WHERE BR.BNF_INNB = B.BNF_INNB
AND BR.BNF_RWD_CATE_DV_CD = '02020' -- 만보기 월누적10회 코드
LIMIT 1
) as MONTHLY_REWARD_NAME, -- 10회 달성 시 받을 제품 이름
(
SELECT BR.MLG_RWD_AMT
FROM GC_BENEFIT_REWARD BR
WHERE BR.BNF_INNB = B.BNF_INNB
AND BR.BNF_RWD_CATE_DV_CD = '02020' -- 만보기 월누적10회 코드
LIMIT 1
) as MONTHLY_REWARD_MILEAGE -- 10회 달성 시 받을 마일리지
FROM
GC_BENEFIT B
WHERE
B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND B.USE_AT = 'Y' -- 사용 여부 체크
AND B.SOPMAL_CD = #{sopmalCd} -- 쇼핑몰 코드
AND (B.BNF_BGN_DT IS NULL OR B.BNF_BGN_DT &lt;= NOW()) -- 시작일 체크
AND (B.BNF_END_DT IS NULL OR B.BNF_END_DT &gt;= NOW()) -- 종료일 체크
LIMIT 1
</select>
<!-- 이번 달 깜짝선물 획득 횟수 조회 -->
<select id="selectMonthlySurpriseGiftCount" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="int">
SELECT
COUNT(BR.BNF_RCV_INNB) as surpriseGiftCount
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT_RECEIPT BR ON BR.BNF_PRT_INNB = BP.BNF_PRT_INNB
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb}
AND BP.MBR_DV_CD = #{mbrDvCd}
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE_FORMAT(BP.BNF_PRT_DT, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') -- 이번 달 필터링
AND BR.BNF_RWD_CATE_DV_CD IN ('02030','02031','02032','02033','02034','02035','02036') -- 깜짝선물 카테고리 코드들
</select>
<!-- 오늘 깜짝선물 수령 여부 확인 -->
<select id="selectTodayGiftReceiptStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
COUNT(BR.BNF_RCV_INNB) as receiptCount,
CASE WHEN COUNT(BR.BNF_RCV_INNB) > 0 THEN 'Y' ELSE 'N' END as isReceived
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT_RECEIPT BR ON BR.BNF_PRT_INNB = BP.BNF_PRT_INNB
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb}
AND BP.MBR_DV_CD = #{mbrDvCd}
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE(BP.BNF_PRT_DT) = CURDATE() -- 오늘 날짜 기준
AND BR.BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd} -- 오늘의 깜짝선물 카테고리
</select>
<!-- 오늘 마일리지 수령 여부 확인 -->
<select id="selectTodayMileageReceiptStatus" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
COUNT(BR.BNF_RCV_INNB) as receiptCount,
CASE WHEN COUNT(BR.BNF_RCV_INNB) > 0 THEN 'Y' ELSE 'N' END as isReceived
FROM
GC_BENEFIT_PARTCPTN BP
INNER JOIN
GC_BENEFIT_RECEIPT BR ON BR.BNF_PRT_INNB = BP.BNF_PRT_INNB
INNER JOIN
GC_BENEFIT B ON BP.BNF_INNB = B.BNF_INNB
WHERE
BP.MBR_INNB = #{mbrInnb}
AND BP.MBR_DV_CD = #{mbrDvCd}
AND B.BNF_DV_CD = '020' -- 만보기 혜택 코드
AND DATE(BP.BNF_PRT_DT) = CURDATE() -- 오늘 날짜 기준
AND BR.BNF_RWD_CATE_DV_CD = #{bnfRwdCateDvCd} -- 보상 카테고리 (02010: 일일만보, 02020: 월누적10회)
</select>
<!-- 만보기 참여 안내 조회-->
<select id="selectStepcntGuide" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_WORDS_CN
FROM
GC_BENEFIT
WHERE
BNF_INNB = #{bnfInnb}
AND SOPMAL_CD = #{sopmalCd}
</select>
<!-- BNF_INNB 조회 -->
<select id="selectBnfInnb" parameterType="com.wb.domainserver.domain.gcone.bnft.stepcnt.vo.BOStepcntVO" resultType="com.wb.domainserver.util.dataaccess.DataMap">
SELECT
BNF_INNB
FROM
GC_BENEFIT
WHERE
BNF_DV_CD = '020'
AND SOPMAL_CD = #{sopmalCd}
AND USE_AT = 'Y'
</select>
</mapper>