--- src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java
... | ... | @@ -1,5 +1,9 @@ |
| 1 | 1 |
package itn.let.kakao.kakaoComm; |
| 2 | 2 |
|
| 3 |
+import lombok.Getter; |
|
| 4 |
+import lombok.Setter; |
|
| 5 |
+import lombok.ToString; |
|
| 6 |
+ |
|
| 3 | 7 |
/** |
| 4 | 8 |
* @FileName : KakaoButtonVO.java |
| 5 | 9 |
* @Project : mjon |
... | ... | @@ -8,6 +12,9 @@ |
| 8 | 12 |
|
| 9 | 13 |
* @프로그램 설명 : button, quickReplies 변수 |
| 10 | 14 |
*/ |
| 15 |
+@ToString |
|
| 16 |
+@Getter |
|
| 17 |
+@Setter |
|
| 11 | 18 |
public class KakaoButtonVO {
|
| 12 | 19 |
|
| 13 | 20 |
private String name = ""; // 버튼명 - linkType “AC” 선택 시 버튼명은 “채널추가” 로 고정 |
... | ... | @@ -17,49 +24,5 @@ |
| 17 | 24 |
private String linkMo = ""; // 모바일 웹 링크 주소 (WL 사용시 필수) |
| 18 | 25 |
private String linkPc = ""; // PC 웹 링크 주소 (WL 사용시 선택) |
| 19 | 26 |
private String pluginId = ""; // 플러그인 ID (P1, P2, P3 사용시 필수) |
| 20 |
- |
|
| 21 |
- public String getName() {
|
|
| 22 |
- return name; |
|
| 23 |
- } |
|
| 24 |
- public void setName(String name) {
|
|
| 25 |
- this.name = name; |
|
| 26 |
- } |
|
| 27 |
- public String getLinkType() {
|
|
| 28 |
- return linkType; |
|
| 29 |
- } |
|
| 30 |
- public void setLinkType(String linkType) {
|
|
| 31 |
- this.linkType = linkType; |
|
| 32 |
- } |
|
| 33 |
- public String getLinkAnd() {
|
|
| 34 |
- return linkAnd; |
|
| 35 |
- } |
|
| 36 |
- public void setLinkAnd(String linkAnd) {
|
|
| 37 |
- this.linkAnd = linkAnd; |
|
| 38 |
- } |
|
| 39 |
- public String getLinkIos() {
|
|
| 40 |
- return linkIos; |
|
| 41 |
- } |
|
| 42 |
- public void setLinkIos(String linkIos) {
|
|
| 43 |
- this.linkIos = linkIos; |
|
| 44 |
- } |
|
| 45 |
- public String getLinkMo() {
|
|
| 46 |
- return linkMo; |
|
| 47 |
- } |
|
| 48 |
- public void setLinkMo(String linkMo) {
|
|
| 49 |
- this.linkMo = linkMo; |
|
| 50 |
- } |
|
| 51 |
- public String getLinkPc() {
|
|
| 52 |
- return linkPc; |
|
| 53 |
- } |
|
| 54 |
- public void setLinkPc(String linkPc) {
|
|
| 55 |
- this.linkPc = linkPc; |
|
| 56 |
- } |
|
| 57 |
- public String getPluginId() {
|
|
| 58 |
- return pluginId; |
|
| 59 |
- } |
|
| 60 |
- public void setPluginId(String pluginId) {
|
|
| 61 |
- this.pluginId = pluginId; |
|
| 62 |
- } |
|
| 63 |
- |
|
| 64 | 27 |
|
| 65 | 28 |
} |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java
... | ... | @@ -3,6 +3,10 @@ |
| 3 | 3 |
import java.util.ArrayList; |
| 4 | 4 |
import java.util.List; |
| 5 | 5 |
|
| 6 |
+import lombok.Getter; |
|
| 7 |
+import lombok.Setter; |
|
| 8 |
+import lombok.ToString; |
|
| 9 |
+ |
|
| 6 | 10 |
/** |
| 7 | 11 |
* @FileName : KakaoCommentVO.java |
| 8 | 12 |
* @Project : mjon |
... | ... | @@ -11,6 +15,9 @@ |
| 11 | 15 |
|
| 12 | 16 |
* @프로그램 설명 : comment 변수 |
| 13 | 17 |
*/ |
| 18 |
+@ToString |
|
| 19 |
+@Getter |
|
| 20 |
+@Setter |
|
| 14 | 21 |
public class KakaoCommentVO {
|
| 15 | 22 |
|
| 16 | 23 |
private String content = ""; // 댓글 본분 |
... | ... | @@ -26,60 +33,4 @@ |
| 26 | 33 |
private String originalFileName = ""; |
| 27 | 34 |
|
| 28 | 35 |
private String filePath = ""; |
| 29 |
- |
|
| 30 |
- public String getContent() {
|
|
| 31 |
- return content; |
|
| 32 |
- } |
|
| 33 |
- |
|
| 34 |
- public void setContent(String content) {
|
|
| 35 |
- this.content = content; |
|
| 36 |
- } |
|
| 37 |
- |
|
| 38 |
- public String getCreatedAt() {
|
|
| 39 |
- return createdAt; |
|
| 40 |
- } |
|
| 41 |
- |
|
| 42 |
- public void setCreatedAt(String createdAt) {
|
|
| 43 |
- this.createdAt = createdAt; |
|
| 44 |
- } |
|
| 45 |
- |
|
| 46 |
- public String getStatus() {
|
|
| 47 |
- return status; |
|
| 48 |
- } |
|
| 49 |
- |
|
| 50 |
- public void setStatus(String status) {
|
|
| 51 |
- this.status = status; |
|
| 52 |
- } |
|
| 53 |
- |
|
| 54 |
- public String getUserName() {
|
|
| 55 |
- return userName; |
|
| 56 |
- } |
|
| 57 |
- |
|
| 58 |
- public void setUserName(String userName) {
|
|
| 59 |
- this.userName = userName; |
|
| 60 |
- } |
|
| 61 |
- |
|
| 62 |
- public String getOriginalFileName() {
|
|
| 63 |
- return originalFileName; |
|
| 64 |
- } |
|
| 65 |
- |
|
| 66 |
- public void setOriginalFileName(String originalFileName) {
|
|
| 67 |
- this.originalFileName = originalFileName; |
|
| 68 |
- } |
|
| 69 |
- |
|
| 70 |
- public String getFilePath() {
|
|
| 71 |
- return filePath; |
|
| 72 |
- } |
|
| 73 |
- |
|
| 74 |
- public void setFilePath(String filePath) {
|
|
| 75 |
- this.filePath = filePath; |
|
| 76 |
- } |
|
| 77 |
- |
|
| 78 |
- public List<KakaoCommentVO> getAttachFileList() {
|
|
| 79 |
- return attachFileList; |
|
| 80 |
- } |
|
| 81 |
- |
|
| 82 |
- public void setAttachFileList(List<KakaoCommentVO> attachFileList) {
|
|
| 83 |
- this.attachFileList = attachFileList; |
|
| 84 |
- } |
|
| 85 | 36 |
} |
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
... | ... | @@ -38,6 +38,7 @@ |
| 38 | 38 |
private String msgType; // 메시지 타입 |
| 39 | 39 |
private String templateContent; // 템플릿 내용 |
| 40 | 40 |
private String templateTitle; // 템플릿 제목 |
| 41 |
+ List<KakaoButtonVO> buttonList; // 템플릿 버튼 리스트 |
|
| 41 | 42 |
private String subMsgSendYn; // 대체문자 전송 여부 |
| 42 | 43 |
private String subMsgTxt; // 대체문자 내용 |
| 43 | 44 |
private String subMsgType; // 대체문자 타입 |
... | ... | @@ -48,9 +49,11 @@ |
| 48 | 49 |
// ===== |
| 49 | 50 |
// ===== |
| 50 | 51 |
|
| 51 |
- private float smsPrice; // sms 단가 |
|
| 52 |
- private float mmsPrice; // mms 단가 |
|
| 53 |
- private float kakaoAtPrice; // 카카오 알림톡 단가 |
|
| 52 |
+ private String eachPrice; // sms 단가 |
|
| 53 |
+ private String smsPrice; // sms 단가 |
|
| 54 |
+ private String mmsPrice; // mms 단가 |
|
| 55 |
+ private String kakaoAtPrice; // 카카오 알림톡 단가 |
|
| 56 |
+ private String bizJsonName; // 카카오 알림톡 단가 |
|
| 54 | 57 |
|
| 55 | 58 |
|
| 56 | 59 |
|
... | ... | @@ -69,6 +72,7 @@ |
| 69 | 72 |
"\n , msgType=[" + msgType + "]" + |
| 70 | 73 |
"\n , templateContent=[" + templateContent + "]" + |
| 71 | 74 |
"\n , templateTitle=[" + templateTitle + "]" + |
| 75 |
+ "\n , buttonList=[" + buttonList.toString() + "]" + |
|
| 72 | 76 |
"\n , subMsgSendYn=[" + subMsgSendYn + "]" + |
| 73 | 77 |
"\n , subMsgTxt=[" + subMsgTxt + "]" + |
| 74 | 78 |
"\n , subMsgType=[" + subMsgType + "]" + |
... | ... | @@ -76,9 +80,11 @@ |
| 76 | 80 |
"\n , jsonStr=[" + jsonStr + "]" + |
| 77 | 81 |
"\n , ==== MJ_MSG_DATA INSERT DATA END =======" + |
| 78 | 82 |
"\n " + |
| 83 |
+ "\n , eachPrice=[" + eachPrice + "]" + |
|
| 79 | 84 |
"\n , smsPrice=[" + smsPrice + "]" + |
| 80 | 85 |
"\n , mmsPrice=[" + mmsPrice + "]" + |
| 81 | 86 |
"\n , kakaoAtPrice=[" + kakaoAtPrice + "]" + |
| 87 |
+ "\n , bizJsonName=[" + bizJsonName + "]" + |
|
| 82 | 88 |
"\n ]"; |
| 83 | 89 |
} |
| 84 | 90 |
|
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
... | ... | @@ -1,5 +1,6 @@ |
| 1 | 1 |
package itn.let.kakao.kakaoComm; |
| 2 | 2 |
|
| 3 |
+import java.text.ParseException; |
|
| 3 | 4 |
import java.text.SimpleDateFormat; |
| 4 | 5 |
import java.util.ArrayList; |
| 5 | 6 |
import java.util.Calendar; |
... | ... | @@ -11,11 +12,13 @@ |
| 11 | 12 |
|
| 12 | 13 |
import javax.annotation.Resource; |
| 13 | 14 |
|
| 15 |
+import org.apache.commons.collections4.CollectionUtils; |
|
| 14 | 16 |
import org.apache.commons.lang3.StringUtils; |
| 15 | 17 |
import org.springframework.beans.factory.annotation.Autowired; |
| 16 | 18 |
import org.springframework.http.HttpStatus; |
| 17 | 19 |
import org.springframework.stereotype.Component; |
| 18 | 20 |
|
| 21 |
+import egovframework.rte.fdl.idgnr.EgovIdGnrService; |
|
| 19 | 22 |
import itn.com.cmm.util.StringUtil; |
| 20 | 23 |
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; |
| 21 | 24 |
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; |
... | ... | @@ -38,7 +41,7 @@ |
| 38 | 41 |
|
| 39 | 42 |
@Resource(name = "MjonMsgDataService") |
| 40 | 43 |
private MjonMsgDataService mjonMsgDataService; |
| 41 |
- |
|
| 44 |
+ |
|
| 42 | 45 |
@Autowired |
| 43 | 46 |
KakaoApiTemplate kakaoApiTemplate; |
| 44 | 47 |
|
... | ... | @@ -48,7 +51,10 @@ |
| 48 | 51 |
@Autowired |
| 49 | 52 |
private MjonCommon mjonCommon; |
| 50 | 53 |
|
| 51 |
- |
|
| 54 |
+ // 클래스 수준에서 정적 Pattern 정의 (성능 최적화) |
|
| 55 |
+ private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}");
|
|
| 56 |
+ |
|
| 57 |
+ private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
|
| 52 | 58 |
|
| 53 | 59 |
// 단문 메세지 타입 |
| 54 | 60 |
public static final String SHORT_MSG_TYPE = "SMS"; |
... | ... | @@ -67,43 +73,41 @@ |
| 67 | 73 |
* @throws Exception |
| 68 | 74 |
* |
| 69 | 75 |
*/ |
| 70 |
- public List<KakaoSendAdvcVO> populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception {
|
|
| 76 |
+ public List<KakaoSendAdvcVO> populateSendLists(KakaoVO kakaoVO, boolean isHolidayNotified, StatusResponse statusResponse) throws Exception {
|
|
| 71 | 77 |
|
| 72 | 78 |
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) |
| 73 | 79 |
// String befCash = kakaoVO.getBefCash(); |
| 74 | 80 |
|
| 75 |
- |
|
| 81 |
+ |
|
| 76 | 82 |
|
| 77 | 83 |
|
| 78 | 84 |
log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size());
|
| 79 | 85 |
|
| 80 | 86 |
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>(); |
| 87 |
+ Calendar calendar = setupBaseDate(kakaoVO, isHolidayNotified); |
|
| 88 |
+ |
|
| 81 | 89 |
|
| 82 |
- |
|
| 83 |
- // 예약 시간 기본값 설정 |
|
| 84 |
- Date now = new Date(); |
|
| 85 |
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
|
| 86 |
- // ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정 |
|
| 87 |
- // 화면에서 예약문자면 예약시간을 regDate로 설정한다. |
|
| 88 |
- Date baseDate; |
|
| 89 |
- if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
|
|
| 90 |
- kakaoVO.setReqDate(sdf.format(now)); // ReqDate에 현재 시간 설정 |
|
| 91 |
- baseDate = now; |
|
| 92 |
- } else {
|
|
| 93 |
- baseDate = sdf.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정 |
|
| 94 |
- } |
|
| 95 |
- |
|
| 96 |
- Calendar calendar = Calendar.getInstance(); |
|
| 97 |
- calendar.setTime(baseDate); // calendar에 baseDate 설정 |
|
| 98 |
- |
|
| 99 | 90 |
|
| 100 | 91 |
KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); |
| 101 |
- log.info(" + templateDetail :: [{}]", templateDetail.toString());
|
|
| 102 | 92 |
String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿 |
| 93 |
+ kakaoVO.setTemplateContent(templateContent); |
|
| 103 | 94 |
String templateTitle = templateDetail.getTemplateTitle(); |
| 104 |
- log.info(" + templateTitle :: [{}]",templateTitle);
|
|
| 105 | 95 |
|
| 106 |
- kakaoVO.setTxtReplYn(replYnChecker(templateContent+" "+templateTitle)); |
|
| 96 |
+ |
|
| 97 |
+// log.info(" + templateDetail :: [{}]", templateDetail);
|
|
| 98 |
+// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString()));
|
|
| 99 |
+ |
|
| 100 |
+ Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); |
|
| 101 |
+ Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); |
|
| 102 |
+ Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); |
|
| 103 |
+ |
|
| 104 |
+ /** @jsonStr 필요유무 */ |
|
| 105 |
+ boolean hasTitleOrButtons = StringUtils.isNotEmpty(templateTitle) |
|
| 106 |
+ || CollectionUtils.isNotEmpty(templateDetail.getButtonList()); |
|
| 107 |
+ |
|
| 108 |
+ /** @jsonStr 반복유무 */ |
|
| 109 |
+ boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; |
|
| 110 |
+ String sharedJsonStr = null; |
|
| 107 | 111 |
|
| 108 | 112 |
String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 |
| 109 | 113 |
|
... | ... | @@ -113,19 +117,31 @@ |
| 113 | 117 |
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); |
| 114 | 118 |
|
| 115 | 119 |
|
| 116 |
- int counter = 0; // 분할 건수 카운터 |
|
| 117 |
- // Map에 총 갯수가 수신자 갯수와 동일함 |
|
| 118 |
- for(Map<String, String> variables : kakaoVO.getVarListMap()) {
|
|
| 120 |
+ |
|
| 121 |
+ |
|
| 122 |
+ /** @MSGID KEY값 */ |
|
| 123 |
+ log.info("idList ===================================================== ");
|
|
| 124 |
+ List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); |
|
| 125 |
+ log.info("+ idList:: [{}]", idList.toArray().toString());
|
|
| 126 |
+// for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) {
|
|
| 127 |
+// kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); |
|
| 128 |
+// kakaoSendAdvcListVO.get(i).setBizJsonName(idList.get(i)); |
|
| 129 |
+// } |
|
| 130 |
+ |
|
| 131 |
+ |
|
| 132 |
+ |
|
| 133 |
+ // 분할 건수 카운터 |
|
| 134 |
+ int counter = 0; |
|
| 135 |
+/** @Map에 총 갯수가 수신자 갯수와 동일함 */ |
|
| 136 |
+ List<Map<String, String>> varList = kakaoVO.getVarListMap(); |
|
| 137 |
+ for (int i = 0; i < varList.size(); i++) {
|
|
| 138 |
+// for(Map<String, String> variables : kakaoVO.getVarListMap()) {
|
|
| 139 |
+ // 치환 데이터 |
|
| 140 |
+ Map<String, String> variables = varList.get(i); |
|
| 119 | 141 |
|
| 120 |
- KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); |
|
| 121 |
- |
|
| 122 |
-// 공통 기본값 |
|
| 123 |
- sendVO.setMsgType("8");
|
|
| 124 |
- sendVO.setSenderKey(kakaoVO.getSenderKey()); |
|
| 125 |
- sendVO.setTemplateCode(kakaoVO.getTemplateCode()); |
|
| 126 |
- sendVO.setUserId(kakaoVO.getUserId()); // 수신자 |
|
| 127 |
- sendVO.setCallFrom(kakaoVO.getCallFrom()); // 발신자 |
|
| 128 |
- sendVO.setAgentCode("04"); // 발신자
|
|
| 142 |
+/** @공통 기본값 */ |
|
| 143 |
+ KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); |
|
| 144 |
+ |
|
| 129 | 145 |
|
| 130 | 146 |
// step1 |
| 131 | 147 |
// Step 1-1: 값 치환 및 수신번호 셋팅 |
... | ... | @@ -135,14 +151,20 @@ |
| 135 | 151 |
variables.remove("callToList"); // 사용 후 제거.
|
| 136 | 152 |
} |
| 137 | 153 |
|
| 138 |
- // Step 1-3: 템플릿 치환데이터 설정 |
|
| 139 |
- // TxtReplYn이 "Y"일 때만 치환 수행 |
|
| 140 |
- if ("Y".equals(kakaoVO.getTxtReplYn())) {
|
|
| 154 |
+/** @Step1-3: 템플릿 치환데이터 설정 */ |
|
| 155 |
+ if (hasContentReplacement) {
|
|
| 141 | 156 |
templateContent = mjonCommon.ATReplaceTemplateVariables(templateContent, variables); |
| 142 |
- if("TEXT".equals(templateDetail.getTemplateEmphasizeType())) {
|
|
| 157 |
+ if(hasTitleReplacement) {
|
|
| 143 | 158 |
templateTitle = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables); |
| 144 | 159 |
} |
| 145 | 160 |
} |
| 161 |
+/** @버튼 치환 */ // 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정 |
|
| 162 |
+ List<KakaoButtonVO> buttonList = templateDetail.getButtonList(); |
|
| 163 |
+ if(hasButtonReplacement) {
|
|
| 164 |
+ buttonList = replaceButtonLinks(buttonList, variables); |
|
| 165 |
+ } |
|
| 166 |
+ sendVO.setButtonList(buttonList); |
|
| 167 |
+ |
|
| 146 | 168 |
sendVO.setTemplateTitle(templateTitle); |
| 147 | 169 |
sendVO.setTemplateContent(templateContent); |
| 148 | 170 |
|
... | ... | @@ -154,6 +176,8 @@ |
| 154 | 176 |
} |
| 155 | 177 |
sendVO.setSubMsgTxt(subMsgTxt);// 실패 |
| 156 | 178 |
} |
| 179 |
+ |
|
| 180 |
+ |
|
| 157 | 181 |
/* |
| 158 | 182 |
log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n",
|
| 159 | 183 |
kakaoSendAdvcVO.getCallTo(), |
... | ... | @@ -174,9 +198,13 @@ |
| 174 | 198 |
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); |
| 175 | 199 |
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); |
| 176 | 200 |
|
| 201 |
+ |
|
| 202 |
+ String shortPStr = Float.toString(shortPrice); |
|
| 203 |
+ String mmsPStr = Float.toString(longPrice); |
|
| 204 |
+ |
|
| 177 | 205 |
// 공통 가격 설정 |
| 178 |
- sendVO.setSmsPrice(shortPrice); |
|
| 179 |
- sendVO.setMmsPrice(longPrice); |
|
| 206 |
+ sendVO.setSmsPrice(shortPStr); |
|
| 207 |
+ sendVO.setMmsPrice(mmsPStr); |
|
| 180 | 208 |
|
| 181 | 209 |
|
| 182 | 210 |
if("Y".equals(kakaoVO.getSubMsgSendYn())) {
|
... | ... | @@ -189,44 +217,48 @@ |
| 189 | 217 |
} |
| 190 | 218 |
|
| 191 | 219 |
boolean isMms = "MMS".equals(sendType); |
| 192 |
-// kakaoAtPrice = isMms ? longPrice : shortPrice; |
|
| 193 |
-// sendVO.setKakaoAtPrice(getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice())); |
|
| 194 |
- sendVO.setKakaoAtPrice(isMms ? longPrice : shortPrice); |
|
| 220 |
+ sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); |
|
| 195 | 221 |
|
| 196 | 222 |
|
| 197 | 223 |
} else {
|
| 198 | 224 |
kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); |
| 199 |
- sendVO.setKakaoAtPrice(kakaoAtPrice); |
|
| 225 |
+ sendVO.setEachPrice( Float.toString(kakaoAtPrice) ); |
|
| 200 | 226 |
} |
| 201 | 227 |
|
| 202 | 228 |
|
| 203 | 229 |
|
| 204 | 230 |
// step4 |
| 205 | 231 |
// 예약 시간 설정 및 분할 데이터 설정 |
| 206 |
- if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())) {
|
|
| 207 |
- // 분할 발송일 경우 |
|
| 208 |
- if ("Y".equalsIgnoreCase(kakaoVO.getDivideChk())) {
|
|
| 209 |
- if (counter == Integer.parseInt(kakaoVO.getDivideCnt())) { // 지정된 건수마다 간격 추가
|
|
| 210 |
- counter = 0; |
|
| 211 |
- calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); |
|
| 212 |
- } |
|
| 213 |
- counter++; |
|
| 214 |
- } |
|
| 215 |
- // 예약 시간 설정 |
|
| 232 |
+ if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())
|
|
| 233 |
+ && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) |
|
| 234 |
+ && counter == Integer.parseInt(kakaoVO.getDivideCnt())) |
|
| 235 |
+ {
|
|
| 236 |
+ counter = 0; |
|
| 237 |
+ calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); |
|
| 216 | 238 |
} |
| 239 |
+ counter++; |
|
| 217 | 240 |
// 즉시 발송인경우 현재 시간 |
| 218 | 241 |
// 예약인 경우 위에 설정한 시간 입력 |
| 219 |
- sendVO.setReqDate(sdf.format(calendar.getTime())); |
|
| 242 |
+ sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); |
|
| 220 | 243 |
|
| 221 | 244 |
|
| 222 |
- // step5 |
|
| 223 |
- // 전송 메세지 설정 json파일 만들기 |
|
| 224 |
- if("Y".equals(kakaoVO.getBizJsonYn())) {
|
|
| 225 |
- String jsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); |
|
| 226 |
- sendVO.setJsonStr(jsonStr); |
|
| 245 |
+/** @step5 전송 메세지 설정 json파일 만들기*/ |
|
| 246 |
+ // 타이틀과 버튼이 있고 |
|
| 247 |
+ String msgId = idList.get(i); |
|
| 248 |
+ sendVO.setMsgId(msgId); |
|
| 249 |
+ if(hasTitleOrButtons) {
|
|
| 250 |
+ // 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성 |
|
| 251 |
+ if(needsJsonReplacement) {
|
|
| 252 |
+ sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); |
|
| 253 |
+ sendVO.setBizJsonName(msgId); |
|
| 254 |
+ } else if (StringUtils.isEmpty(sharedJsonStr)) {
|
|
| 255 |
+ // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 |
|
| 256 |
+ sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); |
|
| 257 |
+ sendVO.setBizJsonName(idList.get(0)); |
|
| 258 |
+ } |
|
| 259 |
+ sendVO.setJsonStr(sharedJsonStr); |
|
| 260 |
+ |
|
| 227 | 261 |
} |
| 228 |
-// log.info(" + sendVO :: [{}]", sendVO.toString());
|
|
| 229 |
- |
|
| 230 | 262 |
kakaoSendAdvcListVO.add(sendVO); |
| 231 | 263 |
} |
| 232 | 264 |
|
... | ... | @@ -234,15 +266,108 @@ |
| 234 | 266 |
return kakaoSendAdvcListVO; |
| 235 | 267 |
} |
| 236 | 268 |
|
| 237 |
- |
|
| 238 |
- private String replYnChecker(String input) {
|
|
| 239 |
- // #{...} 패턴을 확인하는 정규 표현식
|
|
| 240 |
- String regex = "#\\{[^}]+\\}";
|
|
| 241 |
- Pattern pattern = Pattern.compile(regex); |
|
| 242 |
- Matcher matcher = pattern.matcher(input); |
|
| 269 |
+ private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isHolidayNotified) throws ParseException {
|
|
| 270 |
+ // 예약 시간 기본값 설정 |
|
| 271 |
+ Date now = new Date(); |
|
| 272 |
+ // ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정 |
|
| 273 |
+ // 화면에서 예약문자면 예약시간을 regDate로 설정한다. |
|
| 274 |
+ Date baseDate; |
|
| 275 |
+ if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
|
|
| 276 |
+ kakaoVO.setReqDate(DATE_FORMATTER.format(now)); // ReqDate에 현재 시간 설정 |
|
| 277 |
+ baseDate = now; |
|
| 278 |
+ } else {
|
|
| 279 |
+ baseDate = DATE_FORMATTER.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정 |
|
| 280 |
+ } |
|
| 243 | 281 |
|
| 244 |
- // 패턴이 존재하면 "Y", 없으면 "N" 반환 |
|
| 245 |
- return matcher.find() ? "Y" : "N"; |
|
| 282 |
+ // 시간 성정 |
|
| 283 |
+ Calendar calendar = Calendar.getInstance(); |
|
| 284 |
+ calendar.setTime(baseDate); // calendar에 baseDate 설정 |
|
| 285 |
+ |
|
| 286 |
+ // 지연 여부 처리 |
|
| 287 |
+ // 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay |
|
| 288 |
+ if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn()) |
|
| 289 |
+ && isHolidayNotified) {
|
|
| 290 |
+ calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 |
|
| 291 |
+ } |
|
| 292 |
+ return calendar; |
|
| 293 |
+ } |
|
| 294 |
+ |
|
| 295 |
+ /** |
|
| 296 |
+ * @methodName : createSendVO |
|
| 297 |
+ * @author : 이호영 |
|
| 298 |
+ * @date : 2025. 3. 19. |
|
| 299 |
+ * @description : populateSendLists 반복에 필요한 공통생성 부분 |
|
| 300 |
+ * @return : KakaoSendAdvcVO |
|
| 301 |
+ * @param kakaoVO |
|
| 302 |
+ * @return |
|
| 303 |
+ * |
|
| 304 |
+ */ |
|
| 305 |
+ private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) {
|
|
| 306 |
+ KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); |
|
| 307 |
+ sendVO.setMsgType("8");
|
|
| 308 |
+ sendVO.setSenderKey(kakaoVO.getSenderKey()); |
|
| 309 |
+ sendVO.setTemplateCode(kakaoVO.getTemplateCode()); |
|
| 310 |
+ sendVO.setUserId(kakaoVO.getUserId()); |
|
| 311 |
+ sendVO.setCallFrom(kakaoVO.getCallFrom()); |
|
| 312 |
+ sendVO.setAgentCode("04");
|
|
| 313 |
+ return sendVO; |
|
| 314 |
+ } |
|
| 315 |
+ |
|
| 316 |
+ private List<KakaoButtonVO> replaceButtonLinks(List<KakaoButtonVO> buttonList, |
|
| 317 |
+ Map<String, String> variables) {
|
|
| 318 |
+ |
|
| 319 |
+ if (buttonList != null) {
|
|
| 320 |
+ for (KakaoButtonVO button : buttonList) {
|
|
| 321 |
+ // 각 링크 필드에 대해 치환 수행 |
|
| 322 |
+ if (button.getLinkAnd() != null) {
|
|
| 323 |
+ button.setLinkAnd(mjonCommon.ATReplaceTemplateVariables(button.getLinkAnd(), variables)); |
|
| 324 |
+ } |
|
| 325 |
+ if (button.getLinkIos() != null) {
|
|
| 326 |
+ button.setLinkIos(mjonCommon.ATReplaceTemplateVariables(button.getLinkIos(), variables)); |
|
| 327 |
+ } |
|
| 328 |
+ if (button.getLinkMo() != null) {
|
|
| 329 |
+ button.setLinkMo(mjonCommon.ATReplaceTemplateVariables(button.getLinkMo(), variables)); |
|
| 330 |
+ } |
|
| 331 |
+ if (button.getLinkPc() != null) {
|
|
| 332 |
+ button.setLinkPc(mjonCommon.ATReplaceTemplateVariables(button.getLinkPc(), variables)); |
|
| 333 |
+ } |
|
| 334 |
+ } |
|
| 335 |
+ // 치환된 버튼 리스트를 sendVO에 반영 |
|
| 336 |
+// sendVO.setButtonList(buttonList); // KakaoSendAdvcVO에 setButtonList가 있다고 가정 |
|
| 337 |
+ } |
|
| 338 |
+ |
|
| 339 |
+ return buttonList; |
|
| 340 |
+ } |
|
| 341 |
+ |
|
| 342 |
+ /** |
|
| 343 |
+ * 버튼 리스트에 치환 패턴(#{...})이 있는지 확인합니다.
|
|
| 344 |
+ * @param buttonList 버튼 리스트 (null 가능) |
|
| 345 |
+ * @return 치환 패턴이 있으면 true, 없으면 false |
|
| 346 |
+ */ |
|
| 347 |
+ private boolean needsButtonReplacement(List<KakaoButtonVO> buttonList) {
|
|
| 348 |
+ if (buttonList == null) {
|
|
| 349 |
+ return false; |
|
| 350 |
+ } |
|
| 351 |
+ return buttonList.stream().anyMatch(button -> |
|
| 352 |
+ replBooleanStrChecker(button.getLinkAnd()) || |
|
| 353 |
+ replBooleanStrChecker(button.getLinkIos()) || |
|
| 354 |
+ replBooleanStrChecker(button.getLinkMo()) || |
|
| 355 |
+ replBooleanStrChecker(button.getLinkPc()) |
|
| 356 |
+ ); |
|
| 357 |
+ } |
|
| 358 |
+ |
|
| 359 |
+ /** |
|
| 360 |
+ * 입력 문자열에 치환 패턴(#{...})이 있는지 확인합니다.
|
|
| 361 |
+ * @param input 확인할 문자열 (null 가능) |
|
| 362 |
+ * @return 치환 패턴이 있으면 true, 없으면 false |
|
| 363 |
+ */ |
|
| 364 |
+ private boolean replBooleanStrChecker(String input) {
|
|
| 365 |
+ // #{...} 패턴을 확인하는 정규 표현식
|
|
| 366 |
+ if (input == null) {
|
|
| 367 |
+ return false; |
|
| 368 |
+ } |
|
| 369 |
+ Matcher matcher = REPLACEMENT_PATTERN.matcher(input); |
|
| 370 |
+ return matcher.find(); |
|
| 246 | 371 |
} |
| 247 | 372 |
|
| 248 | 373 |
|
--- src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
+++ src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
... | ... | @@ -38,7 +38,7 @@ |
| 38 | 38 |
|
| 39 | 39 |
// 버튼리스트 JSON 생성 |
| 40 | 40 |
JSONArray buttonList = new JSONArray(); |
| 41 |
- for(KakaoButtonVO buttonInfoVO : templateDetail.getButtonList()) {
|
|
| 41 |
+ for(KakaoButtonVO buttonInfoVO : sendVO.getButtonList()) {
|
|
| 42 | 42 |
JSONObject buttonInfo = new JSONObject(); |
| 43 | 43 |
|
| 44 | 44 |
buttonInfo.put("name", buttonInfoVO.getName());
|
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
... | ... | @@ -6,6 +6,7 @@ |
| 6 | 6 |
import org.springframework.stereotype.Repository; |
| 7 | 7 |
|
| 8 | 8 |
import egovframework.rte.psl.dataaccess.EgovAbstractDAO; |
| 9 |
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; |
|
| 9 | 10 |
import itn.let.kakao.kakaoComm.KakaoVO; |
| 10 | 11 |
|
| 11 | 12 |
@Repository("kakaoAlimTalkDAO")
|
... | ... | @@ -39,15 +40,6 @@ |
| 39 | 40 |
} catch (Exception e) {
|
| 40 | 41 |
System.out.println("++++++++++++++++++++ selectDeleteProfileInfo DAO Error !!! " + e);
|
| 41 | 42 |
} |
| 42 |
- |
|
| 43 |
- return result; |
|
| 44 |
- } |
|
| 45 |
- |
|
| 46 |
- public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
|
|
| 47 |
- |
|
| 48 |
- int result = 0; |
|
| 49 |
- |
|
| 50 |
- result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
|
|
| 51 | 43 |
|
| 52 | 44 |
return result; |
| 53 | 45 |
} |
... | ... | @@ -94,4 +86,22 @@ |
| 94 | 86 |
public void updateKakaoFtNotSend(KakaoVO kakaoVO) {
|
| 95 | 87 |
select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO);
|
| 96 | 88 |
} |
| 89 |
+ |
|
| 90 |
+ public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
|
|
| 91 |
+ |
|
| 92 |
+ int result = 0; |
|
| 93 |
+ |
|
| 94 |
+ result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
|
|
| 95 |
+ |
|
| 96 |
+ return result; |
|
| 97 |
+ } |
|
| 98 |
+ |
|
| 99 |
+ public int insertKakaoAtDataInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
|
| 100 |
+ |
|
| 101 |
+ return update("kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc", kakaoSendAdvcVOList);
|
|
| 102 |
+ } |
|
| 103 |
+ |
|
| 104 |
+ public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
|
| 105 |
+ insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList);
|
|
| 106 |
+ } |
|
| 97 | 107 |
} |
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
... | ... | @@ -11,10 +11,14 @@ |
| 11 | 11 |
import java.util.HashMap; |
| 12 | 12 |
import java.util.List; |
| 13 | 13 |
import java.util.Map; |
| 14 |
+import java.util.Objects; |
|
| 15 |
+import java.util.Set; |
|
| 16 |
+import java.util.stream.Collectors; |
|
| 14 | 17 |
|
| 15 | 18 |
import javax.annotation.Resource; |
| 16 | 19 |
import javax.servlet.http.HttpServletRequest; |
| 17 | 20 |
|
| 21 |
+import org.apache.commons.lang3.StringUtils; |
|
| 18 | 22 |
import org.springframework.beans.factory.annotation.Autowired; |
| 19 | 23 |
import org.springframework.http.HttpStatus; |
| 20 | 24 |
import org.springframework.stereotype.Service; |
... | ... | @@ -23,6 +27,7 @@ |
| 23 | 27 |
import egovframework.rte.fdl.idgnr.EgovIdGnrService; |
| 24 | 28 |
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; |
| 25 | 29 |
import itn.com.cmm.LoginVO; |
| 30 |
+import itn.com.cmm.MjonMsgSendVO; |
|
| 26 | 31 |
import itn.com.utl.fcc.service.EgovStringUtil; |
| 27 | 32 |
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; |
| 28 | 33 |
import itn.let.kakao.kakaoComm.KakaoSendUtil; |
... | ... | @@ -44,6 +49,7 @@ |
| 44 | 49 |
import itn.let.sym.site.service.JoinSettingVO; |
| 45 | 50 |
import itn.let.sym.site.service.impl.SiteManagerDAO; |
| 46 | 51 |
import itn.let.uss.umt.service.EgovUserManageService; |
| 52 |
+import itn.let.uss.umt.service.UserManageVO; |
|
| 47 | 53 |
import lombok.extern.slf4j.Slf4j; |
| 48 | 54 |
|
| 49 | 55 |
@Slf4j |
... | ... | @@ -67,6 +73,9 @@ |
| 67 | 73 |
|
| 68 | 74 |
@Resource(name = "egovMjonMsgIdGnrService") |
| 69 | 75 |
private EgovIdGnrService idgenMsgId; |
| 76 |
+ |
|
| 77 |
+ @Resource(name = "egovMjonMsgGroupIdGnrService") |
|
| 78 |
+ private EgovIdGnrService idgenMjonMsgGroupId; |
|
| 70 | 79 |
|
| 71 | 80 |
@Resource(name = "mjonPayService") |
| 72 | 81 |
private MjonPayService mjonPayService; |
... | ... | @@ -77,7 +86,7 @@ |
| 77 | 86 |
/** userManageService */ |
| 78 | 87 |
@Resource(name = "userManageService") |
| 79 | 88 |
private EgovUserManageService userManageService; |
| 80 |
- |
|
| 89 |
+ |
|
| 81 | 90 |
@Autowired |
| 82 | 91 |
KakaoSendUtil kakaoSendUtil; |
| 83 | 92 |
|
... | ... | @@ -855,6 +864,9 @@ |
| 855 | 864 |
|
| 856 | 865 |
log.info(" :: [{}]", kakaoVO.toString());
|
| 857 | 866 |
|
| 867 |
+ |
|
| 868 |
+ // 측정할 메소드 호출 전 시간 기록 |
|
| 869 |
+ Instant start = Instant.now(); |
|
| 858 | 870 |
// KakaoSendAdvcVO |
| 859 | 871 |
|
| 860 | 872 |
Map<String, Object> returnMap = new HashMap<>(); |
... | ... | @@ -884,59 +896,85 @@ |
| 884 | 896 |
|
| 885 | 897 |
StatusResponse statusResponse = new StatusResponse(); |
| 886 | 898 |
|
| 899 |
+/** @isHolidayNotified |
|
| 900 |
+ * @false : 알림 X |
|
| 901 |
+ * @true : 알림 O */ |
|
| 902 |
+ boolean isHolidayNotified = mjonCommon.handleSmishingAlert(); |
|
| 903 |
+ |
|
| 904 |
+/** @LETTNGNRLMBER 사용자 정보 -> 스미싱의심 여부 */ |
|
| 905 |
+ UserManageVO userManageVO = mjonCommon.getUserManageInfo(userId); |
|
| 906 |
+ kakaoVO.setAtSmishingYn(userManageVO.getAtSmishingYn()); |
|
| 887 | 907 |
|
| 888 |
-/** 카카오톡 전송 설정 -------------------------------------------*/ |
|
| 889 |
- List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, statusResponse); |
|
| 908 |
+/** @카카오톡 전송 list 셋팅 -------------------------------------------*/ |
|
| 909 |
+ List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, isHolidayNotified, statusResponse); |
|
| 890 | 910 |
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
|
| 891 | 911 |
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
|
| 892 | 912 |
return statusResponse; |
| 893 | 913 |
} |
| 894 | 914 |
|
| 895 |
- // 측정할 메소드 호출 전 시간 기록 |
|
| 896 |
- Instant start = Instant.now(); |
|
| 897 |
-/** 전송금액 확인 --------------------------------------------------*/ |
|
| 915 |
+ |
|
| 916 |
+ |
|
| 917 |
+/** @전송금액 확인 --------------------------------------------------*/ |
|
| 898 | 918 |
if (!isCashSufficient(userId, kakaoSendAdvcListVO)) {
|
| 899 | 919 |
log.error("Insufficient balance for message sending.");
|
| 900 | 920 |
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); |
| 901 | 921 |
} |
| 902 | 922 |
|
| 903 |
- // 측정할 메소드 호출 후 시간 기록 |
|
| 904 |
- Instant end = Instant.now(); |
|
| 905 |
- |
|
| 906 |
- log.info(" + start :: [{}]", start);
|
|
| 907 |
- // 실행 시간 계산 (나노초, 밀리초, 초) |
|
| 908 |
- System.out.println("메소드 실행 시간 (초): " + Duration.between(start, end).getSeconds() + " s");
|
|
| 909 |
- System.out.println("메소드 실행 시간 (Nano): " + Duration.between(start, end).getNano() + " Nano");
|
|
| 910 |
- |
|
| 911 |
- |
|
| 912 |
- |
|
| 913 | 923 |
|
| 914 | 924 |
|
| 915 | 925 |
start = Instant.now(); |
| 916 |
- List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoSendAdvcListVO.size()); |
|
| 917 |
- for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) {
|
|
| 918 |
- kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); |
|
| 926 |
+ Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream() |
|
| 927 |
+ .collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice)); |
|
| 928 |
+ |
|
| 929 |
+ // json Str이 있는지 확인 |
|
| 930 |
+ Boolean isJsonNotEmpty = StringUtils.isNotEmpty(kakaoSendAdvcListVO.get(0).getJsonStr()); |
|
| 931 |
+ // json Str 값이 list에서 다른지 확인 |
|
| 932 |
+ Boolean isJsonNameAllSame = false; |
|
| 933 |
+ if(isJsonNotEmpty) {
|
|
| 934 |
+ String firstBizJsonName = kakaoSendAdvcListVO.get(0).getBizJsonName(); |
|
| 935 |
+ isJsonNameAllSame = kakaoSendAdvcListVO.stream() |
|
| 936 |
+ .allMatch(t -> Objects.equals(t.getBizJsonName(), firstBizJsonName)); |
|
| 919 | 937 |
} |
| 920 | 938 |
|
| 939 |
+ |
|
| 940 |
+ // instTotalCnt : 화면에서 보여줄 총 발송건수 |
|
| 941 |
+ int instTotalCnt = 0; |
|
| 942 |
+ List<Map.Entry<String, List<KakaoSendAdvcVO>>> entryList = new ArrayList<>(priceGroupedMessages.entrySet()); |
|
| 943 |
+ // 기본 for문으로 반복 카운트를 사용하기 위해 foreach -> for 수정 |
|
| 944 |
+ for (int i = 0; i < entryList.size(); i++) {
|
|
| 945 |
+ Map.Entry<String, List<KakaoSendAdvcVO>> entry = entryList.get(i); |
|
| 946 |
+ |
|
| 947 |
+ List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 |
|
| 948 |
+ |
|
| 949 |
+ String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); |
|
| 950 |
+ groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId)); |
|
| 951 |
+ |
|
| 952 |
+ |
|
| 953 |
+ // 발송 데이터 삽입 |
|
| 954 |
+// int instCnt = this.insertKakaoData_advc(groupedMsgList, i, isJsonNotEmpty, isJsonNameAllSame); |
|
| 955 |
+ int instCnt = 6; |
|
| 956 |
+ |
|
| 957 |
+ if(instCnt > 0) {
|
|
| 958 |
+ |
|
| 959 |
+ instTotalCnt += instCnt; |
|
| 960 |
+// this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList); |
|
| 961 |
+ this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, groupedMsgList); |
|
| 962 |
+ } |
|
| 963 |
+ |
|
| 964 |
+ |
|
| 965 |
+ } |
|
| 966 |
+ |
|
| 967 |
+ |
|
| 921 | 968 |
// 측정할 메소드 호출 후 시간 기록 |
| 922 |
- end = Instant.now(); |
|
| 969 |
+ Instant end = Instant.now(); |
|
| 923 | 970 |
|
| 924 | 971 |
log.info(" + start :: [{}]", start);
|
| 925 | 972 |
// 실행 시간 계산 (나노초, 밀리초, 초) |
| 926 | 973 |
System.out.println("메소드 실행 시간 (초): " + Duration.between(start, end).getSeconds() + " s");
|
| 927 | 974 |
System.out.println("메소드 실행 시간 (Nano): " + Duration.between(start, end).getNano() + " Nano");
|
| 928 |
- kakaoSendAdvcListVO.forEach(t-> log.info(" + t.toString() :: [{}]", t.toString()) );
|
|
| 975 |
+ kakaoSendAdvcListVO.forEach(t-> log.info(" + t.toString() :: [{}]", t.toString()) );
|
|
| 929 | 976 |
|
| 930 |
- |
|
| 931 |
- |
|
| 932 |
- |
|
| 933 |
- |
|
| 934 |
- |
|
| 935 |
- |
|
| 936 |
- |
|
| 937 |
- |
|
| 938 |
- |
|
| 939 |
- |
|
| 977 |
+// idgenMjonMsgGroupId.getNextStringId(); |
|
| 940 | 978 |
|
| 941 | 979 |
|
| 942 | 980 |
|
... | ... | @@ -956,6 +994,133 @@ |
| 956 | 994 |
|
| 957 | 995 |
|
| 958 | 996 |
|
| 997 |
+ |
|
| 998 |
+ private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
|
|
| 999 |
+ // TODO Auto-generated method stub |
|
| 1000 |
+ |
|
| 1001 |
+ log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
|
|
| 1002 |
+ log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", kakaoSendAdvcVOList.get(0).toString());
|
|
| 1003 |
+ |
|
| 1004 |
+ |
|
| 1005 |
+ /* |
|
| 1006 |
+ #msgGroupId#, |
|
| 1007 |
+ #userId#, |
|
| 1008 |
+ #callFrom#, |
|
| 1009 |
+ #smsTxt#, mjonMsgVO.setSmsTxt(kakaoVO.getTemplateContent()); |
|
| 1010 |
+ // #mmsSubject#, |
|
| 1011 |
+ |
|
| 1012 |
+ #reqDate#, |
|
| 1013 |
+ #msgGroupCnt#, |
|
| 1014 |
+ // #conectMthd#, |
|
| 1015 |
+ #msgType#, |
|
| 1016 |
+ // #msgKind#, |
|
| 1017 |
+ |
|
| 1018 |
+ #agentCode#, |
|
| 1019 |
+ #eachPrice#, |
|
| 1020 |
+ #reserveYn#, |
|
| 1021 |
+ #befCash#, |
|
| 1022 |
+ #befPoint#, |
|
| 1023 |
+ |
|
| 1024 |
+ // #recommId#, |
|
| 1025 |
+ // #fileCnt#, |
|
| 1026 |
+ #totPrice#, |
|
| 1027 |
+ // #eventYn#, |
|
| 1028 |
+ // #delayYn#, |
|
| 1029 |
+ |
|
| 1030 |
+ #atDelayYn#, |
|
| 1031 |
+ #kakaoSubMagOrgnlTxt# |
|
| 1032 |
+ */ |
|
| 1033 |
+ } |
|
| 1034 |
+ |
|
| 1035 |
+ /** |
|
| 1036 |
+ * @methodName : insertKakaoData_advc |
|
| 1037 |
+ * @author : 이호영 |
|
| 1038 |
+ * @date : 2025. 3. 20. |
|
| 1039 |
+ * @description : 카카오 batch 발송 => mj_msg_data |
|
| 1040 |
+ * @return : int |
|
| 1041 |
+ * @param kakaoSendAdvcVOList |
|
| 1042 |
+ * @param parentLoopCount |
|
| 1043 |
+ * @param isJsonNotEmpty |
|
| 1044 |
+ * @param isJsonNameAllSame |
|
| 1045 |
+ * @return |
|
| 1046 |
+ * |
|
| 1047 |
+ */ |
|
| 1048 |
+ private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList, int parentLoopCount, Boolean isJsonNotEmpty, Boolean isJsonNameAllSame) {
|
|
| 1049 |
+ |
|
| 1050 |
+ |
|
| 1051 |
+ // 시작 시간 측정 |
|
| 1052 |
+ long totalStartTime = System.currentTimeMillis(); |
|
| 1053 |
+ |
|
| 1054 |
+ int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 |
|
| 1055 |
+ // Batch 크기 설정 (고정값) |
|
| 1056 |
+// int batchSize = 10000; 465 |
|
| 1057 |
+ int batchSize = 50000; // 9분 18초 |
|
| 1058 |
+ |
|
| 1059 |
+ log.info("총 데이터 개수 :: [{}] ", totalSize);
|
|
| 1060 |
+ log.info("설정된 Batch 크기 :: [{}] ", batchSize);
|
|
| 1061 |
+ |
|
| 1062 |
+ // 총 insert 카운트 |
|
| 1063 |
+ int instCnt = 0; |
|
| 1064 |
+ int batchCount = 0; |
|
| 1065 |
+ |
|
| 1066 |
+ // 각 배치별 실행 시간 기록 |
|
| 1067 |
+ List<Double> batchExecutionTimes = new ArrayList<>(); |
|
| 1068 |
+ |
|
| 1069 |
+ |
|
| 1070 |
+ // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 |
|
| 1071 |
+ boolean isJsonInserted = false; |
|
| 1072 |
+ for (int i = 0; i < totalSize; i += batchSize) {
|
|
| 1073 |
+ // Batch 시작 시간 측정 |
|
| 1074 |
+ long batchStartTime = System.currentTimeMillis(); |
|
| 1075 |
+ |
|
| 1076 |
+ // Batch 리스트 생성 |
|
| 1077 |
+ List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); |
|
| 1078 |
+ System.out.println("Batch 시작 인덱스: " + i);
|
|
| 1079 |
+ |
|
| 1080 |
+ // mj_msg_data 테이블 insert |
|
| 1081 |
+ int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); |
|
| 1082 |
+ if (isJsonNotEmpty) {
|
|
| 1083 |
+ if (!isJsonNameAllSame) {
|
|
| 1084 |
+ // BizJsonName이 동일하지 않으면 매번 삽입 |
|
| 1085 |
+ kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(batchList); |
|
| 1086 |
+ } else if (parentLoopCount==0) {
|
|
| 1087 |
+ // BizJsonName이 동일하면 첫 번째 배치에서만 삽입 |
|
| 1088 |
+ kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(batchList); |
|
| 1089 |
+ isJsonInserted = true; // 삽입 완료 플래그 설정 |
|
| 1090 |
+ } |
|
| 1091 |
+ } |
|
| 1092 |
+ instCnt += insertedCount; |
|
| 1093 |
+ |
|
| 1094 |
+ // Batch 종료 시간 측정 및 실행 시간 계산 |
|
| 1095 |
+ long batchEndTime = System.currentTimeMillis(); |
|
| 1096 |
+ double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; |
|
| 1097 |
+ |
|
| 1098 |
+ // 실행 시간 기록 |
|
| 1099 |
+ batchExecutionTimes.add(batchExecutionTimeInSeconds); |
|
| 1100 |
+ batchCount++; |
|
| 1101 |
+ } |
|
| 1102 |
+ |
|
| 1103 |
+ // 종료 시간 측정 |
|
| 1104 |
+ long totalEndTime = System.currentTimeMillis(); |
|
| 1105 |
+ |
|
| 1106 |
+ // 총 실행 시간 계산 (밀리초 -> 초로 변환) |
|
| 1107 |
+ double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; |
|
| 1108 |
+ |
|
| 1109 |
+ // 실행 시간 출력 |
|
| 1110 |
+ log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
|
|
| 1111 |
+ log.info("batchSize :: [{}] ", batchSize);
|
|
| 1112 |
+ log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
|
|
| 1113 |
+ log.info("총 삽입 건수 :: [{}] ", instCnt);
|
|
| 1114 |
+ |
|
| 1115 |
+ // 각 배치별 실행 시간 출력 |
|
| 1116 |
+ for (int k = 0; k < batchExecutionTimes.size(); k++) {
|
|
| 1117 |
+ System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
|
|
| 1118 |
+ } |
|
| 1119 |
+ |
|
| 1120 |
+ return instCnt; |
|
| 1121 |
+ |
|
| 1122 |
+ } |
|
| 1123 |
+ |
|
| 959 | 1124 |
// 보유 금액이 충분한지 확인하는 메서드 |
| 960 | 1125 |
private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
|
| 961 | 1126 |
|
... | ... | @@ -969,7 +1134,7 @@ |
| 969 | 1134 |
|
| 970 | 1135 |
// 총 메시지 금액 계산 (HALF_EVEN 적용) |
| 971 | 1136 |
BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() |
| 972 |
- .map(msg -> new BigDecimal(String.valueOf(msg.getKakaoAtPrice()))) // 변환 오류 방지 |
|
| 1137 |
+ .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 |
|
| 973 | 1138 |
.reduce(BigDecimal.ZERO, BigDecimal::add) |
| 974 | 1139 |
.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 |
| 975 | 1140 |
|
--- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
... | ... | @@ -563,7 +563,7 @@ |
| 563 | 563 |
mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정 |
| 564 | 564 |
|
| 565 | 565 |
// 스미싱 알림 처리 |
| 566 |
- return handleSmishingAlert(mjonMsgVO); // 알림 처리 결과 반환 |
|
| 566 |
+ return handleSmishingAlert(); // 알림 처리 결과 반환 |
|
| 567 | 567 |
} |
| 568 | 568 |
|
| 569 | 569 |
return false; // 알림 처리되지 않음 |
... | ... | @@ -579,18 +579,28 @@ |
| 579 | 579 |
} |
| 580 | 580 |
|
| 581 | 581 |
// 스미싱 알림 처리 |
| 582 |
- public boolean handleSmishingAlert(MjonMsgVO mjonMsgVO) throws Exception {
|
|
| 582 |
+ public boolean handleSmishingAlert() throws Exception {
|
|
| 583 |
+ /** |
|
| 584 |
+ * MJ_MBER_SETTING => 기본 시스템 알림 여부 |
|
| 585 |
+ * 슬랙 Y |
|
| 586 |
+ * 야간스미싱알림 Y |
|
| 587 |
+ * 등등 |
|
| 588 |
+ * |
|
| 589 |
+ */ |
|
| 583 | 590 |
JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); |
| 584 | 591 |
|
| 592 |
+/** @시스템 설정에 야간스미싱 알림 || 슬랙알림이 N이면 false*/ |
|
| 585 | 593 |
if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) || |
| 586 | 594 |
!"Y".equals(joinSettingVO.getSlackNoti())) {
|
| 587 | 595 |
return false; // 알림 조건 미충족 |
| 588 | 596 |
} |
| 589 | 597 |
|
| 590 |
- // 알림 조건 충족 시 추가 작업 |
|
| 598 |
+/** @MJ_SPAMPASS_ALARM : 현재 활성화된 알림 SELECT */ |
|
| 591 | 599 |
List<MsgAlarmSetVO> alarmList = getAlarmSettings(); |
| 600 |
+/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */ |
|
| 592 | 601 |
List<MsgHolidayVO> holidayList = getHolidayList(); |
| 593 |
- boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus(alarmList, holidayList); |
|
| 602 |
+/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */ |
|
| 603 |
+ boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus_advc(alarmList, holidayList); |
|
| 594 | 604 |
|
| 595 | 605 |
return !isNotificationAllowed; // 알림 발송 조건 미충족 |
| 596 | 606 |
} |
--- src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java
... | ... | @@ -231,4 +231,71 @@ |
| 231 | 231 |
return smishingAlarmPassSts; |
| 232 | 232 |
} |
| 233 | 233 |
|
| 234 |
+ /** |
|
| 235 |
+ * @methodName : getHolidaySmishingPassStatus_advc |
|
| 236 |
+ * @author : 이호영 |
|
| 237 |
+ * @date : 2025. 3. 19. |
|
| 238 |
+ * @description : getHolidaySmishingPassStatus 개선 버전 |
|
| 239 |
+ * @return : boolean |
|
| 240 |
+ * @param resultAlarmList |
|
| 241 |
+ * @param resultHolidayList |
|
| 242 |
+ * @return |
|
| 243 |
+ * @throws Exception |
|
| 244 |
+ * |
|
| 245 |
+ */ |
|
| 246 |
+ public boolean getHolidaySmishingPassStatus_advc(List<MsgAlarmSetVO> alarmList, List<MsgHolidayVO> holidayList) throws Exception{
|
|
| 247 |
+ |
|
| 248 |
+ Date now = new Date(); // 현재 시스템 시간 |
|
| 249 |
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 날짜-시간 포맷 (예: 2025-03-18 14:30)
|
|
| 250 |
+ |
|
| 251 |
+ // 현재 날짜와 요일 계산 |
|
| 252 |
+ Calendar cal = Calendar.getInstance(); |
|
| 253 |
+ cal.setTime(now); |
|
| 254 |
+ int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1(일요일) ~ 7(토요일) |
|
| 255 |
+ // 오늘 날짜를 "yyyy-MM-dd" 형식으로 포맷팅 (mj_holiday.HOLIDAY_DATE와 비교용) |
|
| 256 |
+ String today = String.format("%d-%02d-%02d",
|
|
| 257 |
+ cal.get(Calendar.YEAR), |
|
| 258 |
+ cal.get(Calendar.MONTH) + 1, // Calendar.MONTH는 0부터 시작하므로 +1 |
|
| 259 |
+ cal.get(Calendar.DATE)); |
|
| 260 |
+ |
|
| 261 |
+ // 공휴일 여부 확인 |
|
| 262 |
+ // mj_holiday 테이블의 HOLIDAY_DATE와 오늘 날짜가 일치하는지 체크 |
|
| 263 |
+ // HOLIDAY_DATE는 'yyyy-MM-dd' 형식으로 저장됨 (예: '2025-01-01') |
|
| 264 |
+ boolean isHoliday = holidayList.stream() |
|
| 265 |
+ .anyMatch(holiday -> today.equals(holiday.getHolidayDate())); |
|
| 266 |
+ |
|
| 267 |
+ // 알람 설정 순회 |
|
| 268 |
+ // alarmList는 MsgAlarmSetVO 객체의 리스트로, 알람 타입과 시작/종료 시간을 포함 |
|
| 269 |
+ for (MsgAlarmSetVO alarm : alarmList) {
|
|
| 270 |
+ String alarmType = alarm.getAlarmType(); // 알람 유형: 'W'(평일), 'E'(주말), 'H'(공휴일) |
|
| 271 |
+ // 오늘 날짜에 알람 시작/종료 시간을 붙여 Date 객체로 변환 |
|
| 272 |
+ Date start = sdf.parse(today + " " + alarm.getAlarmStart()); // 예: "2025-03-18 09:00" |
|
| 273 |
+ Date end = sdf.parse(today + " " + alarm.getAlarmEnd()); // 예: "2025-03-18 18:00" |
|
| 274 |
+ |
|
| 275 |
+ // 현재 시간이 알람 시작~종료 시간 범위 내에 있는지 확인 |
|
| 276 |
+ boolean isWithinTime = now.after(start) && now.before(end); |
|
| 277 |
+ if (!isWithinTime) continue; // 시간 범위 밖이면 다음 알람으로 |
|
| 278 |
+ |
|
| 279 |
+ // 평일 체크 (월~금: dayOfWeek 2~6) |
|
| 280 |
+ // alarmType 'W'는 평일에만 적용 |
|
| 281 |
+ if (dayOfWeek > 1 && dayOfWeek < 7 && alarmType.equals("W")) {
|
|
| 282 |
+ return true; // 평일이고, 시간이 맞고, 타입이 'W'면 스미싱 알람 통과 |
|
| 283 |
+ } |
|
| 284 |
+ // 주말 체크 (일:1, 토:7) |
|
| 285 |
+ // alarmType 'E'는 주말에만 적용 |
|
| 286 |
+ else if ((dayOfWeek == 1 || dayOfWeek == 7) && alarmType.equals("E")) {
|
|
| 287 |
+ return true; // 주말이고, 시간이 맞고, 타입이 'E'면 스미싱 알람 통과 |
|
| 288 |
+ } |
|
| 289 |
+ // 공휴일 체크 |
|
| 290 |
+ // alarmType 'H'는 mj_holiday에 등록된 공휴일에 적용 |
|
| 291 |
+ // HOLIDAY_TYPE(1:법정, 2:임시, 3:기타)과 관계없이 날짜만 확인 |
|
| 292 |
+ else if (isHoliday && alarmType.equals("H")) {
|
|
| 293 |
+ return true; // 공휴일이고, 시간이 맞고, 타입이 'H'면 스미싱 알람 통과 |
|
| 294 |
+ } |
|
| 295 |
+ } |
|
| 296 |
+ |
|
| 297 |
+ // 모든 조건에 부합하지 않으면 false 반환 (스미싱 알람 비활성화) |
|
| 298 |
+ return false; |
|
| 299 |
+ } |
|
| 300 |
+ |
|
| 234 | 301 |
} |
--- src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
+++ src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
... | ... | @@ -4061,7 +4061,7 @@ |
| 4061 | 4061 |
|
| 4062 | 4062 |
System.out.println("================================");
|
| 4063 | 4063 |
// 스팸 및 스미싱 의심이면 slack 알림 |
| 4064 |
- boolean isHolidayNotified = mjonCommon.handleSmishingAlert(mjonMsgVO); |
|
| 4064 |
+ boolean isHolidayNotified = mjonCommon.handleSmishingAlert(); |
|
| 4065 | 4065 |
|
| 4066 | 4066 |
|
| 4067 | 4067 |
// 스팸관련 키워드 select |
... | ... | @@ -4138,7 +4138,6 @@ |
| 4138 | 4138 |
int instTotalCnt = 0; |
| 4139 | 4139 |
// Step 2: 그룹화 된 데이터를 그룹별로 insert 처리 |
| 4140 | 4140 |
for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) {
|
| 4141 |
- String price = entry.getKey(); // 가격 (String) |
|
| 4142 | 4141 |
List<MjonMsgSendVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 |
| 4143 | 4142 |
|
| 4144 | 4143 |
// msgGroupId 생성 |
... | ... | @@ -4173,7 +4172,7 @@ |
| 4173 | 4172 |
// 수신거부 목록 업데이트 |
| 4174 | 4173 |
// returnMap.put("resultSts", instCnt);
|
| 4175 | 4174 |
|
| 4176 |
- log.debug("가격 [{}]의 총 갯수: [{}]", price, groupedMsgList.size());
|
|
| 4175 |
+ log.debug("가격 [{}]의 총 갯수: [{}]", entry.getKey(), groupedMsgList.size());
|
|
| 4177 | 4176 |
|
| 4178 | 4177 |
} |
| 4179 | 4178 |
|
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
... | ... | @@ -4,9 +4,10 @@ |
| 4 | 4 |
========= ======= ================================================= |
| 5 | 5 |
2023.02.02 우영두 |
| 6 | 6 |
--> |
| 7 |
-<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> |
|
| 7 |
+<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> |
|
| 8 | 8 |
<sqlMap namespace="kakaoAlimTalk"> |
| 9 | 9 |
<typeAlias alias="kakaoVO" type="itn.let.kakao.kakaoComm.KakaoVO"/> |
| 10 |
+ <typeAlias alias="kakaoSendAdvcVO" type="itn.let.kakao.kakaoComm.KakaoSendAdvcVO"/> |
|
| 10 | 11 |
|
| 11 | 12 |
<insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo" parameterClass="java.util.List"> |
| 12 | 13 |
INSERT INTO MJ_MSG_DATA |
... | ... | @@ -54,6 +55,71 @@ |
| 54 | 55 |
</iterate> |
| 55 | 56 |
</insert> |
| 56 | 57 |
|
| 58 |
+ <insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc" parameterClass="java.util.List"> |
|
| 59 |
+ INSERT INTO MJ_MSG_DATA |
|
| 60 |
+ ( |
|
| 61 |
+ MSG_ID |
|
| 62 |
+ , MSG_GROUP_ID |
|
| 63 |
+ , USER_ID |
|
| 64 |
+ , AGENT_CODE |
|
| 65 |
+ , CUR_STATE |
|
| 66 |
+ |
|
| 67 |
+ , MSG_NOTICETALK_SENDER_KEY |
|
| 68 |
+ , MSG_NOTICETALK_TMP_KEY |
|
| 69 |
+ , CALL_TO |
|
| 70 |
+ , CALL_FROM |
|
| 71 |
+ , MSG_TYPE |
|
| 72 |
+ |
|
| 73 |
+ , SMS_TXT |
|
| 74 |
+ , BIZ_KAKAO_TITLE |
|
| 75 |
+ |
|
| 76 |
+ , BIZ_KAKAO_RESEND_YN |
|
| 77 |
+ , BIZ_KAKAO_RESEND_DATA |
|
| 78 |
+ , BIZ_KAKAO_RESEND_TYPE |
|
| 79 |
+ , BIZ_KAKAO_JSON_FILE |
|
| 80 |
+ , REQ_DATE |
|
| 81 |
+ )VALUES |
|
| 82 |
+ <iterate conjunction=","> |
|
| 83 |
+ ( |
|
| 84 |
+ #[].msgId# |
|
| 85 |
+ , #[].msgGroupId# |
|
| 86 |
+ , #[].userId# |
|
| 87 |
+ , #[].agentCode# |
|
| 88 |
+ , 0 |
|
| 89 |
+ |
|
| 90 |
+ , #[].senderKey# |
|
| 91 |
+ , #[].templateCode# |
|
| 92 |
+ , #[].callTo# |
|
| 93 |
+ , #[].callFrom# |
|
| 94 |
+ , #[].msgType# |
|
| 95 |
+ |
|
| 96 |
+ , #[].templateContent# |
|
| 97 |
+ , #[].templateTitle# |
|
| 98 |
+ |
|
| 99 |
+ , #[].subMsgSendYn# |
|
| 100 |
+ , #[].subMsgTxt# |
|
| 101 |
+ , #[].subMsgType# |
|
| 102 |
+ , #[].bizJsonName# |
|
| 103 |
+ , #[].reqDate# |
|
| 104 |
+ ) |
|
| 105 |
+ </iterate> |
|
| 106 |
+ </insert> |
|
| 107 |
+ <insert id="kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc" parameterClass="java.util.List"> |
|
| 108 |
+ INSERT INTO BIZ_ATTACHMENTS |
|
| 109 |
+ ( |
|
| 110 |
+ MSG_KEY |
|
| 111 |
+ , TYPE |
|
| 112 |
+ , CONTENTS |
|
| 113 |
+ )VALUES |
|
| 114 |
+ <iterate conjunction=","> |
|
| 115 |
+ ( |
|
| 116 |
+ #[].msgId# |
|
| 117 |
+ , 'JSON' |
|
| 118 |
+ , #[].jsonStr# |
|
| 119 |
+ ) |
|
| 120 |
+ </iterate> |
|
| 121 |
+ </insert> |
|
| 122 |
+ |
|
| 57 | 123 |
<insert id="kakaoAlimTalkDAO.insertKakaoSendPrice" parameterClass="kakaoVO"> |
| 58 | 124 |
INSERT INTO BIZ_KAKAO_PRICE |
| 59 | 125 |
( |
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
... | ... | @@ -1315,6 +1315,7 @@ |
| 1315 | 1315 |
ADMIN_SMS_NOTICE_YN AS adminSmsNoticeYn |
| 1316 | 1316 |
,PRE_PAYMENT_YN AS prePaymentYn |
| 1317 | 1317 |
,SMISHING_YN AS smishingYn |
| 1318 |
+ ,AT_SMISHING_YN AS atSmishingYn |
|
| 1318 | 1319 |
,AUTO_CASH AS autoCash |
| 1319 | 1320 |
,IFNULL(BLINE_CODE, 'N') AS blineCode |
| 1320 | 1321 |
,IFNULL(RECOMMEND_ID, '') AS recommendId |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?