merge master into develop - CscListRForm.jsp FAQ 아코디언 버그 수정
This commit is contained in:
@@ -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) >= COALESCE(SUM(daily_target), 0)
|
||||
AND COALESCE(SUM(daily_target), 0) > 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 > 0
|
||||
)
|
||||
</select>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user