diff --git a/src/main/java/com/itn/mjonApi/cmn/model/Price.java b/src/main/java/com/itn/mjonApi/cmn/model/Price.java new file mode 100644 index 0000000..646b7fa --- /dev/null +++ b/src/main/java/com/itn/mjonApi/cmn/model/Price.java @@ -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 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; + } + +} diff --git a/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/impl/PriceServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/impl/PriceServiceImpl.java index 2779cb8..a6cf459 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/impl/PriceServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/impl/PriceServiceImpl.java @@ -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 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; - } + } diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java index 826609e..e305e6d 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java @@ -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; + } } diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java index 197dc1b..83fc8aa 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java @@ -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 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 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 mjonResponseVOList = new ArrayList(); 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 => 현재 사용안함 // 스팸체크 하는 부분 diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 1692c2a..265ec00 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -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