feat: 문자 발송시 금액 조회기능 추가

This commit is contained in:
hylee 2023-07-04 14:11:12 +09:00
parent fdcde25721
commit 0dd73503d5
5 changed files with 450 additions and 71 deletions

View File

@ -0,0 +1,89 @@
package com.itn.mjonApi.cmn.model;
import com.itn.mjonApi.mjon.api.inqry.mapper.PriceMapper;
import com.itn.mjonApi.mjon.api.inqry.mapper.domain.PriceVO;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Map;
/**
* packageName : com.itn.mjonApi.cmn.model
* fileName : priceRefine
* author : hylee
* date : 2023-07-03
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-07-03 hylee 최초 생성
*/
@Component
public class Price {
public static PriceVO priceRefine(String mberId, PriceMapper priceMapper) {
//사용자 잔액
double mberMoney = priceMapper.selectMberMoney(mberId);
//시스템 단가 변수
double sys_shortPrice = 0.0f;
double sys_longPrice = 0.0f;
double sys_picturePrice = 0.0f;
//최종 단가 변수
double shortPrice = 0.0f;
double longPrice = 0.0f;
double picturePrice = 0.0f;
//1.시스템 기본 단가, 사용자 개인단가 정보 불러오기
Map<String, String> priceMap = priceMapper.selectMberPriceInfo(mberId);
//1-2.단가 계산을 위한 set
sys_shortPrice = Double.parseDouble(String.valueOf(priceMap.get("sysShortPrice")));
sys_longPrice = Double.parseDouble(String.valueOf(priceMap.get("sysLongPrice")));
sys_picturePrice = Double.parseDouble(String.valueOf(priceMap.get("sysPicturePrice")));
shortPrice = Double.parseDouble(String.valueOf(priceMap.get("shortPrice")));
longPrice = Double.parseDouble(String.valueOf(priceMap.get("longPrice")));
picturePrice = Double.parseDouble(String.valueOf(priceMap.get("picturePrice")));
//1-3. 최종 단가 계산
shortPrice = shortPrice == 0.0f ? sys_shortPrice : shortPrice;
longPrice = longPrice == 0.0f ? sys_longPrice : longPrice;
picturePrice = picturePrice == 0.0f ? sys_picturePrice : picturePrice;
//2. 단가별 발송 가능건수 계산을위한 변수 set
int shortSendPsbltEa = 0;
int longSendPsbltEa = 0;
int pictureSendPsbltEa = 0;
//2-1. 소수점 연산을 위한 BigDecimal Casting
BigDecimal mberMoney_big = new BigDecimal(String.valueOf(mberMoney));
BigDecimal shortPrice_big = new BigDecimal(String.valueOf(priceMap.get("sysShortPrice")));
BigDecimal longPrice_big = new BigDecimal(String.valueOf(priceMap.get("sysLongPrice")));
BigDecimal picturePrice_big = new BigDecimal(String.valueOf(priceMap.get("sysPicturePrice")));
//2-2. mberMoney가 0일경우 제외
if(mberMoney_big.compareTo(BigDecimal.ZERO) != 0) {
shortSendPsbltEa = mberMoney_big.divide(shortPrice_big, BigDecimal.ROUND_DOWN).intValue();
longSendPsbltEa = mberMoney_big.divide(longPrice_big, BigDecimal.ROUND_DOWN).intValue();
pictureSendPsbltEa = mberMoney_big.divide(picturePrice_big, BigDecimal.ROUND_DOWN).intValue();
}
//result set
PriceVO priceVO = PriceVO.builder()
.shortPrice(shortPrice)
.longPrice(longPrice)
.picturePrice(picturePrice)
.shortSendPsbltEa(shortSendPsbltEa)
.longSendPsbltEa(longSendPsbltEa)
.pictureSendPsbltEa(pictureSendPsbltEa)
.mberMoney(mberMoney)
.build();
return priceVO;
}
}

View File

@ -1,5 +1,6 @@
package com.itn.mjonApi.mjon.api.inqry.service.impl;
import com.itn.mjonApi.cmn.model.Price;
import com.itn.mjonApi.cmn.msg.FailRestResponse;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.msg.StatMsg;
@ -12,9 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
/**
* @packageName : com.itn.mjonApi.mjon.api.inqry.service.impl
@ -44,10 +43,9 @@ public class PriceServiceImpl implements PriceService {
PriceResponse priceResponse = new PriceResponse();
try {
//사용자 잔액
double mberMoney = priceMapper.selectMberMoney(mberId);
// 이용단가, 발송가능 건수
PriceVO priceVO = price_refine(mberId, mberMoney, priceMapper);
PriceVO priceVO = Price.priceRefine(mberId, priceMapper);
//response set
priceResponse = PriceResponse.builder()
@ -56,7 +54,7 @@ public class PriceServiceImpl implements PriceService {
.message(StatMsg.valueOf(STAT_CODE).getMsg())
.localDateTime(LocalDateTime.now())
//1. 잔액
.mberMoney(mberMoney)
.mberMoney(priceVO.getMberMoney())
//2. 이용단가
.shortPrice(priceVO.getShortPrice())
.longPrice(priceVO.getLongPrice())
@ -68,6 +66,7 @@ public class PriceServiceImpl implements PriceService {
.build();
} catch (Exception e) {
e.printStackTrace();
log.info("selectPrice Error [{}]", e.getMessage());
return new RestResponse(new FailRestResponse("STAT_5099", ""));
}
@ -75,65 +74,7 @@ public class PriceServiceImpl implements PriceService {
return new RestResponse(priceResponse);
}
private PriceVO price_refine(String mberId, double mberMoney, PriceMapper priceMapper) {
//시스템 단가 변수
double sys_shortPrice = 0.0f;
double sys_longPrice = 0.0f;
double sys_picturePrice = 0.0f;
//최종 단가 변수
double shortPrice = 0.0f;
double longPrice = 0.0f;
double picturePrice = 0.0f;
//1.시스템 기본 단가, 사용자 개인단가 정보 불러오기
Map<String, String> priceMap = priceMapper.selectMberPriceInfo(mberId);
//1-2.단가 계산을 위한 set
sys_shortPrice = Double.parseDouble(String.valueOf(priceMap.get("sysShortPrice")));
sys_longPrice = Double.parseDouble(String.valueOf(priceMap.get("sysLongPrice")));
sys_picturePrice = Double.parseDouble(String.valueOf(priceMap.get("sysPicturePrice")));
shortPrice = Double.parseDouble(String.valueOf(priceMap.get("shortPrice")));
longPrice = Double.parseDouble(String.valueOf(priceMap.get("longPrice")));
picturePrice = Double.parseDouble(String.valueOf(priceMap.get("picturePrice")));
//1-3. 최종 단가 계산
shortPrice = shortPrice == 0.0f ? sys_shortPrice : shortPrice;
longPrice = longPrice == 0.0f ? sys_longPrice : longPrice;
picturePrice = picturePrice == 0.0f ? sys_picturePrice : picturePrice;
//2. 단가별 발송 가능건수 계산을위한 변수 set
int shortSendPsbltEa = 0;
int longSendPsbltEa = 0;
int pictureSendPsbltEa = 0;
//2-1. 소수점 연산을 위한 BigDecimal Casting
BigDecimal mberMoney_big = new BigDecimal(String.valueOf(mberMoney));
BigDecimal shortPrice_big = new BigDecimal(String.valueOf(priceMap.get("sysShortPrice")));
BigDecimal longPrice_big = new BigDecimal(String.valueOf(priceMap.get("sysLongPrice")));
BigDecimal picturePrice_big = new BigDecimal(String.valueOf(priceMap.get("sysPicturePrice")));
//2-2. mberMoney가 0일경우 제외
if(mberMoney_big.compareTo(BigDecimal.ZERO) != 0) {
shortSendPsbltEa = mberMoney_big.divide(shortPrice_big, BigDecimal.ROUND_DOWN).intValue();
longSendPsbltEa = mberMoney_big.divide(longPrice_big, BigDecimal.ROUND_DOWN).intValue();
pictureSendPsbltEa = mberMoney_big.divide(picturePrice_big, BigDecimal.ROUND_DOWN).intValue();
}
//result set
PriceVO priceVO = PriceVO.builder()
.shortPrice(shortPrice)
.longPrice(longPrice)
.picturePrice(picturePrice)
.shortSendPsbltEa(shortSendPsbltEa)
.longSendPsbltEa(longSendPsbltEa)
.pictureSendPsbltEa(pictureSendPsbltEa)
.build();
return priceVO;
}
}

View File

@ -15,8 +15,6 @@ import java.io.Serializable;
* -----------------------------------------------------------
* 2023-05-09 hylee 최초 생성
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ -41,7 +39,11 @@ public class MsgRequestVO implements Serializable {
private String eachPrice="0"; // value = "전송문자 개별가격", example = "0"
private String sPrice="0"; // 임시
private String sPrice="0"; // 단문 단가
private String mPrice="0"; // 장문 단가
private String pPrice="0"; // 그림1장 단가
private String p2Price="0"; // 그림2장 단가
private String p3Price="0"; // 그림3장 단가
private String totPrice="0"; // value = "전송문자 토탈가격", example = "0"
@ -200,4 +202,277 @@ public class MsgRequestVO implements Serializable {
// private String todayYn;
// private String nowDate;
// private Float agentPrice;
public String getMberId() {
return mberId;
}
public void setMberId(String mberId) {
this.mberId = mberId;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSmsTxt() {
return smsTxt;
}
public void setSmsTxt(String smsTxt) {
this.smsTxt = smsTxt;
}
public String[] getCallToList() {
return callToList;
}
public void setCallToList(String[] callToList) {
this.callToList = callToList;
}
public String getCallFrom() {
return callFrom;
}
public void setCallFrom(String callFrom) {
this.callFrom = callFrom;
}
public String getEachPrice() {
return eachPrice;
}
public void setEachPrice(String eachPrice) {
this.eachPrice = eachPrice;
}
public String getsPrice() {
return sPrice;
}
public void setsPrice(String sPrice) {
this.sPrice = sPrice;
}
public String getmPrice() {
return mPrice;
}
public void setmPrice(String mPrice) {
this.mPrice = mPrice;
}
public String getpPrice() {
return pPrice;
}
public void setpPrice(String pPrice) {
this.pPrice = pPrice;
}
public String getP2Price() {
return p2Price;
}
public void setP2Price(String p2Price) {
this.p2Price = p2Price;
}
public String getP3Price() {
return p3Price;
}
public void setP3Price(String p3Price) {
this.p3Price = p3Price;
}
public String getTotPrice() {
return totPrice;
}
public void setTotPrice(String totPrice) {
this.totPrice = totPrice;
}
public String getFileCnt() {
return fileCnt;
}
public void setFileCnt(String fileCnt) {
this.fileCnt = fileCnt;
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String msgType) {
this.msgType = msgType;
}
public float getSmsPrice() {
return smsPrice;
}
public void setSmsPrice(float smsPrice) {
this.smsPrice = smsPrice;
}
public float getMmsPrice() {
return mmsPrice;
}
public void setMmsPrice(float mmsPrice) {
this.mmsPrice = mmsPrice;
}
public String[] getImgFilePath() {
return imgFilePath;
}
public void setImgFilePath(String[] imgFilePath) {
this.imgFilePath = imgFilePath;
}
public String getSpamStatus() {
return spamStatus;
}
public void setSpamStatus(String spamStatus) {
this.spamStatus = spamStatus;
}
public String getTxtReplYn() {
return txtReplYn;
}
public void setTxtReplYn(String txtReplYn) {
this.txtReplYn = txtReplYn;
}
public String getNameStr() {
return nameStr;
}
public void setNameStr(String nameStr) {
this.nameStr = nameStr;
}
public String getRep1Str() {
return rep1Str;
}
public void setRep1Str(String rep1Str) {
this.rep1Str = rep1Str;
}
public String getRep2Str() {
return rep2Str;
}
public void setRep2Str(String rep2Str) {
this.rep2Str = rep2Str;
}
public String getRep3Str() {
return rep3Str;
}
public void setRep3Str(String rep3Str) {
this.rep3Str = rep3Str;
}
public String getRep4Str() {
return rep4Str;
}
public void setRep4Str(String rep4Str) {
this.rep4Str = rep4Str;
}
public String[] getNameList() {
return nameList;
}
public void setNameList(String[] nameList) {
this.nameList = nameList;
}
public String[] getRep1List() {
return rep1List;
}
public void setRep1List(String[] rep1List) {
this.rep1List = rep1List;
}
public String[] getRep2List() {
return rep2List;
}
public void setRep2List(String[] rep2List) {
this.rep2List = rep2List;
}
public String[] getRep3List() {
return rep3List;
}
public void setRep3List(String[] rep3List) {
this.rep3List = rep3List;
}
public String[] getRep4List() {
return rep4List;
}
public void setRep4List(String[] rep4List) {
this.rep4List = rep4List;
}
public String getReserveYn() {
return reserveYn;
}
public void setReserveYn(String reserveYn) {
this.reserveYn = reserveYn;
}
public String getShortMsgCnt() {
return shortMsgCnt;
}
public void setShortMsgCnt(String shortMsgCnt) {
this.shortMsgCnt = shortMsgCnt;
}
public String getLongMsgCnt() {
return longMsgCnt;
}
public void setLongMsgCnt(String longMsgCnt) {
this.longMsgCnt = longMsgCnt;
}
public String getMsgKind() {
return msgKind;
}
public void setMsgKind(String msgKind) {
this.msgKind = msgKind;
}
public String getTest_yn() {
return test_yn;
}
public void setTest_yn(String test_yn) {
this.test_yn = test_yn;
}
}

View File

@ -1,14 +1,17 @@
package com.itn.mjonApi.mjon.api.send.service.impl;
import com.itn.mjonApi.cmn.apiServer.ApiService;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.model.Price;
import com.itn.mjonApi.cmn.msg.FailRestResponse;
import com.itn.mjonApi.mjon.api.send.mapper.domain.SendSucRestResponse;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.msg.StatMsg;
import com.itn.mjonApi.mjon.api.inqry.mapper.PriceMapper;
import com.itn.mjonApi.mjon.api.inqry.mapper.domain.PriceVO;
import com.itn.mjonApi.mjon.api.send.mapper.SendMapper;
import com.itn.mjonApi.mjon.api.send.mapper.domain.MjonResponseVO;
import com.itn.mjonApi.mjon.api.send.mapper.domain.MsgRequestVO;
import com.itn.mjonApi.mjon.api.send.mapper.domain.MsgsRequestVO;
import com.itn.mjonApi.mjon.api.send.mapper.domain.SendSucRestResponse;
import com.itn.mjonApi.mjon.api.send.service.SendService;
import com.itn.mjonApi.util.MunjaUtil;
import lombok.extern.slf4j.Slf4j;
@ -33,6 +36,10 @@ public class SendServiceImpl implements SendService {
@Autowired
SendMapper sendMapper;
@Autowired
PriceMapper priceMapper;
@Autowired
public SendServiceImpl(ApiService<Response> apiService) {
this.apiService = apiService;
@ -56,6 +63,7 @@ public class SendServiceImpl implements SendService {
return new RestResponse(new FailRestResponse("STAT_1010",""));
}
// step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능)
// 1020
// 폰번호 확인 - -> 유효성 정규식
@ -88,6 +96,31 @@ public class SendServiceImpl implements SendService {
msgRequestVO = this.getLengthOfShortAndLongMsg(msgRequestVO);
}
PriceVO priceVO = Price.priceRefine(msgRequestVO.getMberId(), priceMapper);
// +""; => Double to String 같은 기능
msgRequestVO.setsPrice(priceVO.getShortPrice()+"");
msgRequestVO.setmPrice(priceVO.getLongPrice()+"");
msgRequestVO.setpPrice(priceVO.getPicturePrice()+"");
//문자열 길이 체크 해주기
// 문자 바이트 계산에 필요한 캐릭터 : 한글 2Byte로 계산
int FrBytes = getFrBytes(msgRequestVO);
// 단문 장문 단가과 타입 지정
if(FrBytes > 90){
msgRequestVO.setEachPrice(msgRequestVO.getsPrice());
msgRequestVO.setMsgType("6");
}else {
msgRequestVO.setEachPrice(msgRequestVO.getmPrice());
msgRequestVO.setMsgType("4");
}
// 문자 전송하는 부분
// apiService.postForEntity => restTemplate.postForEntity 호출 MjonResponseVO에 맞게 데이터 정제하는 메소드
MjonResponseVO munjaSendResponse = apiService.postForEntity(
@ -113,6 +146,12 @@ public class SendServiceImpl implements SendService {
}
private static int getFrBytes(MsgRequestVO msgRequestVO) throws UnsupportedEncodingException {
String smsCont = msgRequestVO.getSmsTxt().replace("\r\n", "\n");
int FrBytes = smsCont.getBytes("euc-kr").length;
return FrBytes;
}
private RestResponse _getTestMsgReturnData(String testYn)
{
// YF => 실패 테스트 데이터
@ -176,6 +215,7 @@ public class SendServiceImpl implements SendService {
if(StringUtils.isNotEmpty(msgsRequestVO.getTest_yn())){
return this._getTestMsgsReturnData(msgsRequestVO.getTest_yn());
}
// msgsVO -> msgVO List로 변환
List<MsgRequestVO> msgRequestVOList = this.getDataCleaning(msgsRequestVO);
@ -197,9 +237,41 @@ public class SendServiceImpl implements SendService {
}
}
//사용자 잔액
// double mberMoney = priceMapper.selectMberMoney(mberId);
// 이용단가, 발송가능 건수
// PriceVO priceVO = this.price_refine(mberId, mberMoney, priceMapper);
PriceVO priceVO = Price.priceRefine(msgsRequestVO.getMberId(), priceMapper);
// +""; => Double to String 같은 기능
String sPrice = priceVO.getShortPrice()+"";
String mPrice = priceVO.getLongPrice()+"";
String pPrice = priceVO.getPicturePrice()+"";
List<MjonResponseVO> mjonResponseVOList = new ArrayList<MjonResponseVO>();
for(MsgRequestVO msgRequestVO : msgRequestVOList){
//문자열 길이 체크 해주기
// 문자 바이트 계산에 필요한 캐릭터 : 한글 2Byte로 계산
int FrBytes = getFrBytes(msgRequestVO);
// 단문 장문 단가과 타입 지정
if(FrBytes > 90){
msgRequestVO.setEachPrice(sPrice);
msgRequestVO.setMsgType("6");
}else {
msgRequestVO.setEachPrice(mPrice);
msgRequestVO.setMsgType("4");
}
// 단가 셋팅
msgRequestVO.setsPrice(sPrice); // 단문
msgRequestVO.setmPrice(mPrice); // 장문
msgRequestVO.setpPrice(pPrice); // 사진
//step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 30분 지연으로 처리됨
// 1030 => 현재 사용안함
// 스팸체크 하는 부분

View File

@ -6,6 +6,7 @@
#spring.datasource.url=jdbc:mysql://192.168.0.125:3306/mjon?serverTimezone=Asia/Seoul
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://192.168.0.125:3306/mjon?serverTimezone=Asia/Seoul
#spring.datasource.url=jdbc:log4jdbc:mysql://139.150.72.157:3306/mjon?serverTimezone=Asia/Seoul
spring.datasource.username=mjonUr
spring.datasource.password=mjon!@#$
@ -14,8 +15,9 @@ server.port=8088
logging.level.root=info
#api.root.url=http://192.168.0.125:8095/
api.root.url=http://localhost:8080/
#api.root.url=http://192.168.0.125:8095/
#api.root.url=https://www.munjaon.co.kr/
Ganpandaup.receiver.email=hylee250@kakao.com