환불완료시 회원등급 업데이트 기능 추가

This commit is contained in:
itn 2023-08-16 12:22:38 +09:00
parent 7d32430968
commit daa6b8bd49
5 changed files with 209 additions and 70 deletions

View File

@ -48,6 +48,8 @@ import itn.let.mjo.pay.service.RefundService;
import itn.let.mjo.pay.service.RefundVO;
import itn.let.mjo.tax.service.TaxService;
import itn.let.mjo.tax.service.TaxVO;
import itn.let.sym.grd.service.MberGrdService;
import itn.let.sym.grd.service.MberGrdVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.service.EgovLoginService;
@ -107,6 +109,9 @@ public class RefundController {
@Resource(name = "MjonEventService")
private MjonEventService mjonEventService;
@Resource(name = "mberGrdService")
MberGrdService mberGrdService;
/**
* 환불요청 목록 페이지
* @param RefundVO
@ -542,7 +547,15 @@ public class RefundController {
mjonPayVO.setMemo("환불처리 " + refundVO.getRefundPoint() + "포인트");
mjonPayService.insertPoint(mjonPayVO);
// 등급제 Start
// 회원별 등급 적용
MberGrdVO mberGrdVO = new MberGrdVO();
mberGrdVO.setMberId(refundVO.getMberId());
mberGrdVO.setAmt("0");
mberGrdVO.setMoid("");
mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);
// End
//modelAndView.addObject("status", "success");
s_status = "success";
@ -722,6 +735,15 @@ public class RefundController {
}
}
// 등급제 Start
// 회원별 등급 적용
MberGrdVO mberGrdVO = new MberGrdVO();
mberGrdVO.setMberId(refundVO.getMberId());
mberGrdVO.setAmt("0");
mberGrdVO.setMoid("");
mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);
// End
}else if(afterStatus.equals("4")) {// 처리불가로 변경
if(beforeStatus.equals("3")) {

View File

@ -9,6 +9,9 @@ public interface MberGrdService {
// 등급제 단가 추출 => 시스템 단가에 적용
public JoinSettingVO selectMberGrdDefaultInfo(JoinSettingVO sysJoinSetVO, String mberId) throws Exception;
// 등급제 단가 추출 => 시스템 단가에 적용 Last
public JoinSettingVO selectMberGrdDefaultInfoLast(JoinSettingVO sysJoinSetVO, String mberId) throws Exception;
// 등급제 설정 일괄변경
public int updateMberSetting(MberGrdVO mberGrdVO) throws Exception;
@ -85,9 +88,15 @@ public interface MberGrdService {
// 회원별 등급 적용
public void mberGrdSaveByUser(MberGrdVO mberGrdVO) throws Exception;
// 회원별 등급 적용 Last
public void mberGrdSaveByUserLast(MberGrdVO mberGrdVO) throws Exception;
// 회원별 등급 적용(로그인시 사용 => 히스토리 저장 제외)
public void mberGrdSaveByUserNoHist(MberGrdVO mberGrdVO) throws Exception;
// 회원별 등급 적용(로그인시 사용 => 히스토리 저장 제외) Last
public void mberGrdSaveByUserNoHistLast(MberGrdVO mberGrdVO) throws Exception;
// 회원별 등급제 대상여부
int selectMberGrdCnt(String mberId) throws Exception;
@ -100,6 +109,8 @@ public interface MberGrdService {
// 회원별 등급 저장여부
int selectMberGrdSaveCnt(String mberId) throws Exception;
// 회원별 등급제 기간내, 최종결제이후 환불총금액
int selectMberGrdRefundSum(String mberId) throws Exception;
// 회원별 등급 히스토리 등록
public void insertMberGrdHist(MberGrdVO mberGrdVO) throws Exception;

View File

@ -158,6 +158,10 @@ public class MberGrdDAO extends EgovAbstractDAO {
return (int) select("mberGrdDAO.selectMberGrdSaveCnt", mberId);
}
// 회원별 등급제 기간내, 최종결제이후 환불총금액
public int selectMberGrdRefundSum(String mberId) throws Exception{
return (int) select("mberGrdDAO.selectMberGrdRefundSum", mberId);
}
// 회원별 등급 히스토리 등록
public void insertMberGrdHist(MberGrdVO mberGrdVO) throws Exception{

View File

@ -1,9 +1,12 @@
package itn.let.sym.grd.service.impl;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
@ -35,38 +38,6 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
@Resource(name="egovGrdSettingHistIdGnrService")
private EgovIdGnrService gshidgenService;
// 등급제 단가 추출 => 시스템 단가에 적용
@Override
public JoinSettingVO selectMberGrdDefaultInfo(JoinSettingVO sysJoinSetVO, String mberId) throws Exception {
/*
// 공백제거
mberId = mberId.trim();
// Step 1. 등급제 시행 ON 일경우
if (StringUtils.isNotEmpty(mberId)) {
MberGrdVO mberGrdVO = new MberGrdVO();
MberGrdVO mberGrdVO1 = new MberGrdVO();
mberGrdVO1 = selectMberSettingDetail(mberGrdVO);
if (mberGrdVO1.getGrdNoti().equals("Y")) {
mberGrdVO = new MberGrdVO();
mberGrdVO = selectMberGrdInfo(mberId);
if (null != mberGrdVO) {
if(mberGrdVO.getShortPrice() > 1 && mberGrdVO.getLongPrice() > 1 && mberGrdVO.getPicturePrice() > 1 && mberGrdVO.getPicture2Price() > 1 && mberGrdVO.getPicture3Price() > 1) {
sysJoinSetVO.setShortPrice(mberGrdVO.getShortPrice());
sysJoinSetVO.setLongPrice(mberGrdVO.getLongPrice());
sysJoinSetVO.setPicturePrice(mberGrdVO.getPicturePrice());
sysJoinSetVO.setPicture2Price(mberGrdVO.getPicture2Price());
sysJoinSetVO.setPicture3Price(mberGrdVO.getPicture3Price());
}
}
}
}
*/
return sysJoinSetVO;
}
// 등급제 시행여부 변경
@Override
public int updateMberSetting(MberGrdVO mberGrdVO) throws Exception {
@ -276,11 +247,76 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
return mberGrdDAO.updateMberGrdRestoreByUser(mberGrdVO);
}
// 등급제 단가 추출 => 시스템 단가에 적용
@Override
public JoinSettingVO selectMberGrdDefaultInfo(JoinSettingVO sysJoinSetVO, String mberId) throws Exception {
// 등급제 단가 추출 => 시스템 단가에 적용 Last
//sysJoinSetVO = selectMberGrdDefaultInfoLast(sysJoinSetVO, mberId);
return sysJoinSetVO;
}
// 회원별 등급 적용
@Override
public void mberGrdSaveByUser(MberGrdVO mberGrdVO) throws Exception {
/*
// 회원별 등급 적용 Last
//mberGrdSaveByUserLast(mberGrdVO);
}
// 회원별 등급 적용(로그인, 환불시 사용 => 히스토리 저장 제외)
@Override
public void mberGrdSaveByUserNoHist(MberGrdVO mberGrdVO) throws Exception {
// 회원별 등급 적용(로그인, 환불시 사용 => 히스토리 저장 제외)
//mberGrdSaveByUserNoHistLast(mberGrdVO);
}
// 등급제 단가 추출 => 시스템 단가에 적용 Last
@Override
public JoinSettingVO selectMberGrdDefaultInfoLast(JoinSettingVO sysJoinSetVO, String mberId) throws Exception {
System.out.println("START 등급제 단가 추출 => 시스템 단가에 적용");
// 공백제거
mberId = mberId.trim();
if (StringUtils.isNotEmpty(mberId)) {
System.out.println("아이디 : " + mberId);
MberGrdVO mberGrdVO = new MberGrdVO();
// Step 1. 등급제 시행 ON 일경우
MberGrdVO mberGrdVO1 = new MberGrdVO();
mberGrdVO1 = selectMberSettingDetail(mberGrdVO);
System.out.println("Step 1. 등급제 시행 ON 일경우");
if (mberGrdVO1.getGrdNoti().equals("Y")) {
mberGrdVO = new MberGrdVO();
// Step 2. 등급 정보 조회
mberGrdVO = selectMberGrdInfo(mberId);
System.out.println("Step 2. 등급 정보 조회");
if (null != mberGrdVO) {
if(mberGrdVO.getShortPrice() > 1 && mberGrdVO.getLongPrice() > 1 && mberGrdVO.getPicturePrice() > 1 && mberGrdVO.getPicture2Price() > 1 && mberGrdVO.getPicture3Price() > 1) {
sysJoinSetVO.setShortPrice(mberGrdVO.getShortPrice());
sysJoinSetVO.setLongPrice(mberGrdVO.getLongPrice());
sysJoinSetVO.setPicturePrice(mberGrdVO.getPicturePrice());
sysJoinSetVO.setPicture2Price(mberGrdVO.getPicture2Price());
sysJoinSetVO.setPicture3Price(mberGrdVO.getPicture3Price());
}
}
}
}
System.out.println("END 등급제 단가 추출 => 시스템 단가에 적용");
return sysJoinSetVO;
}
// 회원별 등급 적용 Last
@Override
public void mberGrdSaveByUserLast(MberGrdVO mberGrdVO) throws Exception {
try {
System.out.println("START 회원별 등급 적용");
System.out.println("아이디 : " + mberGrdVO.getMberId());
// 현재 날짜 구하기
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 포맷 정의
@ -292,15 +328,18 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 1. 등급제 시행 ON 일경우(시행일자 진행여부 Y일경우)
MberGrdVO mberGrdVO1 = new MberGrdVO();
mberGrdVO1 = selectMberSettingDetail(mberGrdVO);
System.out.println("Step 1. 등급제 시행 ON 일경우(시행일자 진행여부 Y일경우)");
if (mberGrdVO1.getGrdNoti().equals("Y")) {
mberGrdVO.setGrdNewDate(mberGrdVO1.getGrdNewDate());
// Step 2. 문자할인, B선라인, 스팸회원 대상자 제외
int isMberGrd = selectMberGrdCnt(mberGrdVO.getMberId()); // 등급제 대상여부(1: 대상, 0: 미대상)
System.out.println("Step 2. 문자할인, B선라인, 스팸회원 대상자 제외");
if(isMberGrd == 1) {
// Step 3. 누적결제금액(이벤트금액 제외) 추출 등급 조회
MberGrdVO mberGrdVO3 = new MberGrdVO();
mberGrdVO3 = selectMberGrdAmtDetail(mberGrdVO);
System.out.println("Step 3. 누적결제금액(이벤트금액 제외) 추출 및 등급 조회");
if (null != mberGrdVO3) {
mberGrdVO.setTotAmt(mberGrdVO3.getTotAmt());
mberGrdVO.setGrdSetNo(mberGrdVO3.getGrdSetNo());
@ -308,6 +347,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 4. 등급제 설정값 조회
MberGrdVO mberGrdVO4 = new MberGrdVO();
mberGrdVO4 = selectMberGrdSettingDetail(mberGrdVO);
System.out.println("Step 4. 등급제 설정값 조회");
if (null != mberGrdVO4) {
mberGrdVO.setAmt(mberGrdVO.getAmt());
mberGrdVO.setTotAmt(mberGrdVO.getTotAmt());
@ -324,6 +364,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 5. 인서트 Or 업데이트
MberGrdVO mberGrdVO5 = new MberGrdVO();
mberGrdVO5 = selectMberGrdDetail(mberGrdVO);
System.out.println("Step 5. 인서트 Or 업데이트");
if (null != mberGrdVO5) {
updateMberGrdOk(mberGrdVO);
@ -341,6 +382,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
}
}
}
System.out.println("START 회원별 등급 적용");
}
catch (Exception e) {
// Slack 메시지 발송(단순본문)
@ -350,14 +392,16 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
System.out.println("#############################################################");
System.out.println(mberGrdVO.getMberId() + "님 결제중 회원등급 저장 오류");
}
*/
}
// 회원별 등급 적용(로그인 사용 => 히스토리 저장 제외)
// 회원별 등급 적용(로그인, 환불 사용 => 히스토리 저장 제외)
@Override
public void mberGrdSaveByUserNoHist(MberGrdVO mberGrdVO) throws Exception {
/*
public void mberGrdSaveByUserNoHistLast(MberGrdVO mberGrdVO) throws Exception {
try {
System.out.println("START 회원별 등급 적용(로그인, 환불시 사용 => 히스토리 저장 제외)");
System.out.println("아이디 : " + mberGrdVO.getMberId());
// 현재 날짜 구하기
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 포맷 정의
@ -369,15 +413,18 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 1. 등급제 시행 ON 일경우(시행일자 진행여부 Y일경우)
MberGrdVO mberGrdVO1 = new MberGrdVO();
mberGrdVO1 = selectMberSettingDetail(mberGrdVO);
System.out.println("Step 1. 등급제 시행 ON 일경우(시행일자 진행여부 Y일경우)");
if (mberGrdVO1.getGrdNoti().equals("Y")) {
mberGrdVO.setGrdNewDate(mberGrdVO1.getGrdNewDate());
// Step 2. 문자할인, B선라인, 스팸회원 대상자 제외
int isMberGrd = selectMberGrdCnt(mberGrdVO.getMberId()); // 등급제 대상여부(1: 대상, 0: 미대상)
System.out.println("Step 2. 문자할인, B선라인, 스팸회원 대상자 제외");
if(isMberGrd == 1) {
// Step 3. 누적결제금액(이벤트금액 제외) 추출 등급 조회
MberGrdVO mberGrdVO3 = new MberGrdVO();
mberGrdVO3 = selectMberGrdAmtDetail(mberGrdVO);
System.out.println("Step 3. 누적결제금액(이벤트금액 제외) 추출 및 등급 조회");
if (null != mberGrdVO3) {
mberGrdVO.setTotAmt(mberGrdVO3.getTotAmt());
mberGrdVO.setGrdSetNo(mberGrdVO3.getGrdSetNo());
@ -385,6 +432,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 4. 등급제 설정값 조회
MberGrdVO mberGrdVO4 = new MberGrdVO();
mberGrdVO4 = selectMberGrdSettingDetail(mberGrdVO);
System.out.println("Step 4. 누적결제금액(이벤트금액 제외) 추출 및 등급 조회");
if (null != mberGrdVO4) {
mberGrdVO.setAmt(mberGrdVO.getAmt());
mberGrdVO.setTotAmt(mberGrdVO.getTotAmt());
@ -401,6 +449,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
// Step 5. 인서트 Or 업데이트
MberGrdVO mberGrdVO5 = new MberGrdVO();
mberGrdVO5 = selectMberGrdDetail(mberGrdVO);
System.out.println("Step 5. 인서트 Or 업데이트");
if (null != mberGrdVO5) {
updateMberGrdOk(mberGrdVO);
}
@ -412,6 +461,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
}
}
}
System.out.println("END 회원별 등급 적용(로그인, 환불시 사용 => 히스토리 저장 제외)");
}
catch (Exception e) {
// Slack 메시지 발송(단순본문)
@ -421,7 +471,7 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
System.out.println("#############################################################");
System.out.println(mberGrdVO.getMberId() + "님 로그인중 회원등급 저장 오류");
}
*/
}
// 회원별 등급제 대상여부
@ -460,6 +510,14 @@ public class MberGrdServiceImpl extends EgovAbstractServiceImpl implements MberG
return mberGrdDAO.selectMberGrdSaveCnt(mberId);
}
// 회원별 등급제 기간내, 최종결제이후 환불총금액
@Override
public int selectMberGrdRefundSum(String mberId) throws Exception{
// 공백제거
mberId = mberId.trim();
return mberGrdDAO.selectMberGrdRefundSum(mberId);
}
// 회원별 등급 히스토리 등록
@Override

View File

@ -417,7 +417,7 @@
SELECT
S.USER_ID
, SUM(S.AMT) AS AMT_SUM_ORIGIN
, (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
, (SUM(S.AMT) - IFNULL(SUM(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10)), 0)) AS AMT_SUM
, (
SELECT IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) FROM MJ_REFUND R
WHERE S.USER_ID = R.MBER_ID
@ -643,7 +643,7 @@
SELECT
S.USER_ID
, SUM(S.AMT) AS AMT_SUM_ORIGIN
, (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
, (SUM(S.AMT) - IFNULL(SUM(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10)), 0)) AS AMT_SUM
, (
SELECT IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) FROM MJ_REFUND R
WHERE S.USER_ID = R.MBER_ID
@ -712,7 +712,7 @@
SELECT
S.USER_ID
, SUM(S.AMT) AS AMT_SUM_ORIGIN
, (SUM(S.AMT) - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS AMT_SUM
, (SUM(S.AMT) - IFNULL(SUM(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10)), 0)) AS AMT_SUM
, (
SELECT IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) FROM MJ_REFUND R
WHERE S.USER_ID = R.MBER_ID
@ -947,7 +947,18 @@
LIMIT 1
</select>
<!-- 회원별 등급제 기간내, 최종결제이후 환불총금액 -->
<select id="mberGrdDAO.selectMberGrdRefundSum" parameterClass="String" resultClass="Integer">
SELECT
IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) refundSum
FROM MJ_REFUND R
WHERE R.MBER_ID = #mberId#
AND R.REFUND_STATUS = '3'
AND R.REFUND_DIVISION = '1'
AND R.REFUND_HANDLE_PNTTM >= (SELECT G.GRD_DATE FROM MJ_MBER_GRD_INFO G WHERE G.MBER_ID = #mberId#)
AND R.REFUND_HANDLE_PNTTM >= (SELECT MAX(S.REG_DATE) FROM MJ_PG S WHERE S.USER_ID = #mberId# AND S.PG_STATUS = '1')
</select>
<!-- 회원별 등급 히스토리 등록 -->
<insert id="mberGrdDAO.insertMberGrdHist" parameterClass="mberGrdVO">
INSERT INTO MJ_MBER_GRD_HIST
@ -991,34 +1002,67 @@
<!-- 회원별 등급 히스토리 목록 => 등급제 시행일이후 목록(사용자화면용) -->
<!-- AND A.GRD_DATE >= (SELECT S.GRD_DATE FROM MJ_MBER_GRD_INFO S WHERE S.MBER_ID = #mberId#) -->
<select id="mberGrdDAO.selectMberGrdHistByGrdDateList" parameterClass="mberGrdVO" resultClass="mberGrdVO">
SELECT
COUNT(MBER_ID) OVER() AS totCnt
, A.MBER_ID AS mberId
, A.GRD_SET_NO AS grdSetNo
, B.GRD_SET_NM AS grdSetNm
, A.SHORT_PRICE AS shortPrice
, A.LONG_PRICE AS longPrice
, A.PICTURE_PRICE AS picturePrice
, A.PICTURE2_PRICE AS picture2Price
, A.PICTURE3_PRICE AS picture3Price
, A.AMT AS amt
, A.TOT_AMT AS totAmt
, A.GRD_DATE AS grdDate
, A.MOID AS moid
, A.REG_ID AS regId
, DATE_FORMAT(A.REG_DATE, '%Y-%m-%d %H:%i') AS regDate
, A.EDIT_ID AS editId
, A.EDIT_DATE AS editDate
FROM MJ_MBER_GRD_HIST A
<![CDATA[
SELECT
M3.totCnt
, M3.mberId
, M3.regDate
, M3.amt
, M3.amtStepSum
, M3.refundSum
, M3.totAmt
, M3.GRD_SET_NO AS grdSetNo
, B.GRD_SET_NM AS grdSetNm
FROM (
SELECT
M2.totCnt
, M2.mberId
, M2.regDate
, M2.amt
, M2.amtStepSum
, M2.refundSum
, (IFNULL(ROUND(M2.amtStepSum - M2.refundSum), 0)) AS totAmt
, (
SELECT IFNULL(MIN(S1.GRD_SET_NO), (SELECT MAX(GRD_SET_NO) FROM MJ_MBER_GRD_SETTING)) FROM MJ_MBER_GRD_SETTING S1 WHERE S1.STD_AMT <= IFNULL(ROUND(M2.amtStepSum - M2.refundSum), 0)
) GRD_SET_NO
FROM (
SELECT
M.totCnt
, M.mberId
, DATE_FORMAT(M.REG_DATE, '%Y-%m-%d %H:%i') AS regDate
, M.amt
, SUM(M.amt) OVER(ORDER BY M.REG_DATE ASC) AS amtStepSum
, (
SELECT IFNULL(ROUND(SUM(R.TRNSF_CASH)), 0) FROM MJ_REFUND R
WHERE M.mberId = R.MBER_ID
AND R.REFUND_STATUS = '3'
AND R.REFUND_DIVISION = '1'
AND R.REFUND_HANDLE_PNTTM >= (SELECT G.GRD_DATE FROM MJ_MBER_GRD_INFO G WHERE G.MBER_ID = M.mberId)
AND M.REG_DATE >= R.REFUND_HANDLE_PNTTM
) refundSum
FROM (
SELECT
COUNT(S.USER_ID) OVER() AS totCnt
, S.USER_ID AS mberId
, S.REG_DATE
, (S.AMT - IFNULL(SS.EVENT_FRST_CASH + ROUND(SS.EVENT_FRST_CASH / 10), 0)) AS amt
FROM MJ_PG S
LEFT OUTER JOIN MJ_EVENT_MBER_INFO SS
ON S.USER_ID = SS.MBER_ID
AND S.MOID = SS.EVENT_PG_MOID
WHERE
S.USER_ID = #mberId#
AND S.PG_STATUS = '1'
AND S.REG_DATE >= (SELECT G.GRD_DATE FROM MJ_MBER_GRD_INFO G WHERE G.MBER_ID = #mberId#)
ORDER BY S.REG_DATE ASC
) M
ORDER BY M.REG_DATE DESC
LIMIT #recordCountPerPage# OFFSET #firstIndex#
) M2
) M3
INNER JOIN MJ_MBER_GRD_SETTING B
ON A.GRD_SET_NO = B.GRD_SET_NO
WHERE 1=1
AND A.MBER_ID = #mberId#
AND IFNULL(TRIM(A.MOID), '') != ''
AND A.TOT_AMT > 0
AND A.GRD_DATE >= (SELECT S.GRD_DATE FROM MJ_MBER_GRD_INFO S WHERE S.MBER_ID = #mberId#)
ORDER BY A.REG_DATE DESC
LIMIT #recordCountPerPage# OFFSET #firstIndex#
ON M3.GRD_SET_NO = B.GRD_SET_NO
]]>
</select>
<!-- 회원별 등급 히스토리 목록 -->