이지우 - 사용자 헤더 영역에 단가 및 발송가능 건수 내용 추가

This commit is contained in:
JIWOO 2025-07-30 09:52:28 +09:00
parent ebeddf452a
commit 4480ad4c27
8 changed files with 323 additions and 50 deletions

View File

@ -38,5 +38,5 @@ public class MjonEventVO {
private String point; //사용자 포인트 정보
private String userId; //사용자 아이디
private String frstRegisterId; //등록자 아이디
}

View File

@ -1,5 +1,10 @@
package itn.let.uat.uia.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.List;
import javax.annotation.Resource;
@ -11,14 +16,16 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.com.cmm.util.StringUtil;
import itn.com.uss.olh.hpc.service.HackIpService;
import itn.com.uss.olh.hpc.service.HackIpVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.mjo.cert.service.CertVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.sec.rgm.service.AuthorGroup;
import itn.let.sec.rgm.service.EgovAuthorGroupService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uss.umt.service.AdmProcHstryVO;
import itn.let.uss.umt.service.EgovMberManageService;
@ -82,6 +89,10 @@ public class EgovMberManageServiceImpl extends EgovAbstractServiceImpl implement
@Resource(name = "hackIpService")
private HackIpService hackIpService;
/* MjonMsgDataService */
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@Override
public int insertMber(MberManageVO mberManageVO) throws Exception {
@ -621,4 +632,71 @@ public class EgovMberManageServiceImpl extends EgovAbstractServiceImpl implement
return mberManageDAO.findTopByregDateFromCertLog(authCertVO);
}
public MberManageVO selectMberHeaderInfo(String mberId) throws Exception {
//회원 단가, 이벤트 단가, 이벤트 종료일 조회
MberManageVO headerInfo = mberManageDAO.selectMberHeaderInfo(mberId);
//기본 단가 조회
JoinSettingVO sysPrice = mjonMsgDataService.selectJoinSettingInfo();
//이벤트 종료까지 남은 계산
long eventLeftDay = calculateEventLeftDay(headerInfo.getEventEndDate());
headerInfo.setEventLeftDay(String.valueOf(eventLeftDay));
//이벤트 유무에 따라 이벤트 잔액 or 잔액 사용
boolean isEventActive = eventLeftDay > 0;
double money = isEventActive ? headerInfo.getEventRemainCash() : headerInfo.getUserMoney();
//이벤트, 회원 단가가 0일 기본 단가 사용
setPrices(headerInfo, sysPrice, isEventActive);
//발송가능 건수 조회
calculateAvailableCounts(headerInfo, money);
return headerInfo;
}
private long calculateEventLeftDay(String eventEndDateStr) {
if (StringUtil.isEmpty(eventEndDateStr)) return 0;
LocalDate today = LocalDate.now();
LocalDate eventEndDate = LocalDate.parse(eventEndDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
return ChronoUnit.DAYS.between(today, eventEndDate);
}
private void setPrices(MberManageVO headerInfo, JoinSettingVO sysPrice, boolean isEventActive) {
if (isEventActive) {
headerInfo.setHeaderShortPrice(priceChk(headerInfo.getEventShortPrice(), sysPrice.getShortPrice()));
headerInfo.setHeaderLongPrice(priceChk(headerInfo.getEventLongPrice(), sysPrice.getLongPrice()));
headerInfo.setHeaderPicturePrice(priceChk(headerInfo.getEventPicturePrice(), sysPrice.getPicturePrice()));
headerInfo.setHeaderPicture2Price(priceChk(headerInfo.getEventPicture2Price(), sysPrice.getPicture2Price()));
headerInfo.setHeaderPicture3Price(priceChk(headerInfo.getEventPicture3Price(), sysPrice.getPicture3Price()));
} else {
headerInfo.setHeaderShortPrice(priceChk(headerInfo.getShortPrice(), sysPrice.getShortPrice()));
headerInfo.setHeaderLongPrice(priceChk(headerInfo.getLongPrice(), sysPrice.getLongPrice()));
headerInfo.setHeaderPicturePrice(priceChk(headerInfo.getPicturePrice(), sysPrice.getPicturePrice()));
headerInfo.setHeaderPicture2Price(priceChk(headerInfo.getPicture2Price(), sysPrice.getPicture2Price()));
headerInfo.setHeaderPicture3Price(priceChk(headerInfo.getPicture3Price(), sysPrice.getPicture3Price()));
}
// 카카오, 팩스 단가는 기본 단가 고정
headerInfo.setHeaderKakaoAtPrice(sysPrice.getKakaoAtPrice());
headerInfo.setHeaderFaxPrice(sysPrice.getFaxPrice());
}
private float priceChk(float price, float sysPrice) {
return price > 0 ? price : sysPrice;
}
private void calculateAvailableCounts(MberManageVO headerInfo, double money) {
headerInfo.setHeaderShortCnt(calcCount(money, headerInfo.getHeaderShortPrice()));
headerInfo.setHeaderLongCnt(calcCount(money, headerInfo.getHeaderLongPrice()));
headerInfo.setHeaderPictureCnt(calcCount(money, headerInfo.getHeaderPicturePrice()));
headerInfo.setHeaderPicture2Cnt(calcCount(money, headerInfo.getHeaderPicture2Price()));
headerInfo.setHeaderPicture3Cnt(calcCount(money, headerInfo.getHeaderPicture3Price()));
headerInfo.setHeaderKakaoAtCnt(calcCount(money, headerInfo.getHeaderKakaoAtPrice()));
headerInfo.setHeaderFaxCnt(calcCount(money, headerInfo.getHeaderFaxPrice()));
}
private int calcCount(double money, double price) {
if (price <= 0) return 0;
return (int) Math.floor(money / price);
}
}

View File

@ -345,5 +345,8 @@ public class MberManageDAO extends EgovComAbstractDAO{
public String findTopByregDateFromCertLog(AuthCertVO authCertVO) {
return (String)select("mberManageDAO.findTopByregDateFromCertLog", authCertVO);
}
public MberManageVO selectMberHeaderInfo(String mberId) {
return (MberManageVO) select("mberManageDAO.selectMberHeaderInfo", mberId);
}
}

View File

@ -251,4 +251,6 @@ public interface EgovMberManageService {
public String findTopByregDateFromCertLog(AuthCertVO authCertVO);
//사용자 헤더 정보(단가, 이벤트 활성화 기간)
public MberManageVO selectMberHeaderInfo(String mberId) throws Exception;
}

View File

@ -512,6 +512,39 @@ public class MberManageVO extends UserDefaultVO{
*/
private String secuLoginFlag;
/**
* 회원 이벤트 정보
*/
private String eventEndDate; //회원 이벤트 종료일자
private double eventRemainCash; //이벤트 차감 남은 Cash
private float eventShortPrice; //이벤트 단문 가격
private float eventLongPrice; //이벤트 장문 가격
private float eventPicturePrice; //이벤트 그림 1장 가격
private float eventPicture2Price; //이벤트 그림 2장 가격
private float eventPicture3Price; //이벤트 그림 3장 가격
private String eventLeftDay; //이벤트 남은 기간
/**
* 헤더 영역 정보(단가, 발송가능 건수)
*/
private float headerShortPrice;
private float headerLongPrice;
private float headerPicturePrice;
private float headerPicture2Price;
private float headerPicture3Price;
private float headerKakaoAtPrice;
private float headerKakaoFtPrice;
private float headerFaxPrice;
private int headerShortCnt;
private int headerLongCnt;
private int headerPictureCnt;
private int headerPicture2Cnt;
private int headerPicture3Cnt;
private int headerKakaoAtCnt;
private int headerKakaoFtCnt;
private int headerFaxCnt;
public String getSmsCode() {
return smsCode;
}
@ -1804,6 +1837,150 @@ public class MberManageVO extends UserDefaultVO{
public void setSecuLoginFlag(String secuLoginFlag) {
this.secuLoginFlag = secuLoginFlag;
}
public String getEventEndDate() {
return eventEndDate;
}
public void setEventEndDate(String eventEndDate) {
this.eventEndDate = eventEndDate;
}
public double getEventRemainCash() {
return eventRemainCash;
}
public void setEventRemainCash(double eventRemainCash) {
this.eventRemainCash = eventRemainCash;
}
public float getEventShortPrice() {
return eventShortPrice;
}
public void setEventShortPrice(float eventShortPrice) {
this.eventShortPrice = eventShortPrice;
}
public float getEventLongPrice() {
return eventLongPrice;
}
public void setEventLongPrice(float eventLongPrice) {
this.eventLongPrice = eventLongPrice;
}
public float getEventPicturePrice() {
return eventPicturePrice;
}
public void setEventPicturePrice(float eventPicturePrice) {
this.eventPicturePrice = eventPicturePrice;
}
public float getEventPicture2Price() {
return eventPicture2Price;
}
public void setEventPicture2Price(float eventPicture2Price) {
this.eventPicture2Price = eventPicture2Price;
}
public float getEventPicture3Price() {
return eventPicture3Price;
}
public void setEventPicture3Price(float eventPicture3Price) {
this.eventPicture3Price = eventPicture3Price;
}
public String getEventLeftDay() {
return eventLeftDay;
}
public void setEventLeftDay(String eventLeftDay) {
this.eventLeftDay = eventLeftDay;
}
public float getHeaderShortPrice() {
return headerShortPrice;
}
public void setHeaderShortPrice(float headerShortPrice) {
this.headerShortPrice = headerShortPrice;
}
public float getHeaderLongPrice() {
return headerLongPrice;
}
public void setHeaderLongPrice(float headerLongPrice) {
this.headerLongPrice = headerLongPrice;
}
public float getHeaderPicturePrice() {
return headerPicturePrice;
}
public void setHeaderPicturePrice(float headerPicturePrice) {
this.headerPicturePrice = headerPicturePrice;
}
public float getHeaderPicture2Price() {
return headerPicture2Price;
}
public void setHeaderPicture2Price(float headerPicture2Price) {
this.headerPicture2Price = headerPicture2Price;
}
public float getHeaderPicture3Price() {
return headerPicture3Price;
}
public void setHeaderPicture3Price(float headerPicture3Price) {
this.headerPicture3Price = headerPicture3Price;
}
public int getHeaderShortCnt() {
return headerShortCnt;
}
public void setHeaderShortCnt(int headerShortCnt) {
this.headerShortCnt = headerShortCnt;
}
public int getHeaderLongCnt() {
return headerLongCnt;
}
public void setHeaderLongCnt(int headerLongCnt) {
this.headerLongCnt = headerLongCnt;
}
public int getHeaderPictureCnt() {
return headerPictureCnt;
}
public void setHeaderPictureCnt(int headerPictureCnt) {
this.headerPictureCnt = headerPictureCnt;
}
public int getHeaderPicture2Cnt() {
return headerPicture2Cnt;
}
public void setHeaderPicture2Cnt(int headerPicture2Cnt) {
this.headerPicture2Cnt = headerPicture2Cnt;
}
public int getHeaderPicture3Cnt() {
return headerPicture3Cnt;
}
public void setHeaderPicture3Cnt(int headerPicture3Cnt) {
this.headerPicture3Cnt = headerPicture3Cnt;
}
public float getHeaderKakaoAtPrice() {
return headerKakaoAtPrice;
}
public void setHeaderKakaoAtPrice(float headerKakaoAtPrice) {
this.headerKakaoAtPrice = headerKakaoAtPrice;
}
public float getHeaderKakaoFtPrice() {
return headerKakaoFtPrice;
}
public void setHeaderKakaoFtPrice(float headerKakaoFtPrice) {
this.headerKakaoFtPrice = headerKakaoFtPrice;
}
public float getHeaderFaxPrice() {
return headerFaxPrice;
}
public void setHeaderFaxPrice(float headerFaxPrice) {
this.headerFaxPrice = headerFaxPrice;
}
public int getHeaderKakaoAtCnt() {
return headerKakaoAtCnt;
}
public void setHeaderKakaoAtCnt(int headerKakaoAtCnt) {
this.headerKakaoAtCnt = headerKakaoAtCnt;
}
public int getHeaderKakaoFtCnt() {
return headerKakaoFtCnt;
}
public void setHeaderKakaoFtCnt(int headerKakaoFtCnt) {
this.headerKakaoFtCnt = headerKakaoFtCnt;
}
public int getHeaderFaxCnt() {
return headerFaxCnt;
}
public void setHeaderFaxCnt(int headerFaxCnt) {
this.headerFaxCnt = headerFaxCnt;
}
}

View File

@ -1262,37 +1262,15 @@ public class MainController {
}
/*
* 회원별 정보(단가), 기본 단가, 남은 이벤트 기간 조회
* 회원별 단가, 기본 단가, 이벤트 정보 조회
* 2025.07.25 이지우 추가
* */
MberManageVO mberPriceVO = new MberManageVO();
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
MjonEventVO mjonEventVO = new MjonEventVO();
MberManageVO mberHeaderInfoVO = new MberManageVO();
if(loginVO != null) {
mberPriceVO = mberManageService.selectMber(loginVO.getId());
if(!(mberPriceVO.getShortPrice() > 0)) mberPriceVO.setShortPrice(sysJoinSetVO.getShortPrice());
if(!(mberPriceVO.getLongPrice() > 0)) mberPriceVO.setLongPrice(sysJoinSetVO.getLongPrice());
if(!(mberPriceVO.getPicturePrice() > 0)) mberPriceVO.setPicturePrice(sysJoinSetVO.getPicturePrice());
if(!(mberPriceVO.getPicture2Price() > 0)) mberPriceVO.setPicture2Price(sysJoinSetVO.getPicture2Price());
if(!(mberPriceVO.getPicture3Price() > 0)) mberPriceVO.setPicture3Price(sysJoinSetVO.getPicture3Price());
//카카오, 팩스는 기본단가 고정
mberPriceVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
mberPriceVO.setFaxPrice(sysJoinSetVO.getFaxPrice());
mjonEventVO.setMberId(loginVO.getId());
mjonEventVO = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
String eventEndDateStr = "";
if(StringUtil.isNotEmpty(mjonEventVO.getEventEndDate())) {
eventEndDateStr = mjonEventVO.getEventEndDate();
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate eventEndDate = LocalDate.parse(eventEndDateStr, formatter);
long eventLeftDay = ChronoUnit.DAYS.between(today, eventEndDate);
model.addAttribute("eventLeftDay", eventLeftDay);
}
mberHeaderInfoVO = mberManageService.selectMberHeaderInfo(loginVO.getId());
}
model.addAttribute("mberPriceVO", mberPriceVO);
model.addAttribute("mberHeaderInfoVO", mberHeaderInfoVO);
return "web/com/webCommonHeader";
}

View File

@ -2142,4 +2142,38 @@
</update>
<select id="mberManageDAO.selectMberHeaderInfo" resultClass="itn.let.uss.umt.service.MberManageVO" parameterClass="String">
SELECT
L.SHORT_PRICE AS shortPrice
, L.LONG_PRICE AS longPrice
, L.PICTURE_PRICE AS picturePrice
, L.PICTURE2_PRICE AS picture2Price
, L.PICTURE3_PRICE AS picture3Price
, L.PRE_PAYMENT_YN AS prePaymentYn
, L.USER_MONEY AS userMoney
, IFNULL(MEMI.EVENT_SHORT_PRICE, 0) AS eventShortPrice
, IFNULL(MEMI.EVENT_LONG_PRICE, 0) AS eventLongPrice
, IFNULL(MEMI.EVENT_PICTURE_PRICE, 0) AS eventPicturePrice
, IFNULL(MEMI.EVENT_PICTURE2_PRICE, 0) AS eventPicture2Price
, IFNULL(MEMI.EVENT_PICTURE3_PRICE, 0) AS eventPicture3Price
, IFNULL(MEMI.EVENT_REMAIN_CASH, 0) AS eventRemainCash
, DATE_FORMAT(MEMI.EVENT_END_DATE, '%Y-%m-%d') AS eventEndDate
FROM
LETTNGNRLMBER L
LEFT JOIN
MJ_EVENT_MBER_INFO MEMI
ON L.MBER_ID = MEMI.MBER_ID
AND MEMI.EVENT_INFO_ID = (
SELECT
MAX(EVENT_INFO_ID)
FROM
MJ_EVENT_MBER_INFO
WHERE
MBER_ID = #mberID#
AND EVENT_STATUS = 'Y'
)
WHERE L.MBER_ID = #mberId#
</select>
</sqlMap>

View File

@ -1794,59 +1794,60 @@ function actionLogin_end(){
<ul class="send_available_number">
<li>
<p class="title">· 단문</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.shortPrice}" var="shortPrice" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerShortPrice}" var="shortPrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${shortPrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.shortPrice)}" var="shotCnt" />
(<c:out value="${shotCnt}"/>건)</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerShortCnt}" var="shortCnt" />
(<c:out value="${shortCnt}"/>건)</p>
</li>
<li>
<p class="title">· 장문</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.longPrice}" var="longPrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${longPrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.longPrice)}" var="longCnt" />
(<c:out value="${longCnt}"/>건)</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerLongPrice}" var="LongPrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${LongPrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerLongCnt}" var="LongCnt" />
(<c:out value="${LongCnt}"/>건)</p>
</li>
<li>
<p class="title">· 그림(1장)</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.picturePrice}" var="picturePrice" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPicturePrice}" var="picturePrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${picturePrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.picturePrice)}" var="pictureCnt" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPictureCnt}" var="pictureCnt" />
(<c:out value="${pictureCnt}"/>건)</p>
</li>
<li>
<p class="title">· 그림(2장)</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.picture2Price}" var="picture2Price" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPicture2Price}" var="picture2Price" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${picture2Price}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.picture2Price)}" var="picture2Cnt" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPicture2Cnt}" var="picture2Cnt" />
(<c:out value="${picture2Cnt}"/>건)</p>
</li>
<li>
<p class="title">· 그림(3장)</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.picture3Price}" var="picture3Price" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPicture3Price}" var="picture3Price" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${picture3Price}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.picture3Price)}" var="picture3Cnt" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerPicture3Cnt}" var="picture3Cnt" />
(<c:out value="${picture3Cnt}"/>건)</p>
</li>
<li>
<p class="title">· 알림톡</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.kakaoAtPrice}" var="kakaoAtPrice" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerKakaoAtPrice}" var="kakaoAtPrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${kakaoAtPrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.kakaoAtPrice)}" var="kakaoAtCnt" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerKakaoAtCnt}" var="kakaoAtCnt" />
(<c:out value="${kakaoAtCnt}"/>건)</p>
</li>
<li>
<p class="title">· 팩스</p>
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberPriceVO.faxPrice}" var="faxPrice" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerFaxPrice}" var="faxPrice" />
<p class="number"><span class="c_002c9a fwBold"><c:out value="${faxPrice}"/></span>원
<fmt:formatNumber type="number" maxFractionDigits="3" value="${Math.floor(userMoney / mberPriceVO.faxPrice)}" var="faxCnt" />
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.headerFaxCnt}" var="faxCnt" />
(<c:out value="${faxCnt}"/>건)</p>
</li>
</ul>
<c:if test="${prePaymentYn eq 'Y' and (not empty eventLeftDay and eventLeftDay > 0)}">
<p class="event_term">이벤트 적용중 <span class="fwBold">D-${eventLeftDay}</span></p>
<c:if test="${prePaymentYn eq 'Y' and mberHeaderInfoVO.eventLeftDay > 0}">
<fmt:formatNumber type="number" maxFractionDigits="3" value="${mberHeaderInfoVO.eventRemainCash}" var="eventRemainCash" />
<div class="event_term"><p>이벤트<span class="fwBold">(D-${mberHeaderInfoVO.eventLeftDay})</span></p><p><span class="fwBold price">${eventRemainCash}</span>원</p></div>
</c:if>
<c:if test="${prePaymentYn eq 'N'}">
<p class="event_term">후불제(매월 1일 자동충전)</p>
<div class="event_term" style="display:block">후불제(매월 1일 자동충전)</div>
</c:if>
</div>
</div>