From 2bcecc21990ee395beade26834031fca6e34c20b Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 26 Jun 2025 11:37:23 +0900 Subject: [PATCH] =?UTF-8?q?api=20=EB=AC=B8=EC=9E=90=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EC=8B=9C=20advc=20=EB=B2=84=EC=A0=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/mjonApi/cmn/apiServer/ApiService.java | 3 + .../java/com/itn/mjonApi/cmn/msg/StatMsg.java | 11 +- .../send/mapper/domain/MjonResponseVO.java | 3 +- .../mapper/domain/SendSucRestResponse.java | 32 ++-- .../mjon/api/send/service/SendService.java | 2 + .../send/service/impl/SendServiceImpl.java | 150 +++++++++++++++--- .../mjon/api/send/web/SendRestController.java | 3 +- 7 files changed, 158 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/itn/mjonApi/cmn/apiServer/ApiService.java b/src/main/java/com/itn/mjonApi/cmn/apiServer/ApiService.java index 9fe8ff9..1a153ee 100644 --- a/src/main/java/com/itn/mjonApi/cmn/apiServer/ApiService.java +++ b/src/main/java/com/itn/mjonApi/cmn/apiServer/ApiService.java @@ -51,6 +51,9 @@ public class ApiService { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(returnEntity.getBody()); +// log.info("rootNode :: [{}]", rootNode.toString()); + + // "apiReturn" 필드만 추출 JsonNode apiReturnNode = rootNode.get("apiReturn"); if (apiReturnNode == null || apiReturnNode.isNull()) { diff --git a/src/main/java/com/itn/mjonApi/cmn/msg/StatMsg.java b/src/main/java/com/itn/mjonApi/cmn/msg/StatMsg.java index 41833bd..26107be 100644 --- a/src/main/java/com/itn/mjonApi/cmn/msg/StatMsg.java +++ b/src/main/java/com/itn/mjonApi/cmn/msg/StatMsg.java @@ -33,7 +33,8 @@ public enum StatMsg { // 문자보내기 ====================================================================== STAT_0("0","") , STAT_1010("1010","발신자 전화번호 사용 불가") - , STAT_1020("1020","수신자 전화번호 오류") + , STAT_1020("1020","수신자 전화번호 오류") // ㅂ + , STAT_1021("1021","수신거부 번호 제거 후 수신자 목록 없음") , STAT_1030("1030","문자 내용 발송 불가") , STAT_1040("1040","치환 데이터 오류") , STAT_1050("1050","치환 후 문자 길이 초과") @@ -68,13 +69,17 @@ public enum StatMsg { } // Random을 만들기 위한 코드 + // 모든 enum 항목을 불변 리스트로 저장 private static final List VALUES = Collections.unmodifiableList(Arrays.asList(values())); + // 전체 항목 수 private static final int SIZE = VALUES.size(); + // 랜덤 인스턴스 private static final Random RANDOM = new Random(); /** - * @description : 랜덤한 에러코드를 반환한다. - * @return errorCode + * 랜덤한 에러코드를 반환한다. + * 단, 코드 값이 3자리 이하(예: "단문", "장문")인 항목은 제외된다. + * @return "STAT_코드" 형식의 문자열 */ public static String randomErrorStatCode() { String errorCode = ""; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java index ee37fe4..c4d3319 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java @@ -34,10 +34,11 @@ public class MjonResponseVO { private String msgGroupId; private String afterCash; private String msgType; + private String statCode; /** * - * @param JsonNode apiReturnNode + * @param apiReturnNode * @return ResponseEntity vo convert * @throws JsonProcessingException */ diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/SendSucRestResponse.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/SendSucRestResponse.java index 4b393c3..5d9012f 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/SendSucRestResponse.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/SendSucRestResponse.java @@ -85,31 +85,33 @@ public class SendSucRestResponse { */ public static SendSucRestResponse SendSuccessMsgsRestResponse(List mjonResponseVOList) { + mjonResponseVOList.forEach(t->log.info(t.toString())); + // 실패 카운트 int failCnt = (int) mjonResponseVOList.stream() - .filter(s->"fail".equals(s.getResult())) + .filter(s->!"OK".equals(s.getResult())) .count(); // 성공 카운트 - int successCnt = mjonResponseVOList.parallelStream() - .filter(s->!"fail".equals(s.getResult())) - .mapToInt(s -> Integer.parseInt(s.getResultSts())) - .sum(); + int successCnt = (int) mjonResponseVOList.parallelStream() + .filter(s->"OK".equals(s.getResult())) + .count(); // 수신거부 카운트 - int blockCnt = mjonResponseVOList.parallelStream() - .filter(s->!"fail".equals(s.getResult())) - .mapToInt(s -> Integer.parseInt(s.getResultBlockSts())) - .sum(); +// int blockCnt = mjonResponseVOList.parallelStream() +// .filter(s->!"OK".equals(s.getResult())) +// .mapToInt(s -> Integer.parseInt(s.getResultBlockSts())) +// .sum(); // 성공한 메세지 그룹 아이디 List msgGroupIdList = mjonResponseVOList.stream() - .filter(s->!"fail".equals(s.getResult())) + .filter(s->"OK".equals(s.getResult())) .map(s -> s.getMsgGroupId()) .collect(Collectors.toList()); - // 성공한 메세지 그룹 아이디 + // 메세지 타입 List msgTypeList = mjonResponseVOList.stream() - .map(s -> StatMsg.valueOf("msgType"+s.getMsgType()).getMsg()) - .collect(Collectors.toList()); + .filter(s -> s.getMsgType() != null) + .map(s -> StatMsg.valueOf("msgType"+s.getMsgType()).getMsg()) + .collect(Collectors.toList()); @@ -118,8 +120,8 @@ public class SendSucRestResponse { .resultCode(StatMsg.valueOf("STAT_0").getCode()) // 성공 코드 0 - StatMsg 참고 .msgGroupIdList(msgGroupIdList) // 전송 메세지 그룹 ID .successCnt(Integer.toString(successCnt)) // 성공 건수 - .blockCnt(Integer.toString(blockCnt)) // 수신거부 건수 - .failCnt(Integer.toString(failCnt)) // 수신거부 건수 +// .blockCnt(Integer.toString(blockCnt)) // 수신거부 건수 + .failCnt(Integer.toString(failCnt)) // 실패 건수 .msgTypeList(msgTypeList) // msgType List .build(); diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/service/SendService.java b/src/main/java/com/itn/mjonApi/mjon/api/send/service/SendService.java index 60e220a..a9c79dc 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/service/SendService.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/service/SendService.java @@ -12,4 +12,6 @@ public interface SendService { RestResponse sendMsgData_advc(MsgRequestVO msgRequestVO) throws Exception; RestResponse sendMsgsData(MsgsRequestVO msgsRequestVO) throws Exception; + + RestResponse sendMsgsData_advc(MsgsRequestVO msgsRequestVO) throws Exception; } 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 8e5b394..0687b5b 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 @@ -13,9 +13,11 @@ import com.itn.mjonApi.mjon.api.send.service.SendService; import com.itn.mjonApi.util.MunjaUtil; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.Response; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; @@ -135,18 +137,12 @@ public class SendServiceImpl implements SendService { }else{ // 실패 return new RestResponse(new FailRestResponse(StatMsg.randomErrorStatCode(),"")); } - - //step5.발송일시 정상여부 확인 - // 1050 - //step6.문자 타입에 따른 비용 처리 가능 여부 확인 - // 1060 - - } @Override public RestResponse sendMsgData_advc(MsgRequestVO msgRequestVO) throws Exception { + log.info(" :: sendMsgData_advc ::"); msgRequestVO.setSendKind("A"); @@ -155,8 +151,6 @@ public class SendServiceImpl implements SendService { return this._getTestMsgReturnData(msgRequestVO.getTest_yn()); } - - // step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능) // 1020 // 폰번호 확인 - 빈 값 -> 유효성 정규식 @@ -164,31 +158,25 @@ public class SendServiceImpl implements SendService { return new RestResponse(new FailRestResponse("STAT_1020","")); } - - - //step4.치환명 정상 여부 확인 - // 1040 - msgRequestVO.setTxtReplYn(this.getTxtReplYn(msgRequestVO)); - // 치환데이터가 있을 경우 - if("Y".equals(msgRequestVO.getTxtReplYn())){ - // 치환 데이터 생성 - msgRequestVO.setMjonMsgSendVOList(this.buildMsgSendVOList(msgRequestVO)); - } + // 치환 데이터 및 수신자 번호 VO 생성 + msgRequestVO.setMjonMsgSendVOList(this.buildMsgSendVOList(msgRequestVO)); + + // sms 변수 변경 msgRequestVO.setSmsTxtArea(msgRequestVO.getSmsTxt()); MjonResponseVO munjaSendResponse = apiService.postForEntity( "/web/mjon/msgdata/sendMsgDataAjax_advc.do" -// "/web/user/login/sendMsgDataAjax.do" , msgRequestVO , String.class ); // convertMjonDataToApiResponse => MjonResponseVO 데이터를 ApiResponse 데이터로 변환하는 메소드 - if(!"fail".equals(munjaSendResponse.getResult())){ // 성공 + log.info(" + munjaSendResponse :: [{}]", munjaSendResponse.toString()); + if("OK".equals(munjaSendResponse.getResult())){ // 성공 return new RestResponse(SendSucRestResponse.convertMjonDataToApiResponse(munjaSendResponse)); }else{ // 실패 - return new RestResponse(new FailRestResponse(StatMsg.randomErrorStatCode(),"")); + return new RestResponse(new FailRestResponse(munjaSendResponse.getStatCode(),"")); } @@ -303,6 +291,7 @@ public class SendServiceImpl implements SendService { ); } } + @Override public RestResponse sendMsgsData(MsgsRequestVO msgsRequestVO) throws Exception { @@ -377,9 +366,9 @@ public class SendServiceImpl implements SendService { , String.class ); // 스팸체크 결과값이 spams 이면 스팸문자로 처리 - if("spams".equals(spamChkEntity.getResult())){ - msgRequestVO.setSpamStatus("Y"); - }; +// if("spams".equals(spamChkEntity.getResult())){ +// msgRequestVO.setSpamStatus("Y"); +// }; log.info("msgRequestVO : [{}]", msgRequestVO.toString()); // 문자 전송하는 부분 @@ -397,6 +386,41 @@ public class SendServiceImpl implements SendService { + return new RestResponse(SendSucRestResponse.SendSuccessMsgsRestResponse(mjonResponseVOList)); + } + + @Override + public RestResponse sendMsgsData_advc(MsgsRequestVO msgsRequestVO) throws Exception { + + + log.info(" :: sendMsgData_advc ::"); + + + if(StringUtils.isNotEmpty(msgsRequestVO.getTest_yn())){ + return this._getTestMsgsReturnData(msgsRequestVO.getTest_yn()); + } + + // msgsVO -> msgVO List로 변환 + List msgRequestVOList = this.getDataCleaning_advc(msgsRequestVO); + + List mjonResponseVOList = new ArrayList(); + for(MsgRequestVO aa : msgRequestVOList){ + + aa.setSmsTxtArea(aa.getSmsTxt()); + aa.setSendKind("A"); + + MjonResponseVO munjaSendResponse = apiService.postForEntity( + "/web/mjon/msgdata/sendMsgDataAjax_advc.do" + , aa + , String.class + ); + + mjonResponseVOList.add(munjaSendResponse); + } + + + + return new RestResponse(SendSucRestResponse.SendSuccessMsgsRestResponse(mjonResponseVOList)); } @@ -496,7 +520,73 @@ public class SendServiceImpl implements SendService { return msgRequestVOList; } + private static List getDataCleaning_advc(MsgsRequestVO msgsRequestVO) { + + List msgRequestVOList = new ArrayList<>(); + + // Reflection으로 Object Field에 접근한다. + Field[] declaredFields = msgsRequestVO.getClass().getDeclaredFields(); + + String mberId = msgsRequestVO.getMberId(); // 사용자 ID + String accessKey = msgsRequestVO.getAccessKey(); // accessKey + String callFrom = msgsRequestVO.getCallFrom(); // 발신자 번호 + String callTo = null; // 수신자 번호 + + List mjonMsgSendVOList = new ArrayList<>(); + for (Field field : declaredFields) { + + Object value = null; + // private Field일 경우 접근을 허용한다. + field.setAccessible(true); + + try { + // Field Value를 참조한다. + value = field.get(msgsRequestVO); + } catch (IllegalAccessException e) { + log.info("Reflection Error. {}", e); + } + + // nullPointException 방지 + if(value != null) + { + log.info("field.getName() : [{}]", field.getName()); + log.info("value.toString() : [{}]", value.toString()); + /** + * 필드 이름으로 분기하여 + * 각각에 맞는 위치에 값을 넣어준다. + */ + if(field.getName().startsWith("callTo")){ // 수신자 번호 + callTo = value.toString(); + }else if(field.getName().startsWith("smsTxt")){ // 문자 내용 + + // 값이 비여 있으면 다음 반복문으로 넘어간다. + if(StringUtils.isEmpty(value.toString())){ + callTo = ""; + continue; + } + MjonMsgSendVO vo = new MjonMsgSendVO(); + vo.setPhone(callTo); + mjonMsgSendVOList.add(vo); + + msgRequestVOList.add( + MsgRequestVO.builder() + .mberId(mberId) + .accessKey(accessKey) + .callFrom(callFrom) + .smsTxt(value.toString()) + .mjonMsgSendVOList(mjonMsgSendVOList) + .build() + ); + // 초기화 + callTo = ""; + } + + + } + } + return msgRequestVOList; + } /** * 치환 후 단문 장문 msg 개수 구하기 * @param msgRequestVO @@ -667,6 +757,13 @@ public class SendServiceImpl implements SendService { */ private static Boolean getCallToListChk(MsgRequestVO msgRequestVO) { Boolean returnData = false; + + String[] test = msgRequestVO.getCallToList(); + + if (ArrayUtils.isEmpty(test)) { + returnData = true; + } + for(String callTo : msgRequestVO.getCallToList()){ /* if(!MunjaUtil.checkPhoneNumberEmpty(callTo)){ @@ -674,7 +771,8 @@ public class SendServiceImpl implements SendService { if(!MunjaUtil.validatePNumWithRegex(callTo)){ message = "휴대폰 번호가 올바르지 않습니다. : " + callTo; break;}; */ - if(!MunjaUtil.validatePNumWithRegex(callTo) // 비여있는지 체크 + + if(!MunjaUtil.checkPhoneNumberEmpty(callTo) // 비여있는지 체크 || !MunjaUtil.validatePNumWithRegex(callTo) // 정규식으로 번호 체크 ) { diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java b/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java index 8aa660e..b446628 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java @@ -63,7 +63,8 @@ public class SendRestController { @CrossOrigin("*") // 모든 요청에 접근 허용 @PostMapping("/api/send/sendMsgs") public ResponseEntity sendMsgs(MsgsRequestVO msgsRequestVO) throws Exception { - return ResponseEntity.ok().body(sendService.sendMsgsData(msgsRequestVO)); + return ResponseEntity.ok().body(sendService.sendMsgsData_advc(msgsRequestVO)); +// return ResponseEntity.ok().body(sendService.sendMsgsData(msgsRequestVO)); }