diff --git a/pom.xml b/pom.xml index 5878c03c..7a7f5633 100644 --- a/pom.xml +++ b/pom.xml @@ -144,11 +144,12 @@ 1.1.2 - - cglib - cglib - 3.1 - + + + cglib + cglib + 3.3.0 + org.antlr diff --git a/src/main/java/itn/com/cmm/util/DateUtils.java b/src/main/java/itn/com/cmm/util/DateUtils.java index 8fad5f13..98def430 100644 --- a/src/main/java/itn/com/cmm/util/DateUtils.java +++ b/src/main/java/itn/com/cmm/util/DateUtils.java @@ -3,6 +3,7 @@ package itn.com.cmm.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; @@ -185,4 +186,20 @@ public final class DateUtils { return isValid; } + + public static String setStrToDataFormatter(String str, String formatter) { + + // 입력 문자열을 LocalDateTime으로 변환 + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime dateTime = LocalDateTime.parse(str, inputFormatter); + + // 원하는 출력 포맷 적용 + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(formatter); + String formattedDate = dateTime.format(outputFormatter); + + return formattedDate; + } + + + } diff --git a/src/main/java/itn/com/cmm/util/FileUtil.java b/src/main/java/itn/com/cmm/util/FileUtil.java index 34a52cc1..319c8698 100644 --- a/src/main/java/itn/com/cmm/util/FileUtil.java +++ b/src/main/java/itn/com/cmm/util/FileUtil.java @@ -25,45 +25,44 @@ import org.apache.commons.lang3.StringUtils; */ public final class FileUtil { - /** - * @methodName : downLoad - * @author : 이호영 - * @date : 2023.04.06 - * @description : 파일 다운로드 - * @param response - * @param fileInfo - * @param fileName - * @throws Exception - */ - public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception { - - - try { - String path = fileInfo; // 경로에 접근할 때 역슬래시('\') 사용 - - File file = new File(path); - - String fileName = ""; - if(StringUtils.isNotEmpty(fileNameP)) - fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20"); - else - fileName = file.getName(); - - response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더 - - FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기 - OutputStream out = response.getOutputStream(); - - int read = 0; - byte[] buffer = new byte[1024]; - while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음 - out.write(buffer, 0, read); - } - - } catch (Exception e) { - throw new Exception("download error"); - } + /** + * @methodName : downLoad + * @author : 이호영 + * @date : 2023.04.06 + * @description : 파일 다운로드 + * @param response + * @param fileInfo + * @param fileName + * @throws Exception + */ + public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception { + + + try { + String path = fileInfo; // 경로에 접근할 때 역슬래시('\') 사용 + + File file = new File(path); + + String fileName = ""; + if(StringUtils.isNotEmpty(fileNameP)) + fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20"); + else + fileName = file.getName(); + + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더 + + FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기 + OutputStream out = response.getOutputStream(); + + int read = 0; + byte[] buffer = new byte[1024]; + while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음 + out.write(buffer, 0, read); + } + } catch (Exception e) { + throw new Exception("download error"); + } } - - + + } diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index 0fdc18b9..339137e9 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -23,6 +23,7 @@ import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.OptimalMsgResultDTO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.event.service.MjonEventVO; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; @@ -55,26 +56,6 @@ public final class MsgSendUtils { // 이벤트 최저 잔액 public static final double MIN_EVENT_REMAIN_CASH = 7.5; // 이벤트 최소 잔액 - /** - * @methodName : getSmsTxtBytes - * @author : 이호영 - * @date : 2024.09.23 - * @description : sms 텍스트 바이트 계산 후 return; - * @param smsTxt - * @return - * @throws UnsupportedEncodingException - */ - public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException { //문자열 길이 체크 해주기 - int smsBytes = 0; - //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 - String charset = "euc-kr"; - if(StringUtils.isNotEmpty(smsTxt)) { - String smsCont = smsTxt.replace("\r\n", "\n"); - smsBytes = smsCont.getBytes(charset).length; - } -// log.info(" + smsBytes :: [{}]", smsBytes); - return smsBytes; - } /** * @methodName : getMsgType @@ -96,7 +77,7 @@ public final class MsgSendUtils { // msgType = "4"; // } - int smsTxtByte = getSmsTxtBytes(p_smsTxt); + int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt); String msgType = SHORT_MSG_TYPE; // 1. 2000 Byte 초과는 에러 처리 @@ -276,7 +257,6 @@ public final class MsgSendUtils { for (Map.Entry> entry : placeholders.entrySet()) { String placeholder = entry.getKey(); String value = entry.getValue().apply(sendVO); - System.out.println(""); // log.info(" + smsTxtTemp [{}]", smsTxtTemp); // log.info(" + placeholder [{}]", placeholder); // log.info(" + value [{}]", value); @@ -649,7 +629,7 @@ public final class MsgSendUtils { // 각 가격을 합산 totalPrice += Float.parseFloat(eachPrice); } - + mjonMsgVO.setTotalPrice(totalPrice); } diff --git a/src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java b/src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java new file mode 100644 index 00000000..399a748b --- /dev/null +++ b/src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java @@ -0,0 +1,145 @@ +package itn.com.cmm.util; + +import org.apache.commons.lang3.StringUtils; + +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; +import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mjo.msg.service.MjonMsgVO; + +public class SlackMessageFormatUtil { + + private static final String PREFIX_SMISHING = "[스미싱의심]"; + private static final String PREFIX_RESERVE = "[예약]"; + private static final String PREFIX_IMAGE = "그림문자 "; + + /** + * 일반 SMS 메시지 텍스트 포맷팅 + */ + public static String formatSmsText(MjonMsgVO mjonMsgVO) { + String smsTxt = mjonMsgVO.getSmsTxt(); + String reserveYn = safeGetString(mjonMsgVO.getReserveYn()); + String delayYn = safeGetString(mjonMsgVO.getDelayYn()); + String smishingYn = safeGetString(mjonMsgVO.getSmishingYn()); + + // 공통 텍스트 포맷팅 로직 적용 + smsTxt = formatMessagePrefix(smsTxt, reserveYn, + "Y".equals(smishingYn) || "Y".equals(delayYn)); + + // 그림 문자 처리 (SMS 전용 로직) + int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0); + if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isEmpty(smsTxt)) { + smsTxt = "그림문자 " + smsTxt; + } + + return smsTxt; + } + + /** + * 카카오톡 메시지 텍스트 포맷팅 + */ + public static String formatKakaoText(KakaoSendAdvcVO sendVO) { + String smsTxt = sendVO.getTemplateContent(); + String reserveYn = safeGetString(sendVO.getReserveYn()); + String atDelayYn = safeGetString(sendVO.getAtDelayYn()); + + // 공통 텍스트 포맷팅 로직 적용 + return formatMessagePrefix(smsTxt, reserveYn, "Y".equals(atDelayYn)); + } + + + public static String formatSandName(MjonMsgVO mjonMsgVO) { + String userId = mjonMsgVO.getUserId(); + String callFrom = mjonMsgVO.getCallFrom(); + String msgType = getMessageTypeLabel(mjonMsgVO.getMsgType(), mjonMsgVO.getFileCnt()); + return String.format("[%s][%s]%s", userId, callFrom, msgType); + } + + /** + * 메시지 접두사 포맷팅 공통 로직 (예약 및 스미싱 의심 접두사 처리) + * + * @param messageText 원본 메시지 텍스트 + * @param reserveYn 예약 여부 + * @param isSmishing 스미싱 의심 여부 + * @return 포맷팅된 메시지 텍스트 + */ + public static String formatMessagePrefix(String messageText, String reserveYn, boolean isSmishing) { + if ("Y".equals(reserveYn)) { + return isSmishing ? PREFIX_SMISHING + PREFIX_RESERVE + messageText : PREFIX_RESERVE + messageText; + } else if (isSmishing) { + return PREFIX_SMISHING + messageText; + } + return messageText; + } + + /** + * @카카오톡용 sandName 포맷팅 메서드 + */ + public static String formatKakaoSandName(KakaoSendAdvcVO sendVO) { + String userId = sendVO.getUserId(); + String callFrom = sendVO.getCallFrom(); + String msgType = getKakaoMessageTypeLabel(sendVO.getMsgType()); + return String.format("[%s][%s]%s", userId, callFrom, msgType); + } + + /** + * 메시지 타입 레이블 반환 (SMS 전용) + * + * @param msgType 메시지 타입 + * @param fileCnt 파일 개수 + * @return 메시지 타입 레이블 + */ + public static String getMessageTypeLabel(String msgType, String fileCnt) { + int fileCount = parseIntOrDefault(fileCnt, 0); + + switch (msgType) { + case "4": + return "[단문]"; + case "6": + return fileCount == 0 ? "[장문]" : "[그림]"; + default: + return ""; + } + } + + /** + * 카카오톡 메시지 타입 레이블 반환 + * + * @param msgType 메시지 타입 + * @return 메시지 타입 레이블 + */ + public static String getKakaoMessageTypeLabel(String msgType) { + switch (msgType) { + case "8": + return "[알림톡]"; + case "9": + return "[친구톡]"; + default: + return ""; + } + } + + /** + * 정수로 변환, 변환 실패 시 기본값 반환 + * + * @param value 변환할 문자열 + * @param defaultValue 기본값 + * @return 변환된 정수 또는 기본값 + */ + public static int parseIntOrDefault(String value, int defaultValue) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + * 안전하게 문자열 가져오기 (null 체크) + * + * @param value 원본 문자열 + * @return 원본 문자열 또는 빈 문자열 + */ + public static String safeGetString(String value) { + return value == null ? "" : value; + } +} diff --git a/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java b/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java index 3e7120d3..f565be7b 100644 --- a/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java +++ b/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java @@ -35,5 +35,6 @@ public class MainPopupLinkVO extends ComDefaultVO implements Serializable { private String popId; // 메인존ID private String mlink; // 링크 private String coords; // 링크좌표 + private String popLinkId; // 링크좌표 } diff --git a/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java b/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java index 3b3990e7..84dc744d 100644 --- a/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java +++ b/src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java @@ -1,13 +1,8 @@ package itn.com.uss.ion.bnr.pop.service; import java.util.List; -import java.util.Map; -import itn.com.uss.ion.pwm.service.MainzoneVO; -import itn.com.uss.ion.pwm.service.PopupManageVO; -import itn.com.uss.ion.pwm.service.PopupzoneVO; -import itn.com.uss.ion.pwm.service.SocialVO; -import itn.com.uss.ion.pwm.service.SortVO; +import itn.com.cmm.RestResponse; /** * 개요 @@ -34,4 +29,6 @@ public interface MainPopupManageService { public void resetMainPopupSort(MainPopupVO mainPopupVO); + public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO); + } \ No newline at end of file diff --git a/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java b/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java index 2faa0728..18e05d83 100644 --- a/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java +++ b/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java @@ -4,6 +4,7 @@ import java.util.List; import org.springframework.stereotype.Repository; import itn.com.cmm.service.impl.EgovComAbstractDAO; +import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO; import itn.com.uss.ion.bnr.pop.service.MainPopupVO; /** @@ -46,8 +47,8 @@ public class MainPopupManageDAO extends EgovComAbstractDAO { } - public void deleteMainPopup(String mazId) { - delete("mainPopup.deleteMainPopup", mazId); + public void deleteMainPopup(String popId) { + delete("mainPopup.deleteMainPopup", popId); } @@ -55,4 +56,7 @@ public class MainPopupManageDAO extends EgovComAbstractDAO { update("mainPopup.resetMainPopupSort", mainPopupVO); } + public void deleteMainPopupLinkInfo(MainPopupLinkVO mainPopupLinkVO) { + delete("mainPopup.deleteMainPopupLinkInfo", mainPopupLinkVO); + } } \ No newline at end of file diff --git a/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java b/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java index 159d5a34..8e0a49ab 100644 --- a/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java +++ b/src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java @@ -4,12 +4,16 @@ import java.util.List; import javax.annotation.Resource; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.com.cmm.RestResponse; +import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO; import itn.com.uss.ion.bnr.pop.service.MainPopupManageService; import itn.com.uss.ion.bnr.pop.service.MainPopupVO; +import itn.com.uss.ion.pwm.service.impl.PopupManageDAO; /** * 개요 @@ -29,7 +33,9 @@ public class MainPopupManageServiceImpl extends EgovAbstractServiceImpl implemen @Resource(name = "mainPopupManageDAO") public MainPopupManageDAO dao; - + @Resource(name = "popupManageDAO") + public PopupManageDAO popupDao; + @Resource(name = "egovPopupManageIdGnrService") private EgovIdGnrService idgenService; @@ -59,6 +65,7 @@ public class MainPopupManageServiceImpl extends EgovAbstractServiceImpl implemen @Override public void deleteMainPopup(String id) { + popupDao.deleteMainPopupLinkInfo(id); dao.deleteMainPopup(id); } @@ -68,5 +75,15 @@ public class MainPopupManageServiceImpl extends EgovAbstractServiceImpl implemen } + @Override + public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO) { + dao.deleteMainPopupLinkInfo(mainPopupLinkVO); + + return RestResponse.builder() + .status(HttpStatus.OK) // 200, Series.SUCCESSFUL, "OK" + .msg("삭제 되었습니다.") + .build(); + + } } \ No newline at end of file diff --git a/src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java b/src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java index 09ea540c..b774f45d 100644 --- a/src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java +++ b/src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java @@ -12,11 +12,15 @@ import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springmodules.validation.commons.DefaultBeanValidator; @@ -27,15 +31,16 @@ import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.ComDefaultCodeVO; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; +import itn.com.cmm.RestResponse; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.FileVO; import itn.com.cmm.util.RedirectUrlMaker; +import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO; import itn.com.uss.ion.bnr.pop.service.MainPopupManageService; import itn.com.uss.ion.bnr.pop.service.MainPopupVO; import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService; -import itn.com.uss.ion.pwm.service.MainzoneVO; import itn.let.sym.site.service.EgovSiteManagerService; /** @@ -243,11 +248,35 @@ public class MainPopupController { RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do"); return redirectUrlMaker.getRedirectUrl(); } - - - - - + + /** + * @methodName : mainPopupLinkDeleteAjax + * @author : 이호영 + * @date : 2025.03.04 + * @description : 메인팝업링크 데이터 삭제 + * @param request + * @param mainPopupLinkVO + * @return + * @throws Exception + */ + @ResponseBody + @RequestMapping(value="/uss/ion/bnr/pop/mainPopupLinkDeleteAjax.do") + public ResponseEntity mainPopupLinkDeleteAjax( + HttpServletRequest request + ,@RequestBody MainPopupLinkVO mainPopupLinkVO) throws Exception { + + Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated(); + + if(!isAuthenticated) { + return ResponseEntity.ok( + RestResponse.builder() + .status(HttpStatus.UNAUTHORIZED) // 401 권한 인증 에러 + .msg("로그인을 하셔야 이용 가능합니다.") + .build() + ); + } + return ResponseEntity.ok(mainPopupManageService.deleteMainPopupLink(mainPopupLinkVO)); + } diff --git a/src/main/java/itn/let/cmm/vo/FileInfoVO.java b/src/main/java/itn/let/cmm/vo/FileInfoVO.java new file mode 100644 index 00000000..8c1b48c3 --- /dev/null +++ b/src/main/java/itn/let/cmm/vo/FileInfoVO.java @@ -0,0 +1,32 @@ +package itn.let.cmm.vo; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * + * @author : 이호영 + * @fileName : FileInfoVO.java + * @date : 2025.01.17 + * @description : 파일 풀 경로에서 파일명만 가져와 ID 가져올때 사용하는 VO + * MjonMsgDetailSentVO 참고 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2025.01.17 이호영 최초 생성 + * + * + * + */ +@Getter +@Setter +public class FileInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String atchFileId; // 첨부파일 ID + private String fileSn; // 파일 순번 + +} diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java index 0054fb9a..712e0b91 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java @@ -151,6 +151,8 @@ public class MjonKakaoATVO extends ComDefaultVO{ private String bizKakaoResendType; /* 대체 문자 길이 => MMS / LMS / SMS */ private String bizKakaoJsonFile; //카카오 친구톡 Json 파일 경로 + private String yellowId; + private String bizKakaoResendTypeCnt; public String getMsgDiv() { return msgDiv; @@ -1273,5 +1275,19 @@ public class MjonKakaoATVO extends ComDefaultVO{ public void setBizKakaoJsonFile(String bizKakaoJsonFile) { this.bizKakaoJsonFile = bizKakaoJsonFile; } + public String getYellowId() { + return yellowId; + } + public void setYellowId(String yellowId) { + this.yellowId = yellowId; + } + public String getBizKakaoResendTypeCnt() { + return bizKakaoResendTypeCnt; + } + public void setBizKakaoResendTypeCnt(String bizKakaoResendTypeCnt) { + this.bizKakaoResendTypeCnt = bizKakaoResendTypeCnt; + } + + } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java index 516043b6..759f341c 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java @@ -1,5 +1,9 @@ package itn.let.kakao.kakaoComm; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + /** * @FileName : KakaoButtonVO.java * @Project : mjon @@ -8,6 +12,9 @@ package itn.let.kakao.kakaoComm; * @프로그램 설명 : button, quickReplies 변수 */ +@ToString +@Getter +@Setter public class KakaoButtonVO { private String name = ""; // 버튼명 - linkType “AC” 선택 시 버튼명은 “채널추가” 로 고정 @@ -18,48 +25,4 @@ public class KakaoButtonVO { private String linkPc = ""; // PC 웹 링크 주소 (WL 사용시 선택) private String pluginId = ""; // 플러그인 ID (P1, P2, P3 사용시 필수) - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getLinkType() { - return linkType; - } - public void setLinkType(String linkType) { - this.linkType = linkType; - } - public String getLinkAnd() { - return linkAnd; - } - public void setLinkAnd(String linkAnd) { - this.linkAnd = linkAnd; - } - public String getLinkIos() { - return linkIos; - } - public void setLinkIos(String linkIos) { - this.linkIos = linkIos; - } - public String getLinkMo() { - return linkMo; - } - public void setLinkMo(String linkMo) { - this.linkMo = linkMo; - } - public String getLinkPc() { - return linkPc; - } - public void setLinkPc(String linkPc) { - this.linkPc = linkPc; - } - public String getPluginId() { - return pluginId; - } - public void setPluginId(String pluginId) { - this.pluginId = pluginId; - } - - } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java index 94598ed0..2b95d94b 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java @@ -3,6 +3,10 @@ package itn.let.kakao.kakaoComm; import java.util.ArrayList; import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + /** * @FileName : KakaoCommentVO.java * @Project : mjon @@ -11,6 +15,9 @@ import java.util.List; * @프로그램 설명 : comment 변수 */ +@ToString +@Getter +@Setter public class KakaoCommentVO { private String content = ""; // 댓글 본분 @@ -26,60 +33,4 @@ public class KakaoCommentVO { private String originalFileName = ""; private String filePath = ""; - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getOriginalFileName() { - return originalFileName; - } - - public void setOriginalFileName(String originalFileName) { - this.originalFileName = originalFileName; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public List getAttachFileList() { - return attachFileList; - } - - public void setAttachFileList(List attachFileList) { - this.attachFileList = attachFileList; - } } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java index bb259b28..05cba634 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.List; import itn.com.cmm.ComDefaultVO; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; /** * @FileName : KakaoReturnVO.java @@ -13,6 +16,9 @@ import itn.com.cmm.ComDefaultVO; * @프로그램 설명 : 카카오톡 리턴 변수 목록 */ +@Getter +@Setter +@ToString public class KakaoReturnVO extends ComDefaultVO{ private static final long serialVersionUID = 1L; @@ -130,415 +136,4 @@ public class KakaoReturnVO extends ComDefaultVO{ private String businessType = ""; //카카오톡 채널 비즈니스 인증 타입 - public static long getSerialversionuid() { - return serialVersionUID; - } - - public String getBizReturnMsg() { - return bizReturnMsg; - } - - public void setBizReturnMsg(String bizReturnMsg) { - this.bizReturnMsg = bizReturnMsg; - } - - public String getBizReturnCode() { - return bizReturnCode; - } - - public void setBizReturnCode(String bizReturnCode) { - this.bizReturnCode = bizReturnCode; - } - - public String getProfileId() { - return profileId; - } - - public void setProfileId(String profileId) { - this.profileId = profileId; - } - - public String getTotalCount() { - return totalCount; - } - - public void setTotalCount(String totalCount) { - this.totalCount = totalCount; - } - - public String getTotalPage() { - return totalPage; - } - - public void setTotalPage(String totalPage) { - this.totalPage = totalPage; - } - - public String getCurrentPage() { - return currentPage; - } - - public void setCurrentPage(String currentPage) { - this.currentPage = currentPage; - } - - public String getSenderKey() { - return senderKey; - } - - public void setSenderKey(String senderKey) { - this.senderKey = senderKey; - } - - public String getSenderKeyType() { - return senderKeyType; - } - - public void setSenderKeyType(String senderKeyType) { - this.senderKeyType = senderKeyType; - } - - public String getTemplateCode() { - return templateCode; - } - - public void setTemplateCode(String templateCode) { - this.templateCode = templateCode; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getCategoryCode() { - return categoryCode; - } - - public void setCategoryCode(String categoryCode) { - this.categoryCode = categoryCode; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getModifiedAt() { - return modifiedAt; - } - - public void setModifiedAt(String modifiedAt) { - this.modifiedAt = modifiedAt; - } - - public String getServiceStatus() { - return serviceStatus; - } - - public void setServiceStatus(String serviceStatus) { - this.serviceStatus = serviceStatus; - } - - public List getTemplatList() { - return templatList; - } - - public void setTemplatList(List templatList) { - this.templatList = templatList; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public boolean isBlock() { - return block; - } - - public void setBlock(boolean block) { - this.block = block; - } - - public boolean isDormant() { - return dormant; - } - - public void setDormant(boolean dormant) { - this.dormant = dormant; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getImageUrl() { - return imageUrl; - } - - public void setImageUrl(String imageUrl) { - this.imageUrl = imageUrl; - } - - public String getListTitle() { - return listTitle; - } - - public void setListTitle(String listTitle) { - this.listTitle = listTitle; - } - - public String getListDescription() { - return listDescription; - } - - public void setListDescription(String listDescription) { - this.listDescription = listDescription; - } - - public String getSumTitle() { - return sumTitle; - } - - public void setSumTitle(String sumTitle) { - this.sumTitle = sumTitle; - } - - public String getSumDescription() { - return sumDescription; - } - - public void setSumDescription(String sumDescription) { - this.sumDescription = sumDescription; - } - - public String getProfileStatus() { - return profileStatus; - } - - public void setProfileStatus(String profileStatus) { - this.profileStatus = profileStatus; - } - - public boolean isAlimtalk() { - return alimtalk; - } - - public void setAlimtalk(boolean alimtalk) { - this.alimtalk = alimtalk; - } - - public boolean isBizchat() { - return bizchat; - } - - public void setBizchat(boolean bizchat) { - this.bizchat = bizchat; - } - - public boolean isBrandtalk() { - return brandtalk; - } - - public void setBrandtalk(boolean brandtalk) { - this.brandtalk = brandtalk; - } - - public String getCommittalCompanyName() { - return committalCompanyName; - } - - public void setCommittalCompanyName(String committalCompanyName) { - this.committalCompanyName = committalCompanyName; - } - - public String getChannelKey() { - return channelKey; - } - - public void setChannelKey(String channelKey) { - this.channelKey = channelKey; - } - - public boolean isBusinessProfile() { - return businessProfile; - } - - public void setBusinessProfile(boolean businessProfile) { - this.businessProfile = businessProfile; - } - - public String getBusinessType() { - return businessType; - } - - public void setBusinessType(String businessType) { - this.businessType = businessType; - } - - public String getTemplateMessageType() { - return templateMessageType; - } - - public void setTemplateMessageType(String templateMessageType) { - this.templateMessageType = templateMessageType; - } - - public String getTemplateEmphasizeType() { - return templateEmphasizeType; - } - - public void setTemplateEmphasizeType(String templateEmphasizeType) { - this.templateEmphasizeType = templateEmphasizeType; - } - - public String getTemplateContent() { - return templateContent; - } - - public void setTemplateContent(String templateContent) { - this.templateContent = templateContent; - } - - public String getTemplateExtra() { - return templateExtra; - } - - public void setTemplateExtra(String templateExtra) { - this.templateExtra = templateExtra; - } - - public String getTemplateAd() { - return templateAd; - } - - public void setTemplateAd(String templateAd) { - this.templateAd = templateAd; - } - - public String getTemplateImageName() { - return templateImageName; - } - - public void setTemplateImageName(String templateImageName) { - this.templateImageName = templateImageName; - } - - public String getTemplateImageUrl() { - return templateImageUrl; - } - - public void setTemplateImageUrl(String templateImageUrl) { - this.templateImageUrl = templateImageUrl; - } - - public String getTemplateTitle() { - return templateTitle; - } - - public void setTemplateTitle(String templateTitle) { - this.templateTitle = templateTitle; - } - - public String getTemplateSubtitle() { - return templateSubtitle; - } - - public void setTemplateSubtitle(String templateSubtitle) { - this.templateSubtitle = templateSubtitle; - } - - public String getTemplateHeader() { - return templateHeader; - } - - public void setTemplateHeader(String templateHeader) { - this.templateHeader = templateHeader; - } - - public Boolean getSecurityFlag() { - return securityFlag; - } - - public void setSecurityFlag(Boolean securityFlag) { - this.securityFlag = securityFlag; - } - - public String getInspectionStatus() { - return inspectionStatus; - } - - public void setInspectionStatus(String inspectionStatus) { - this.inspectionStatus = inspectionStatus; - } - - public List getButtonList() { - return buttonList; - } - - public void setButtonList(List buttonList) { - this.buttonList = buttonList; - } - - public List getQuickReplyList() { - return quickReplyList; - } - - public void setQuickReplyList(List quickReplyList) { - this.quickReplyList = quickReplyList; - } - - public List getCommentList() { - return commentList; - } - - public void setCommentList(List commentList) { - this.commentList = commentList; - } - - public List getItemList() { - return itemList; - } - - public void setItemList(List itemList) { - this.itemList = itemList; - } } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java new file mode 100644 index 00000000..480cf85a --- /dev/null +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java @@ -0,0 +1,116 @@ +package itn.let.kakao.kakaoComm; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +/** +* @FileName : KakaoSendVO.java +* @Project : mjon +* @Date : 2025. 3. 25. +* @작성자 : 이호영 + +* @프로그램 설명 : 문자온 발송부분만 ADVC +*/ +@Getter +@Setter +public class KakaoSendAdvcVO implements Serializable { + + + /** + * + */ + private static final long serialVersionUID = 343099046833205405L; + + // ===== + // Insert 데이터 + private String msgId; // 문자ID + private String msgGroupId; // 전송그룹ID + private String msgGroupCnt; // 전송그룹ID + private String userId; // 사용자ID + private String agentCode; // 전송사코드 + private String senderKey; // 발신프로필 키 + private String templateCode; // 템플릿 코드 + private String callTo; // 수신번호 + private String callFrom; // 발신번호 + private String msgType; // 메시지 타입 + private String templateContent; // 템플릿 내용 + private String templateTitle; // 템플릿 제목 + List buttonList; // 템플릿 버튼 리스트 + private String subMsgSendYn; // 대체문자 전송 여부 + private String subMsgTxt; // 대체문자 내용 + private String subMsgType; // 대체문자 타입 + private String reqDate; // 예약일시 + + private String jsonStr; // jsonStr + + // ===== + // ===== + + private String eachPrice; // sms 단가 + private String smsPrice; // sms 단가 + private String mmsPrice; // mms 단가 + private String totPrice; // mms 단가 + private String befCash; // mms 단가 + private String befPoint; // mms 단가 + private String kakaoAtPrice; // 카카오 알림톡 단가 + private String bizJsonName; // 카카오 알림톡 단가 + private String reserveYn; // 카카오 알림톡 단가 + private String atDelayYn; // 카카오 알림톡 단가 + private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가 + private String bizKakaoResendType; // 카카오 알림톡 단가 + + + + + + + @Override + public String toString() { + return "MsgSendVO[" + + "\n msgId=[" + msgId + "]" + + "\n , msgGroupId=[" + msgGroupId + "]" + + "\n , msgGroupCnt=[" + msgGroupCnt + "]" + + "\n , userId=[" + userId + "]" + + "\n , agentCode=[" + agentCode + "]" + + "\n , senderKey=[" + senderKey + "]" + + "\n , templateCode=[" + templateCode + "]" + + "\n , callTo=[" + callTo + "]" + + "\n , callFrom=[" + callFrom + "]" + + "\n , msgType=[" + msgType + "]" + + "\n , templateContent=[" + templateContent + "]" + + "\n , templateTitle=[" + templateTitle + "]" + + "\n , buttonList=[" + buttonList.toString() + "]" + + "\n , subMsgSendYn=[" + subMsgSendYn + "]" + + "\n , subMsgTxt=[" + subMsgTxt + "]" + + "\n , subMsgType=[" + subMsgType + "]" + + "\n , reqDate=[" + reqDate + "]" + + "\n , jsonStr=[" + jsonStr + "]" + + "\n , ==== MJ_MSG_DATA INSERT DATA END =======" + + "\n " + + "\n , eachPrice=[" + eachPrice + "]" + + "\n , smsPrice=[" + smsPrice + "]" + + "\n , mmsPrice=[" + mmsPrice + "]" + + "\n , totPrice=[" + totPrice + "]" + + "\n , befCash=[" + befCash + "]" + + "\n , befPoint=[" + befPoint + "]" + + "\n , kakaoAtPrice=[" + kakaoAtPrice + "]" + + "\n , bizJsonName=[" + bizJsonName + "]" + + "\n , reserveYn=[" + reserveYn + "]" + + "\n , atDelayYn=[" + atDelayYn + "]" + + "\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" + + "\n , bizKakaoResendType=[" + bizKakaoResendType + "]" + + "\n ]"; + } + + + + + + + + +} diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java index d96b4fb8..ec298ecc 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java @@ -1,21 +1,38 @@ package itn.let.kakao.kakaoComm; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; +import egovframework.rte.fdl.idgnr.EgovIdGnrService; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; +import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; +import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Component public class KakaoSendUtil { @@ -25,6 +42,374 @@ public class KakaoSendUtil { @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; + @Autowired + KakaoApiTemplate kakaoApiTemplate; + + @Autowired + private PriceAndPoint priceAndPoint; + + @Autowired + private MjonCommon mjonCommon; + + // 클래스 수준에서 정적 Pattern 정의 (성능 최적화) + private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}"); + + private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + + // 단문 메세지 타입 + public static final String SHORT_MSG_TYPE = "SMS"; + // 장문 메세지 타입 + public static final String LONG_MSG_TYPE = "MMS"; + + /** + * @methodName : populateSendLists _advc + * @author : 이호영 + * @date : 2025. 3. 7. + * @description : 기존 kakaoSendPrice 개선 + * @return : KakaoVO + * @param kakaoVO + * @param statusResponse + * @return + * @throws Exception + * + */ + public List populateSendLists(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception { + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) +// String befCash = kakaoVO.getBefCash(); + + + + + log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size()); + + List kakaoSendAdvcListVO = new ArrayList<>(); + Calendar calendar = setupBaseDate(kakaoVO, isNotified); + + + + KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿 + kakaoVO.setTemplateContent(templateContent); + String templateTitle = templateDetail.getTemplateTitle(); + + +// log.info(" + templateDetail :: [{}]", templateDetail); +// templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString())); + + Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent); + Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle); + Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList()); + + /** @jsonStr 필요유무 */ + boolean hasTitleOrButtons = StringUtils.isNotEmpty(templateTitle) + || CollectionUtils.isNotEmpty(templateDetail.getButtonList()); + + /** @jsonStr 반복유무 */ + boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement; + String sharedJsonStr = null; + + String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자 + + // 시스템 기본 단가 정보 불러오기 + JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo(); + // 사용자 개인 단가 정보 불러오기 + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId()); + + + + + /** @MSGID KEY값 */ + List idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size()); +// for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) { +// kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i)); +// kakaoSendAdvcListVO.get(i).setBizJsonName(idList.get(i)); +// } + + + + // 분할 건수 카운터 + int counter = 0; +/** @Map에 총 갯수가 수신자 갯수와 동일함 */ + List> varList = kakaoVO.getVarListMap(); + for (int i = 0; i < varList.size(); i++) { +// for(Map variables : kakaoVO.getVarListMap()) { + // 치환 데이터 + Map variables = varList.get(i); + +/** @공통 기본값 */ + KakaoSendAdvcVO sendVO = createSendVO(kakaoVO); + String msgId = idList.get(i); + sendVO.setMsgId(msgId); + + // step1 + // Step 1-1: 값 치환 및 수신번호 셋팅 + // Step 1-2: 수신자 정보 설정 (callToList는 항상 설정). + if (variables.containsKey("callToList")) { + sendVO.setCallTo(variables.get("callToList")); + variables.remove("callToList"); // 사용 후 제거. + } + +/** @Step1-3: 템플릿 치환데이터 설정 */ + if (hasContentReplacement) { + templateContent = mjonCommon.ATReplaceTemplateVariables(templateContent, variables); + if(hasTitleReplacement) { + templateTitle = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables); + } + } +/** @버튼 치환 */ // 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정 + List buttonList = templateDetail.getButtonList(); + if(hasButtonReplacement) { + buttonList = replaceButtonLinks(buttonList, variables); + } + sendVO.setButtonList(buttonList); + + sendVO.setTemplateTitle(templateTitle); + sendVO.setTemplateContent(templateContent); + + + // Step 1-4: 실패 대체 문자 치환데이터 설정 + if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나? + if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나? + subMsgTxt = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables); + } + sendVO.setSubMsgTxt(subMsgTxt);// 실패 + } + sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); + + + /* + log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n", + kakaoSendAdvcVO.getCallTo(), + kakaoSendAdvcVO.getTemplateContent(), + kakaoSendAdvcVO.getSubMsgTxt() + ); + */ + + // Step1 END + + +// step3 +// 바이트 수 체크 및 금액설정 + + + Float kakaoAtPrice = mberManageVO.getKakaoAtPrice(); + // 유효한 단가 계산 + float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice()); + float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice()); + + + String shortPStr = Float.toString(shortPrice); + String mmsPStr = Float.toString(longPrice); + + // 공통 가격 설정 + sendVO.setSmsPrice(shortPStr); + sendVO.setMmsPrice(mmsPStr); + + + if("Y".equals(kakaoVO.getSubMsgSendYn())) { + int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt()); + String sendType = getMsgType(smsTxtByte); + sendVO.setSubMsgType(sendType); + + if ("INVALID".equals(sendType)) { + statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO; + } + + boolean isMms = "MMS".equals(sendType); + sendVO.setEachPrice(isMms ? mmsPStr : shortPStr); + + + } else { + kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()); + sendVO.setEachPrice( Float.toString(kakaoAtPrice) ); + } + + + + // step4 + // 예약 시간 설정 및 분할 데이터 설정 + if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn()) + && "Y".equalsIgnoreCase(kakaoVO.getDivideChk()) + && counter == Integer.parseInt(kakaoVO.getDivideCnt())) + { + counter = 0; + calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime())); + } + counter++; + // 즉시 발송인경우 현재 시간 + // 예약인 경우 위에 설정한 시간 입력 + sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); + + + +/** @step5 전송 메세지 설정 json파일 만들기*/ + // 타이틀과 버튼이 있고 + if(hasTitleOrButtons) { + // 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성 + if(needsJsonReplacement) { + sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); + sendVO.setBizJsonName(msgId); + sendVO.setJsonStr(sharedJsonStr); + } else if (StringUtils.isEmpty(sharedJsonStr)) { + // 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성 + sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail); + sendVO.setBizJsonName(idList.get(0)); + sendVO.setJsonStr(sharedJsonStr); + }else { + sendVO.setBizJsonName(idList.get(0)); + } + + } + kakaoSendAdvcListVO.add(sendVO); + } + + + return kakaoSendAdvcListVO; + } + + private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException { + // 예약 시간 기본값 설정 + Date now = new Date(); + // ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정 + // 화면에서 예약문자면 예약시간을 regDate로 설정한다. + Date baseDate; + if (StringUtils.isEmpty(kakaoVO.getReqDate())) { + kakaoVO.setReqDate(DATE_FORMATTER.format(now)); // ReqDate에 현재 시간 설정 + baseDate = now; + } else { + baseDate = DATE_FORMATTER.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정 + } + + // 시간 성정 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(baseDate); // calendar에 baseDate 설정 + + // 지연 여부 처리 + // 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay + if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn()) + && isNotified) { + calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 + } + return calendar; + } + + /** + * @methodName : createSendVO + * @author : 이호영 + * @date : 2025. 3. 19. + * @description : populateSendLists 반복에 필요한 공통생성 부분 + * @return : KakaoSendAdvcVO + * @param kakaoVO + * @return + * + */ + private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) { + KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO(); + sendVO.setMsgType("8"); + sendVO.setSenderKey(kakaoVO.getSenderKey()); + sendVO.setTemplateCode(kakaoVO.getTemplateCode()); + sendVO.setUserId(kakaoVO.getUserId()); + sendVO.setCallFrom(kakaoVO.getCallFrom()); + sendVO.setAgentCode("04"); + return sendVO; + } + + private List replaceButtonLinks(List buttonList, + Map variables) { + + if (buttonList != null) { + for (KakaoButtonVO button : buttonList) { + // 각 링크 필드에 대해 치환 수행 + if (button.getLinkAnd() != null) { + button.setLinkAnd(mjonCommon.ATReplaceTemplateVariables(button.getLinkAnd(), variables)); + } + if (button.getLinkIos() != null) { + button.setLinkIos(mjonCommon.ATReplaceTemplateVariables(button.getLinkIos(), variables)); + } + if (button.getLinkMo() != null) { + button.setLinkMo(mjonCommon.ATReplaceTemplateVariables(button.getLinkMo(), variables)); + } + if (button.getLinkPc() != null) { + button.setLinkPc(mjonCommon.ATReplaceTemplateVariables(button.getLinkPc(), variables)); + } + } + // 치환된 버튼 리스트를 sendVO에 반영 +// sendVO.setButtonList(buttonList); // KakaoSendAdvcVO에 setButtonList가 있다고 가정 + } + + return buttonList; + } + + /** + * 버튼 리스트에 치환 패턴(#{...})이 있는지 확인합니다. + * @param buttonList 버튼 리스트 (null 가능) + * @return 치환 패턴이 있으면 true, 없으면 false + */ + private boolean needsButtonReplacement(List buttonList) { + if (buttonList == null) { + return false; + } + return buttonList.stream().anyMatch(button -> + replBooleanStrChecker(button.getLinkAnd()) || + replBooleanStrChecker(button.getLinkIos()) || + replBooleanStrChecker(button.getLinkMo()) || + replBooleanStrChecker(button.getLinkPc()) + ); + } + + /** + * 입력 문자열에 치환 패턴(#{...})이 있는지 확인합니다. + * @param input 확인할 문자열 (null 가능) + * @return 치환 패턴이 있으면 true, 없으면 false + */ + private boolean replBooleanStrChecker(String input) { + // #{...} 패턴을 확인하는 정규 표현식 + if (input == null) { + return false; + } + Matcher matcher = REPLACEMENT_PATTERN.matcher(input); + return matcher.find(); + } + + + public Float getValidPrice(Float personalPrice, Float defaultPrice) { + return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice; + } + + + /** + * @methodName : getMsgType + * @author : 이호영 + * @date : 2025. 3. 12. + * @description : 메세지 타입 구하기 + * @return : String + * @param smsTxtByte + * @return + * + */ + private String getMsgType(int smsTxtByte) { + // TODO Auto-generated method stub + + String msgType = SHORT_MSG_TYPE; + + // 1. 2000 Byte 초과는 에러 처리 + if (smsTxtByte > 2000) { + return "INVALID"; + } + + // 2. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문) + if (smsTxtByte > 90) { + msgType = LONG_MSG_TYPE; + } + + return msgType; + } + + + + + /** * @Method Name : kakaoSendPrice @@ -34,13 +419,11 @@ public class KakaoSendUtil { */ public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception { - //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) - String befCash = kakaoVO.getBefCash(); + System.out.println(" :: kakaoSendPrice :: "); + + //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) +// String befCash = kakaoVO.getBefCash(); - //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴 - if("".equals(befCash) || befCash == null) { - - } MjonMsgVO mjonMsgVO = new MjonMsgVO(); mjonMsgVO.setUserId(kakaoVO.getUserId()); String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); @@ -55,6 +438,7 @@ public class KakaoSendUtil { /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ //대체문자 발송 여부 확인 + System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn()); if(kakaoVO.getSubMsgSendYn().equals("Y")) { @@ -401,6 +785,107 @@ public class KakaoSendUtil { varValInfo = kakaoVO.getVarValList().get(count); } String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); + setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 + } + + kakaoSendList.add(setSendMsgVO); + } + kakaoVO.setKakaoSendList(kakaoSendList); + + } catch (Exception e) { + System.out.println(e.toString()); + e.printStackTrace(); + } + + return kakaoVO; + } + + /** + * @methodName : kakaoSendMsg_advc + * @author : 이호영 + * @date : 2025. 3. 13. + * @description : kakaoSendMsg 개선 + * @return : KakaoVO + * @param kakaoVO + * @return + * @throws Exception + * + */ + public KakaoVO kakaoSendMsg_advc(KakaoVO kakaoVO) throws Exception { + List kakaoSendList = new ArrayList(); + //전체 받는사람 수량만큼 반복 확인 + int callToCnt = kakaoVO.getCallToList().length; + try { + for(int count =0; count < callToCnt; count++) { + + KakaoVO setSendMsgVO = new KakaoVO(); + + setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + // 카카오 전송내용 설정 + // 변환문자 포함(Y), 미포함(N) + if(kakaoVO.getTxtReplYn().equals("Y")) { + + String templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count); + setSendMsgVO.setTemplateContent(templateContent); + + if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) { + + String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count); + String subTitle = kakaoVO.getTemplateSubtitle(); +// title = title +"§§"+ subTitle; + setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType()); + setSendMsgVO.setTemplateTitle(title); + } + + }else { + + if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) { + + String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count); + String subTitle = kakaoVO.getTemplateSubtitle(); +// title = title +"§§"+ subTitle; + setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType()); + setSendMsgVO.setTemplateTitle(title); + } + + // 템플릿 내용 설정 + setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent()); + } + + //대체문자 포함(Y), 미포함(N) + if(kakaoVO.getSubMsgSendYn().equals("Y")) { + + String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + + String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); + kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt); + if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) { + tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count); + } + System.out.println("@@ 대체문자내용 : " + tempSubMagTxt); + setSendMsgVO.setSubMsgTxt(tempSubMagTxt); + + int FrBytes = tempSubMagTxt.getBytes(charset).length; + System.out.println("@@ 대체문자길이 : " + FrBytes); + //메세지 길이가 90Byte가 초과시 MMS + if(FrBytes > 90) { + setSendMsgVO.setSubMsgType("MMS"); + }else {// 아니면 SMS + setSendMsgVO.setSubMsgType("SMS"); + } + + System.out.println("@@ 대체문자타입 : " + setSendMsgVO.getSubMsgType()); + } + + if(kakaoVO.getBizJsonYn().equals("Y")) { + kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호 + + String[] varValInfo = null; + if( kakaoVO.getVarValList().size() != 0) { + varValInfo = kakaoVO.getVarValList().get(count); + } + String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); +// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave_advc(kakaoVO, varValInfo); // String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count)); setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 } @@ -509,6 +994,7 @@ public class KakaoSendUtil { public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) { + System.out.println("tempSubMagTxt : "+ tempSubMagTxt); // String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); // String tempSubMagTxt = msgTxt; @@ -551,6 +1037,7 @@ public class KakaoSendUtil { return tempSubMagTxt; } + public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{ List varValList = kakaoVO.getVarValList(); @@ -704,5 +1191,10 @@ public class KakaoSendUtil { //} return ""; } - + + public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { + statusResponse.setStatus(httpStatus); + statusResponse.setMessage(msg); + + } } diff --git a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java index e6dd28a3..527f146f 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java +++ b/src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java @@ -2,8 +2,11 @@ package itn.let.kakao.kakaoComm; import java.util.ArrayList; import java.util.List; +import java.util.Map; import itn.let.mjo.msg.service.MjonMsgVO; +import lombok.Getter; +import lombok.Setter; /** * @FileName : KakaoVO.java @@ -13,6 +16,8 @@ import itn.let.mjo.msg.service.MjonMsgVO; * @프로그램 설명 : 카카오톡 요청 변수 목록 (문자온VO를 상속 받음) */ +@Getter +@Setter public class KakaoVO extends MjonMsgVO{ private static final long serialVersionUID = 536382850588307019L; @@ -246,996 +251,69 @@ public class KakaoVO extends MjonMsgVO{ private String successCntDay; private String successCntMonth; private String successCntYear; - - public String getSuccessDay() { - return successDay; - } - - public void setSuccessDay(String successDay) { - this.successDay = successDay; - } - - public String getSuccessMonth() { - return successMonth; - } - - public void setSuccessMonth(String successMonth) { - this.successMonth = successMonth; - } - - public String getSuccessYear() { - return successYear; - } - - public void setSuccessYear(String successYear) { - this.successYear = successYear; - } - public String getSuccessCntDay() { - return successCntDay; - } - - public void setSuccessCntDay(String successCntDay) { - this.successCntDay = successCntDay; - } - - public String getSuccessCntMonth() { - return successCntMonth; - } - - public void setSuccessCntMonth(String successCntMonth) { - this.successCntMonth = successCntMonth; - } - - public String getSuccessCntYear() { - return successCntYear; - } - - public void setSuccessCntYear(String successCntYear) { - this.successCntYear = successCntYear; - } - public static long getSerialversionuid() { - return serialVersionUID; - } - - public String getCategoryDepth() { - return categoryDepth; - } - - public void setCategoryDepth(String categoryDepth) { - this.categoryDepth = categoryDepth; - } - - public String getCategoryType() { - return categoryType; - } - - public void setCategoryType(String categoryType) { - this.categoryType = categoryType; - } - - public String getCategoryCode() { - return categoryCode; - } - - public void setCategoryCode(String categoryCode) { - this.categoryCode = categoryCode; - } - - public String getCategoryGroupName() { - return categoryGroupName; - } - - public void setCategoryGroupName(String categoryGroupName) { - this.categoryGroupName = categoryGroupName; - } - - public String getCategoryName() { - return categoryName; - } - - public void setCategoryName(String categoryName) { - this.categoryName = categoryName; - } - - public String getCategoryInclusion() { - return categoryInclusion; - } - - public void setCategoryInclusion(String categoryInclusion) { - this.categoryInclusion = categoryInclusion; - } - - public String getCategoryExclusion() { - return categoryExclusion; - } - - public void setCategoryExclusion(String categoryExclusion) { - this.categoryExclusion = categoryExclusion; - } - - public String getBizUrl() { - return bizUrl; - } - public void setBizUrl(String bizUrl) { - this.bizUrl = bizUrl; - } - - public String getBizReturnMsg() { - return bizReturnMsg; - } - - public void setBizReturnMsg(String bizReturnMsg) { - this.bizReturnMsg = bizReturnMsg; - } - - public String getBizReturnCode() { - return bizReturnCode; - } - - public void setBizReturnCode(String bizReturnCode) { - this.bizReturnCode = bizReturnCode; - } - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - public String getYellowId() { - return yellowId; - } - - public void setYellowId(String yellowId) { - this.yellowId = yellowId; - } - - public String getBizJsonName() { - return bizJsonName; - } - - public void setBizJsonName(String bizJsonName) { - this.bizJsonName = bizJsonName; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public String getSenderKey() { - return senderKey; - } - - public void setSenderKey(String senderKey) { - this.senderKey = senderKey; - } - - public String getProfileId() { - return profileId; - } - - public void setProfileId(String profileId) { - this.profileId = profileId; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getImgTitle() { - return imgTitle; - } - - public void setImgTitle(String imgTitle) { - this.imgTitle = imgTitle; - } - - public String getImageType() { - return imageType; - } - - public void setImageType(String imageType) { - this.imageType = imageType; - } - - public String getImgLink() { - return imgLink; - } - - public void setImgLink(String imgLink) { - this.imgLink = imgLink; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getTemplateMessageType() { - return templateMessageType; - } - - public void setTemplateMessageType(String templateMessageType) { - this.templateMessageType = templateMessageType; - } - - public String getTemplateEmphasizeType() { - return templateEmphasizeType; - } - - public void setTemplateEmphasizeType(String templateEmphasizeType) { - this.templateEmphasizeType = templateEmphasizeType; - } - - public String getTemplateContent() { - return templateContent; - } - - public void setTemplateContent(String templateContent) { - this.templateContent = templateContent; - } - - public String getTemplateExtra() { - return templateExtra; - } - - public void setTemplateExtra(String templateExtra) { - this.templateExtra = templateExtra; - } - - public String getTamplateAd() { - return tamplateAd; - } - - public void setTamplateAd(String tamplateAd) { - this.tamplateAd = tamplateAd; - } - - public String getTemplateImageName() { - return templateImageName; - } - - public void setTemplateImageName(String templateImageName) { - this.templateImageName = templateImageName; - } - - public String getTemplateImageUrl() { - return templateImageUrl; - } - - public void setTemplateImageUrl(String templateImageUrl) { - this.templateImageUrl = templateImageUrl; - } - - public String getTemplateTitle() { - return templateTitle; - } - - public void setTemplateTitle(String templateTitle) { - this.templateTitle = templateTitle; - } - - public String getTemplateSubtitle() { - return templateSubtitle; - } - - public void setTemplateSubtitle(String templateSubtitle) { - this.templateSubtitle = templateSubtitle; - } - - public String getTemplateHeader() { - return templateHeader; - } - - public void setTemplateHeader(String templateHeader) { - this.templateHeader = templateHeader; - } - - public Boolean getSecurityFlag() { - return securityFlag; - } - - public void setSecurityFlag(Boolean securityFlag) { - this.securityFlag = securityFlag; - } - - public List getButtonVOList() { - return buttonVOList; - } - - public void setButtonVOList(List buttonVOList) { - this.buttonVOList = buttonVOList; - } - - public String getButtonName() { - return buttonName; - } - - public void setButtonName(String buttonName) { - this.buttonName = buttonName; - } - - public String getButtonLinkType() { - return buttonLinkType; - } - - public void setButtonLinkType(String buttonLinkType) { - this.buttonLinkType = buttonLinkType; - } - - public String getButtonLinkAnd() { - return buttonLinkAnd; - } - - public void setButtonLinkAnd(String buttonLinkAnd) { - this.buttonLinkAnd = buttonLinkAnd; - } - - public String getButtonLinkIos() { - return buttonLinkIos; - } - - public void setButtonLinkIos(String buttonLinkIos) { - this.buttonLinkIos = buttonLinkIos; - } - - public String getButtonLinkMo() { - return buttonLinkMo; - } - - public void setButtonLinkMo(String buttonLinkMo) { - this.buttonLinkMo = buttonLinkMo; - } - - public String getButtonLinkPc() { - return buttonLinkPc; - } - - public void setButtonLinkPc(String buttonLinkPc) { - this.buttonLinkPc = buttonLinkPc; - } - - public String getButtonPluginId() { - return buttonPluginId; - } - - public void setButtonPluginId(String buttonPluginId) { - this.buttonPluginId = buttonPluginId; - } - - public String getQuickName() { - return quickName; - } - - public void setQuickName(String quickName) { - this.quickName = quickName; - } - - public String getQuickLinkType() { - return quickLinkType; - } - - public void setQuickLinkType(String quickLinkType) { - this.quickLinkType = quickLinkType; - } - - public String getQuickLinkAnd() { - return quickLinkAnd; - } - - public void setQuickLinkAnd(String quickLinkAnd) { - this.quickLinkAnd = quickLinkAnd; - } - - public String getQuickLinkIos() { - return quickLinkIos; - } - - public void setQuickLinkIos(String quickLinkIos) { - this.quickLinkIos = quickLinkIos; - } - - public String getQuickLinkMo() { - return quickLinkMo; - } - - public void setQuickLinkMo(String quickLinkMo) { - this.quickLinkMo = quickLinkMo; - } - - public String getQuickLinkPc() { - return quickLinkPc; - } - - public void setQuickLinkPc(String quickLinkPc) { - this.quickLinkPc = quickLinkPc; - } - - public String getSenderKeyType() { - return senderKeyType; - } - - public void setSenderKeyType(String senderKeyType) { - this.senderKeyType = senderKeyType; - } - - public String getDeleteYn() { - return deleteYn; - } - - public void setDeleteYn(String deleteYn) { - this.deleteYn = deleteYn; - } - - public String getTemplateCode() { - return templateCode; - } - - public void setTemplateCode(String templateCode) { - this.templateCode = templateCode; - } - - public String getNewTemplateCode() { - return newTemplateCode; - } - - public void setNewTemplateCode(String newTemplateCode) { - this.newTemplateCode = newTemplateCode; - } - - public String[] getArrTemplateCode() { - return arrTemplateCode; - } - - public void setArrTemplateCode(String[] arrTemplateCode) { - this.arrTemplateCode = arrTemplateCode; - } - - public String getTemplateStatus() { - return templateStatus; - } - - public void setTemplateStatus(String templateStatus) { - this.templateStatus = templateStatus; - } - - public String getKeyword() { - return keyword; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public String getSendPhone() { - return sendPhone; - } - - public void setSendPhone(String sendPhone) { - this.sendPhone = sendPhone; - } - - public String getDestPhone() { - return destPhone; - } - - public void setDestPhone(String destPhone) { - this.destPhone = destPhone; - } - - public String getSubMsgSendYn() { - return subMsgSendYn; - } - - public void setSubMsgSendYn(String subMsgSendYn) { - this.subMsgSendYn = subMsgSendYn; - } - - public String getCount() { - return count; - } - - public void setCount(String count) { - this.count = count; - } - - public String getPage() { - return page; - } - - public void setPage(String page) { - this.page = page; - } - - public String getBizUmid() { - return bizUmid; - } - - public void setBizUmid(String bizUmid) { - this.bizUmid = bizUmid; - } - - public List getVarNmList() { - return varNmList; - } - - public void setVarNmList(List varNmList) { - this.varNmList = varNmList; - } - - public List getVarValList() { - return varValList; - } - - public void setVarValList(List varValList) { - this.varValList = varValList; - } - - public String getFormListType() { - return formListType; - } - - public void setFormListType(String formListType) { - this.formListType = formListType; - } - - public String getSubMsgTxt() { - return subMsgTxt; - } - - public void setSubMsgTxt(String subMsgTxt) { - this.subMsgTxt = subMsgTxt; - } - - public String getBizJsonYn() { - return bizJsonYn; - } - - public void setBizJsonYn(String bizJsonYn) { - this.bizJsonYn = bizJsonYn; - } - - public String getSendType() { - return sendType; - } - - public void setSendType(String sendType) { - this.sendType = sendType; - } - - public String getAdFlag() { - return adFlag; - } - - public void setAdFlag(String adFlag) { - this.adFlag = adFlag; - } - - public List getKakaoSendList() { - return kakaoSendList; - } - - public void setKakaoSendList(List kakaoSendList) { - this.kakaoSendList = kakaoSendList; - } - - public String getSubMsgTxtReplYn() { - return subMsgTxtReplYn; - } - - public void setSubMsgTxtReplYn(String subMsgTxtReplYn) { - this.subMsgTxtReplYn = subMsgTxtReplYn; - } - - public String getSubMsgType() { - return subMsgType; - } - - public void setSubMsgType(String subMsgType) { - this.subMsgType = subMsgType; - } - public List varValPaser(String[] varValList){ - - List returnVarVal = new ArrayList<>(); - - for(String varVal : varValList) - { - String[] strList = varVal.split("§"); - returnVarVal.add(strList); + //재전송 영역 + private String msgResendAllFlag; + private String msgResendAllGroupId; + private String msgResendAllTmpKey; + private String msgResendAllYellowId; + + private List> varListMap; + + @Override + public String toString() { + String varListMapString = "["; + if (varListMap != null && !varListMap.isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (Map map : varListMap) { + if (sb.length() > 0) + sb.append(", "); + if (map == null) { + sb.append("null"); + } else { + sb.append("{"); + String prefix = ""; + for (Map.Entry entry : map.entrySet()) { + sb.append(prefix).append(entry.getKey()).append("=").append(entry.getValue()); + prefix = ", "; + } + sb.append("}"); + } + } + varListMapString += sb.toString(); } + varListMapString += "]"; - return returnVarVal; - } - - public String getMenuTopTab() { - return menuTopTab; - } - - public void setMenuTopTab(String menuTopTab) { - this.menuTopTab = menuTopTab; - } - - public String getMenuSubTab() { - return menuSubTab; - } - - public void setMenuSubTab(String menuSubTab) { - this.menuSubTab = menuSubTab; - } - - public String getSearchCondition2() { - return searchCondition2; - } - - public void setSearchCondition2(String searchCondition2) { - this.searchCondition2 = searchCondition2; - } - - public String getKakaoResendSuccCount() { - return kakaoResendSuccCount; - } - - public void setKakaoResendSuccCount(String kakaoResendSuccCount) { - this.kakaoResendSuccCount = kakaoResendSuccCount; - } - - public String getKakaoResendFailCount() { - return kakaoResendFailCount; - } - - public void setKakaoResendFailCount(String kakaoResendFailCount) { - this.kakaoResendFailCount = kakaoResendFailCount; - } - - public String getAtSuccessCount() { - return atSuccessCount; - } - - public void setAtSuccessCount(String atSuccessCount) { - this.atSuccessCount = atSuccessCount; - } - - public String getFtSuccessCount() { - return ftSuccessCount; - } - - public void setFtSuccessCount(String ftSuccessCount) { - this.ftSuccessCount = ftSuccessCount; - } - - public String getAtFailCount() { - return atFailCount; - } - - public void setAtFailCount(String atFailCount) { - this.atFailCount = atFailCount; - } - - public String getFtFailCount() { - return ftFailCount; - } - - public void setFtFailCount(String ftFailCount) { - this.ftFailCount = ftFailCount; - } - - public String getAtSuccPrice() { - return atSuccPrice; - } - - public void setAtSuccPrice(String atSuccPrice) { - this.atSuccPrice = atSuccPrice; - } - - public String getFtSuccPrice() { - return ftSuccPrice; - } - - public void setFtSuccPrice(String ftSuccPrice) { - this.ftSuccPrice = ftSuccPrice; - } - - public String getAtFailPrice() { - return atFailPrice; - } - - public void setAtFailPrice(String atFailPrice) { - this.atFailPrice = atFailPrice; - } - - public String getFtFailPrice() { - return ftFailPrice; - } - - public void setFtFailPrice(String ftFailPrice) { - this.ftFailPrice = ftFailPrice; - } - - public String getKakaoResendSuccPrice() { - return kakaoResendSuccPrice; - } - - public void setKakaoResendSuccPrice(String kakaoResendSuccPrice) { - this.kakaoResendSuccPrice = kakaoResendSuccPrice; - } - - public String getKakaoResendFailPrice() { - return kakaoResendFailPrice; - } - - public void setKakaoResendFailPrice(String kakaoResendFailPrice) { - this.kakaoResendFailPrice = kakaoResendFailPrice; - } - - public String getAtSuccCntSum() { - return atSuccCntSum; - } - - public void setAtSuccCntSum(String atSuccCntSum) { - this.atSuccCntSum = atSuccCntSum; - } - - public String getFtSuccCntSum() { - return ftSuccCntSum; - } - - public void setFtSuccCntSum(String ftSuccCntSum) { - this.ftSuccCntSum = ftSuccCntSum; - } - - public String getAtFailCntSum() { - return atFailCntSum; - } - - public void setAtFailCntSum(String atFailCntSum) { - this.atFailCntSum = atFailCntSum; - } - - public String getFtFailCntSum() { - return ftFailCntSum; - } - - public void setFtFailCntSum(String ftFailCntSum) { - this.ftFailCntSum = ftFailCntSum; - } - - public String getKakaoResenSuccSum() { - return kakaoResenSuccSum; - } - - public void setKakaoResenSuccSum(String kakaoResenSuccSum) { - this.kakaoResenSuccSum = kakaoResenSuccSum; - } - - public String getKakaoResenFailSum() { - return kakaoResenFailSum; - } - - public void setKakaoResenFailSum(String kakaoResenFailSum) { - this.kakaoResenFailSum = kakaoResenFailSum; - } - - public String getAtSuccPriceSum() { - return atSuccPriceSum; - } - - public void setAtSuccPriceSum(String atSuccPriceSum) { - this.atSuccPriceSum = atSuccPriceSum; - } - - public String getFtSuccPriceSum() { - return ftSuccPriceSum; - } - - public void setFtSuccPriceSum(String ftSuccPriceSum) { - this.ftSuccPriceSum = ftSuccPriceSum; - } - - public String getAtFailPriceSum() { - return atFailPriceSum; - } - - public void setAtFailPriceSum(String atFailPriceSum) { - this.atFailPriceSum = atFailPriceSum; - } - - public String getFtFailPriceSum() { - return ftFailPriceSum; - } - - public void setFtFailPriceSum(String ftFailPriceSum) { - this.ftFailPriceSum = ftFailPriceSum; - } - - public String getKakaoResendSuccPriceSum() { - return kakaoResendSuccPriceSum; - } - - public void setKakaoResendSuccPriceSum(String kakaoResendSuccPriceSum) { - this.kakaoResendSuccPriceSum = kakaoResendSuccPriceSum; - } - - public String getKakaoResendFailPriceSum() { - return kakaoResendFailPriceSum; - } - - public void setKakaoResendFailPriceSum(String kakaoResendFailPriceSum) { - this.kakaoResendFailPriceSum = kakaoResendFailPriceSum; - } - - public String getFriendId() { - return friendId; - } - - public void setFriendId(String friendId) { - this.friendId = friendId; - } - - public String getImageTitle() { - return imageTitle; - } - - public void setImageTitle(String imageTitle) { - this.imageTitle = imageTitle; - } - - public String getImageLink() { - return imageLink; - } - - public void setImageLink(String imageLink) { - this.imageLink = imageLink; - } - - public String getJsonText() { - return jsonText; - } - - public void setJsonText(String jsonText) { - this.jsonText = jsonText; - } - - public String getImageFileName() { - return imageFileName; - } - - public void setImageFileName(String imageFileName) { - this.imageFileName = imageFileName; - } - - public String getSbscrbDe() { - return sbscrbDe; - } - - public void setSbscrbDe(String sbscrbDe) { - this.sbscrbDe = sbscrbDe; - } - - public String getMoblphonNo() { - return moblphonNo; - } - - public void setMoblphonNo(String moblphonNo) { - this.moblphonNo = moblphonNo; - } - - public String getDept() { - return dept; - } - - public void setDept(String dept) { - this.dept = dept; - } - - public String getAtchFileId() { - return atchFileId; - } - - public void setAtchFileId(String atchFileId) { - this.atchFileId = atchFileId; - } - - public String getWorkAtchFileId() { - return workAtchFileId; - } - - public void setWorkAtchFileId(String workAtchFileId) { - this.workAtchFileId = workAtchFileId; - } - - public String getFileSn() { - return fileSn; - } - - public void setFileSn(String fileSn) { - this.fileSn = fileSn; - } - - public String getFileCn() { - return fileCn; - } - - public void setFileCn(String fileCn) { - this.fileCn = fileCn; - } - - public String getFileStreCours() { - return fileStreCours; - } - - public void setFileStreCours(String fileStreCours) { - this.fileStreCours = fileStreCours; - } - - public String getOrignlFileNm() { - return orignlFileNm; - } - - public void setOrignlFileNm(String orignlFileNm) { - this.orignlFileNm = orignlFileNm; - } - - public String getStreFileNm() { - return streFileNm; - } - - public void setStreFileNm(String streFileNm) { - this.streFileNm = streFileNm; - } - - public String getFileExtsn() { - return fileExtsn; - } - - public void setFileExtsn(String fileExtsn) { - this.fileExtsn = fileExtsn; - } - - public String getFileSize() { - return fileSize; - } - - public void setFileSize(String fileSize) { - this.fileSize = fileSize; - } - - public int getStartCount() { - return startCount; - } - - public void setStartCount(int startCount) { - this.startCount = startCount; - } - - public int getEndCount() { - return endCount; - } - - public void setEndCount(int endCount) { - this.endCount = endCount; - } - - public String getPhmType() { - return phmType; - } - - public void setPhmType(String phmType) { - this.phmType = phmType; - } + return "KakaoSendAdvcVO[" + + "\n senderKey=[" + senderKey + "]" + + "\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" + + "\n , subMsgSendYn=[" + subMsgSendYn + "]" + + "\n , reserveYn=[" + getReserveYn() + "]" + + "\n , divideCnt=[" + getDivideCnt() + "]" + + "\n , bizJsonYn=[" + bizJsonYn + "]" + + "\n , templateEmphasizeType=[" + templateEmphasizeType + "]" + + "\n , templateSubtitle=[" + templateSubtitle + "]" + + "\n , txtReplYn=[" + getTxtReplYn() + "]" + + "\n , callFrom=[" + getCallFrom() + "]" + + "\n , templateCode=[" + templateCode + "]" + + "\n , divideTime=[" + getDivideTime() + "]" + + "\n , reqDate=[" + getReqDate() + "]" + + "\n , atSmishingYn=[" + getAtSmishingYn() + "]" + + "\n , menuTopTab=[" + menuTopTab + "]" + + "\n , templateContent=[" + templateContent + "]" + + "\n , templateTitle=[" + templateTitle + "]" + + "\n , subMsgTxt=[" + subMsgTxt + "]" + + "\n , divideChk=[" + getDivideChk() + "]" + + "\n , sendType=[" + sendType + "]" + + "\n , msgType=[" + getMsgType() + "]" + + "\n , userId=[" + userId + "]" + + "\n , varListMap=[" + varListMapString + "]" + + "\n , befCash=[" + getBefCash() + "]" + + "\n , befPoint=[" + getBefPoint() + "]" + + "\n ]"; + } + + } diff --git a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java index 2312ac1a..bbdd8f81 100644 --- a/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java +++ b/src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java @@ -8,6 +8,7 @@ import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -18,6 +19,7 @@ import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; @Component @@ -32,7 +34,57 @@ public class KakaoApiJsonSave { static String json; - @SuppressWarnings("unchecked") + public String kakaoApiJsonSave_advc(KakaoSendAdvcVO sendVO, KakaoReturnVO templateDetail) { + + // 버튼리스트 JSON 생성 + JSONArray buttonList = new JSONArray(); + for(KakaoButtonVO buttonInfoVO : sendVO.getButtonList()) { + JSONObject buttonInfo = new JSONObject(); + + buttonInfo.put("name", buttonInfoVO.getName()); + buttonInfo.put("type", buttonInfoVO.getLinkType()); + + if(buttonInfoVO.getLinkType().equals("WL")) { + buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo()); + buttonInfo.put("url_pc", buttonInfoVO.getLinkPc()); + }else if(buttonInfoVO.getLinkType().equals("AL")) { + buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos()); + buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd()); + }else if(buttonInfoVO.getLinkType().equals("BC")) { + // 상담톡 진행시 등록해야함 + }else if(buttonInfoVO.getLinkType().equals("BT")) { + // 봇 전환 시 전달 + } + buttonList.add(buttonInfo); + } + + // 강조유형 JSON 생성 + JSONObject templateDetailInfo = new JSONObject(); + String emphasizeType = templateDetail.getTemplateEmphasizeType(); + + + if(emphasizeType.equals("TEXT")) { + templateDetailInfo.put("title", sendVO.getTemplateTitle()); + }else if(emphasizeType.equals("IMAGE")) { + templateDetailInfo.put("msg_type", "ai"); + } + + + JSONObject jo = new JSONObject(); + + if(buttonList.size() != 0) { + jo.put("button", buttonList); + } + if(templateDetailInfo.size() != 0) { + jo.put("extra", templateDetailInfo); + } + + // 입력 json 데이터를 파일로 변경 + String jsonStr = jo.toString(); + + return jsonStr; + } + public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) { // json파일 저장 @@ -109,12 +161,12 @@ public class KakaoApiJsonSave { for(int i=0; i < varNm.length; i++) { for(int j=0; j < varValInfo.length; j++) { if (templateTitle.indexOf(varNm[i]) > -1) { - if(varValInfo[j] != null) { - templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j])); - }else { - templateTitle = templateTitle.replaceAll(varNm[i] , ""); - } - } + if(varValInfo[j] != null) { + templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j])); + }else { + templateTitle = templateTitle.replaceAll(varNm[i] , ""); + } + } } } @@ -140,8 +192,8 @@ public class KakaoApiJsonSave { // 입력 json 데이터를 파일로 변경 String jsonStr = jo.toString(); - System.out.println("jsonFileName : "+jsonFileName); - +// System.out.println("jsonFileName : "+jsonFileName); + File outPut = new File(jsonFileName); outPut.createNewFile(); diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java index c19695ea..098f9768 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java @@ -2,7 +2,11 @@ package itn.let.kakao.user.kakaoAt.service; import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; public interface KakaoAlimTalkService { @@ -24,5 +28,7 @@ public interface KakaoAlimTalkService { //카카오 친구톡 전송 실패 환불리스트 조회 public void selectKakaoFtSentRefundList() throws Exception; + + StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception; } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java index 6a661ac3..fe3cd77b 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java @@ -6,6 +6,7 @@ import java.util.List; import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; @Repository("kakaoAlimTalkDAO") @@ -43,15 +44,6 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO { return result; } - public int insertKakaoAtDataInfo(List kakaoAtSandList) throws Exception{ - - int result = 0; - - result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList); - - return result; - } - public void insertKakaoSendPrice(KakaoVO kakaoVO) throws Exception{ insert("kakaoAlimTalkDAO.insertKakaoSendPrice",kakaoVO); } @@ -94,4 +86,26 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO { public void updateKakaoFtNotSend(KakaoVO kakaoVO) { select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO); } + + public int insertKakaoAtDataInfo(List kakaoAtSandList) throws Exception{ + + int result = 0; + + result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList); + + return result; + } + + public int insertKakaoAtDataInfo_advc(List kakaoSendAdvcVOList) { + + return update("kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc", kakaoSendAdvcVOList); + } + + public void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcVOList) { + insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList); + } + + public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) { + insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO); + } } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java index 61f0cd6a..cef9cf34 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java @@ -1,19 +1,40 @@ package itn.let.kakao.user.kakaoAt.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.cmm.MjonMsgSendVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; +import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.impl.MjonMsgDAO; @@ -24,9 +45,14 @@ import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO; import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayVO; +import itn.let.module.base.PriceAndPoint; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; +import itn.let.uss.umt.service.EgovUserManageService; +import itn.let.uss.umt.service.UserManageVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service("kakaoAlimTalkService") public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{ @@ -47,12 +73,28 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements @Resource(name = "egovMjonMsgIdGnrService") private EgovIdGnrService idgenMsgId; + + @Resource(name = "egovMjonMsgGroupIdGnrService") + private EgovIdGnrService idgenMjonMsgGroupId; @Resource(name = "mjonPayService") private MjonPayService mjonPayService; @Resource(name = "egovMjonCashIdGnrService") private EgovIdGnrService idgenMjonCashId; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + @Autowired + KakaoSendUtil kakaoSendUtil; + + @Autowired + private MjonCommon mjonCommon; + + @Autowired + private PriceAndPoint priceAndPoint; //발신프로필 상태값 변경(삭제/복구 기능) @Override @@ -816,4 +858,349 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements } } } + + @Override + public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception { + +// log.info(" :: [{}]", kakaoVO.toString()); + + + // 측정할 메소드 호출 전 시간 기록 + Instant start = Instant.now(); +// KakaoSendAdvcVO + + Map returnMap = new HashMap<>(); + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() + ? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser() + : null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if (userId.equals("")) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다."); + } + + kakaoVO.setUserId(userId); + + /** + * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함 + */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + if (!mberSttus) { + request.getSession().invalidate(); + // UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때 + return new StatusResponse(HttpStatus.UNAUTHORIZED, + "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + } + + + StatusResponse statusResponse = new StatusResponse(); + +/** @isHolidayNotified + * @false : 알림 X + * @true : 알림 O */ + boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO); + + + +/** @카카오톡 전송 list 셋팅 -------------------------------------------*/ + List kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, isNotified, statusResponse); + if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { + log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage()); + return statusResponse; + } + + + +/** @전송금액 확인 --------------------------------------------------*/ + if (!isCashSufficient(userId, kakaoSendAdvcListVO)) { + log.error("Insufficient balance for message sending."); + return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다."); + } + + + +/** @json파일이 있을 떄 biz_attachments insert */ + this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO); + + + Map> priceGroupedMessages = kakaoSendAdvcListVO.stream() + .collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice)); + // instTotalCnt : 화면에서 보여줄 총 발송건수 + int instTotalCnt = 0; + // 임시 + List nextMsgGroupIdA = new ArrayList<>(); + // 대안: entrySet() 직접 사용 + for (Map.Entry> entry : priceGroupedMessages.entrySet()) { + // entry 사용 + + List groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 + + String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); + groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId)); + + + // 발송 데이터 삽입 + int instCnt = this.insertKakaoData_advc(groupedMsgList); +// int instCnt = 6; + + if(instCnt > 0) { + + instTotalCnt += instCnt; + + KakaoSendAdvcVO sendVO = groupedMsgList.get(0); + +/** @groupData 테이블 insert */ + this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO); + + +/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ + kakaoVO.setMsgGroupId(sendVO.getMsgGroupId()); + kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice())); + kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice())); + kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice())); + + kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO); + + + priceAndPoint.insertCashAndPoint(kakaoVO.getUserId() + , -Float.parseFloat(sendVO.getTotPrice()) + , "카카오 알림톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송" + , nextMsgGroupId + ); + + +/** @SLACK발송 */ + /** @발송조건이되면 발송 */ + if(isNotified) { + mjonCommon.getAdminKakaoAtSendSlack(sendVO); + }else if("Y".equals(kakaoVO.getAtSmishingYn())){ + /** @발송조건이 안되면 DB INSERT */ + mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder() + .msgGroupId(nextMsgGroupId) + .userId(kakaoVO.getUserId()) + .reqDate(kakaoVO.getReqDate()) + .smsTxt(groupedMsgList.get(0).getTemplateContent()) + .totalCallCnt(instCnt) + .callFrom(kakaoVO.getCallFrom()) + .msgType("8") + .reserveYn(kakaoVO.getReserveYn()) + .build() + ); + } + + nextMsgGroupIdA.add(nextMsgGroupId); + + } + + } + + returnMap.put("resultSts", instTotalCnt); + returnMap.put("reserYn", kakaoVO.getReserveYn()); + returnMap.put("groupIds", nextMsgGroupIdA); + + + // 측정할 메소드 호출 후 시간 기록 + Instant end = Instant.now(); + + log.info(" + start :: [{}]", start); + // 실행 시간 계산 (나노초, 밀리초, 초) + long seconds = Duration.between(start, end).getSeconds(); + System.out.println("메소드 실행 시간 (초): " + seconds + " s"); + double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔 + + returnMap.put("second", seconds+" s"); + returnMap.put("minutes", minutes+" min"); + + +// System.out.println("메소드 실행 시간 (분): " + minutes + " min"); + + + + +// priceAndPoint.getBefCash(userId); + + + + + statusResponse.setStatus(HttpStatus.OK); + statusResponse.setObject(returnMap); + + return statusResponse; + } + + + + + private void insertKakaoAtDataJsonInfo_advc(List kakaoSendAdvcListVO) { + // TODO Auto-generated method stub + + // 측정할 메소드 호출 전 시간 기록 + List jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO); + jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr())); + log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size()); + if(jsonInfoData.size() > 0) { + kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData); + } + + } + + private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception { + // TODO Auto-generated method stub + +// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());; +// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString()); + + sendVO.setMsgGroupCnt(Integer.toString(instCnt)); + sendVO.setReserveYn(kakaoVO.getReserveYn()); + sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId())); + sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId())); + + Float eachPrice = Float.parseFloat(sendVO.getEachPrice()); + + Float totPrice = eachPrice * instCnt; + sendVO.setTotPrice(String.format("%.1f", totPrice)); + + sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); + sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt()); + sendVO.setBizKakaoResendType(sendVO.getSubMsgType()); + + kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO); + + } + + /** + * @methodName : insertKakaoData_advc + * @author : 이호영 + * @date : 2025. 3. 20. + * @description : 카카오 batch 발송 => mj_msg_data + * @return : int + * @param kakaoSendAdvcVOList + * @param parentLoopCount + * @param isJsonNotEmpty + * @param isJsonNameAllSame + * @return + * + */ + private int insertKakaoData_advc(List kakaoSendAdvcVOList) { + + + // 시작 시간 측정 + long totalStartTime = System.currentTimeMillis(); + + int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수 + // Batch 크기 설정 (고정값) +// int batchSize = 10000; 465 + int batchSize = 50000; // 9분 18초 + + log.info("총 데이터 개수 :: [{}] ", totalSize); + log.info("설정된 Batch 크기 :: [{}] ", batchSize); + + // 총 insert 카운트 + int instCnt = 0; + int batchCount = 0; + + // 각 배치별 실행 시간 기록 + List batchExecutionTimes = new ArrayList<>(); + + + // 첫 번째 배치에서만 삽입했는지 추적하는 플래그 + for (int i = 0; i < totalSize; i += batchSize) { + // Batch 시작 시간 측정 + long batchStartTime = System.currentTimeMillis(); + + // Batch 리스트 생성 + List batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize)); + System.out.println("Batch 시작 인덱스: " + i); + + // mj_msg_data 테이블 insert + int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList); + + /** @kakaoSendUtil.populateSendLists + * 하단에서 + * getJsonStr 데이터 처리 후 활용 + * */ + instCnt += insertedCount; + + // Batch 종료 시간 측정 및 실행 시간 계산 + long batchEndTime = System.currentTimeMillis(); + double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0; + + // 실행 시간 기록 + batchExecutionTimes.add(batchExecutionTimeInSeconds); + batchCount++; + } + + // 종료 시간 측정 + long totalEndTime = System.currentTimeMillis(); + + // 총 실행 시간 계산 (밀리초 -> 초로 변환) + double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0; + + // 실행 시간 출력 + log.info("총 배치 실행 횟수 :: [{}] ", batchCount); + log.info("batchSize :: [{}] ", batchSize); + log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초"); + log.info("총 삽입 건수 :: [{}] ", instCnt); + + // 각 배치별 실행 시간 출력 + for (int k = 0; k < batchExecutionTimes.size(); k++) { + System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초"); + } + + return instCnt; + + } + + // 보유 금액이 충분한지 확인하는 메서드 + private boolean isCashSufficient(String userId, List kakaoSendAdvcListVO) throws Exception { + + + String userMoney = priceAndPoint.getBefCash(userId); + // 쉼표 제거 + userMoney = userMoney.replace(",", ""); + + // 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용) + BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN); + + // 총 메시지 금액 계산 (HALF_EVEN 적용) + BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream() + .map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지 + .reduce(BigDecimal.ZERO, BigDecimal::add) + .setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지 + + // 비교 수행 + return befCash.compareTo(totalEachPrice) >= 0; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index bb32b5d1..3f30a8b3 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -35,9 +35,11 @@ import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -46,6 +48,8 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; +import com.fasterxml.jackson.databind.ObjectMapper; + import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; @@ -57,6 +61,7 @@ import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.kakaoComm.KakaoReturnVO; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; @@ -65,6 +70,7 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiProfileCategory; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.msgdata.service.MjonMsgDataService; @@ -216,7 +222,29 @@ public class KakaoAlimTalkSendController { model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); } + if("Y".equals(kakaoVO.getMsgResendAllFlag())) { + List resendList = new ArrayList(); + + MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO(); + mjonMsgDataVO.setMsgGroupId(kakaoVO.getMsgResendAllGroupId()); + mjonMsgDataVO.setUserId(userId); + resendList = mjonMsgDataService.selectMjMsgListByResend(mjonMsgDataVO); + + ObjectMapper mapper = new ObjectMapper(); + try { + String resendListJson = mapper.writeValueAsString(resendList); + model.addAttribute("resendListJson", resendListJson); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView"; +// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310"; + } @@ -1057,6 +1085,16 @@ public class KakaoAlimTalkSendController { return modelAndView; } + @RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST) + public ResponseEntity kakaoAlimTalkMsgSendAjax_advc( + @RequestBody KakaoVO kakaoVO, + HttpServletRequest request + ) throws Exception { + + System.out.println(" + kakaoAlimTalkMsgSendAjax_advc + "); + return ResponseEntity.ok().body(kakaoAlimTalkService.insertKakaoAtSandAjax_advc(kakaoVO, request)) ; + } + @RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST) // @ResponseBody public ModelAndView kakaoAlimTalkMsgSendAjax( @@ -1064,6 +1102,10 @@ public class KakaoAlimTalkSendController { HttpServletRequest request, @ModelAttribute("kakaoVO") KakaoVO kakaoVO ) throws Exception { + // 시작 시간 + long startTime = System.currentTimeMillis(); + + System.out.println(" :: kakaoAlimTalkMsgSendAjax :: "); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); @@ -1388,7 +1430,7 @@ public class KakaoAlimTalkSendController { if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 - mjonCommon.getAdminKakaoAtSandSlack(kakaoVO); +// mjonCommon.getAdminKakaoAtSendSlack(kakaoVO); } @@ -1400,7 +1442,94 @@ public class KakaoAlimTalkSendController { } catch (Exception e) { throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e); } + // 종료 시간 + long endTime = System.currentTimeMillis(); + +// 실행 시간 계산 (초 단위) + double executionTimeSeconds = (endTime - startTime) / 1000.0; + + System.out.println("실행 시간: " + String.format("%.3f", executionTimeSeconds) + "초"); + + + String returnTxt = String.format("%.3f", executionTimeSeconds) + "초"; + modelAndView.addObject("seconds", returnTxt); return modelAndView; } + + + @RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView_test_set.do"}) + public String kakaoAlimtalkMsgDataView_test_set(ModelMap model + , @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception { + + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority()); + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + model.addAttribute("loginVO", loginVO); +/* if(userId == "") { + return "redirect:/web/user/login/login.do"; + }*/ + + + //2.사용자 개인 단가 정보 불러오기 + if(!userId.equals("") && !author.equals("ROLE_ADMIN")) { + + // 사용자 아이디를 이용한 발신프로필 조회 + kakaoVO.setUserId(userId); + List selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO); + model.addAttribute("kakaoProfileList", selectKakaoProfileList); + + //발신번호 불러오기 + //아이디 발신번호 리스트 불러오기. + List resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId); + List resultPhonList = new ArrayList(); + MJUtil mjUtil = new MJUtil(); + + for(String phone : resultSendPhonList) { + + resultPhonList.add(mjUtil.addDash(phone)); + + } + model.addAttribute("resultPhonList", resultPhonList); + + + MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId); + + model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn()); + + //3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용 + Float shortPrice = mberManageVO.getShortPrice(); + Float longPrice = mberManageVO.getLongPrice(); + Float picturePrice = mberManageVO.getPicturePrice(); + Float picture2Price = mberManageVO.getPicture2Price(); + Float picture3Price = mberManageVO.getPicture3Price(); + BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN); + + model.addAttribute("userMoney", userMoney); + + + ////////////////////////////////////////////////////////////////// + + //최근 전송 내역 + MjonMsgDataVO searchVO = new MjonMsgDataVO(); + Calendar cal = Calendar.getInstance(); + Date now = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); + cal.setTime(now); + cal.add(Calendar.DATE, -3); + String chkDate = format.format(cal.getTime()); + searchVO.setUserId(userId); + searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작 + model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO)); + + //자주보내는 번호 + model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO)); + + // 사용자 저으이 + model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); + } + + return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp"; + } } diff --git a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java index e47e6a88..0dc23c11 100644 --- a/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java @@ -663,7 +663,7 @@ public class KakaoFriendsTalkSendController { if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 MjonCommon comm = new MjonCommon(); - comm.getAdminKakaoAtSandSlack(kakaoVO); +// comm.getAdminKakaoAtSendSlack(kakaoVO); } diff --git a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentDetailVO.java b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentDetailVO.java new file mode 100644 index 00000000..f5cc4dde --- /dev/null +++ b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentDetailVO.java @@ -0,0 +1,51 @@ +package itn.let.kakao.user.sent.service; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class KakaoSentDetailVO extends KakaoSentVO{ + + private static final long serialVersionUID = 1L; + + private String msgGroupId; + private String reqDate; + private String regDate; + private String msgGroupCnt; + private String reserveYn; + private String reserveCYn; + private String canceldate; + private String callFrom; + private String userId; + private String smsTxt; + private String subject; + private String subjectChkYn; + private String msgType; + private String fileCnt; + private String msgKind; + private String eachPrice; + private String filePath1; + private String filePath2; + private String filePath3; + + private String callTo; + private String statusTxt; + private String addrNm; + + private String successPct; + private String failedPct; + private String waitingPct; + + private String statusCd; // 진행상태 코드 + private String divideYn; + private String divideText; + private String totPrice; + private String yellowId; + private String msgNoticetalkTmpKey; + + // FileInfo 리스트 필드 추가 +// private List fileInfos; + + +} diff --git a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java index aa488b38..61308a39 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java +++ b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java @@ -1,6 +1,7 @@ package itn.let.kakao.user.sent.service; import java.util.List; +import java.util.Map; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; @@ -31,5 +32,11 @@ public interface KakaoSentService { //예약 결과 전체 발송 리스트 불러오기 public List selectReservKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception; + public Map selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception; + + public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception; + + //발송 관리 문자발송 내용 상세보기 팝업 + public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception; } diff --git a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java index d5cf36fa..f600ebae 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java +++ b/src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java @@ -4,7 +4,11 @@ import java.util.Date; import java.util.List; import itn.let.uss.umt.service.UserDefaultVO; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class KakaoSentVO extends UserDefaultVO{ private static final long serialVersionUID = 1L; @@ -90,6 +94,7 @@ public class KakaoSentVO extends UserDefaultVO{ private int successCount; private int waitCount; private int failCount; + private int allCount; private String bizUmid; private int kakaoResendSuccCount; @@ -103,471 +108,11 @@ public class KakaoSentVO extends UserDefaultVO{ private String atDelayCompleteYn; //알림톡 30분 지연 승인/취소 처리 여부 private Date atDelayOrgTime; //알림톡 30분 지연에 대한 원래 시간 (-30분 처리된 시간) - public String getCallToComma() { - return callToComma; - } - public void setCallToComma(String callToComma) { - this.callToComma = callToComma; - } - public String getCallFromComma() { - return callFromComma; - } - public void setCallFromComma(String callFromComma) { - this.callFromComma = callFromComma; - } + private String statusCd; - public String getAtchFiles() { - return atchFiles; - } - public void setAtchFiles(String atchFiles) { - this.atchFiles = atchFiles; - } + private int successPrice; + private int kakaoResendSuccPrice; - public String getMsgId() { - return msgId; - } - public void setMsgId(String msgId) { - this.msgId = msgId; - } - public int getSuccessCnt() { - return successCnt; - } - public void setSuccessCnt(int successCnt) { - this.successCnt = successCnt; - } - public String getMsgTypeName() { - return msgTypeName; - } - public void setMsgTypeName(String msgTypeName) { - this.msgTypeName = msgTypeName; - } - public int getOrderByCode() { - return orderByCode; - } - public void setOrderByCode(int orderByCode) { - this.orderByCode = orderByCode; - } - public String getAtchFileId() { - return atchFileId; - } - public void setAtchFileId(String atchFileId) { - this.atchFileId = atchFileId; - } - public String getFileSn() { - return fileSn; - } - public void setFileSn(String fileSn) { - this.fileSn = fileSn; - } - public String getUserId() { - return userId; - } - public void setUserId(String userId) { - this.userId = userId; - } - public String getAddrNm() { - return addrNm; - } - public void setAddrNm(String addrNm) { - this.addrNm = addrNm; - } - public String getMsgSeq() { - return msgSeq; - } - public void setMsgSeq(String msgSeq) { - this.msgSeq = msgSeq; - } - public String getMsgGroupId() { - return msgGroupId; - } - public void setMsgGroupId(String msgGroupId) { - this.msgGroupId = msgGroupId; - } - public List getMsgGroupIdList() { - return msgGroupIdList; - } - public void setMsgGroupIdList(List msgGroupIdList) { - this.msgGroupIdList = msgGroupIdList; - } - public String getSmsTxt() { - return smsTxt; - } - public void setSmsTxt(String smsTxt) { - this.smsTxt = smsTxt; - } - public String getSubject() { - return subject; - } - public void setSubject(String subject) { - this.subject = subject; - } - public Date getRegdate() { - return regdate; - } - public void setRegdate(Date regdate) { - this.regdate = regdate; - } - public Date getReqdate() { - return reqdate; - } - public void setReqdate(Date reqdate) { - this.reqdate = reqdate; - } - public String getCallFrom() { - return callFrom; - } - public void setCallFrom(String callFrom) { - this.callFrom = callFrom; - } - public String getCallTo() { - return callTo; - } - public void setCallTo(String callTo) { - this.callTo = callTo; - } - public List getCallToList() { - return callToList; - } - public void setCallToList(List callToList) { - this.callToList = callToList; - } - public String getTotPrice() { - return totPrice; - } - public void setTotPrice(String totPrice) { - this.totPrice = totPrice; - } - public String getEachPrice() { - return eachPrice; - } - public void setEachPrice(String eachPrice) { - this.eachPrice = eachPrice; - } - public String getDelFlag() { - return delFlag; - } - public void setDelFlag(String delFlag) { - this.delFlag = delFlag; - } - public String getTotMsgPrice() { - return totMsgPrice; - } - public void setTotMsgPrice(String totMsgPrice) { - this.totMsgPrice = totMsgPrice; - } - public String getRsltCode() { - return rsltCode; - } - public void setRsltCode(String rsltCode) { - this.rsltCode = rsltCode; - } - public String getRsltCode2() { - return rsltCode2; - } - public void setRsltCode2(String rsltCode2) { - this.rsltCode2 = rsltCode2; - } - public String getMsgType() { - return msgType; - } - public void setMsgType(String msgType) { - this.msgType = msgType; - } - public String getMsgGroupCnt() { - return msgGroupCnt; - } - public void setMsgGroupCnt(String msgGroupCnt) { - this.msgGroupCnt = msgGroupCnt; - } - public String getFileCnt() { - return fileCnt; - } - public void setFileCnt(String fileCnt) { - this.fileCnt = fileCnt; - } - public String getTotMsgCnt() { - return totMsgCnt; - } - public void setTotMsgCnt(String totMsgCnt) { - this.totMsgCnt = totMsgCnt; - } - public String getCurState() { - return curState; - } - public void setCurState(String curState) { - this.curState = curState; - } - public String getReserveYn() { - return reserveYn; - } - public void setReserveYn(String reserveYn) { - this.reserveYn = reserveYn; - } - public String getReserveCYn() { - return reserveCYn; - } - public void setReserveCYn(String reserveCYn) { - this.reserveCYn = reserveCYn; - } - public String getFilePath1() { - return filePath1; - } - public void setFilePath1(String filePath1) { - this.filePath1 = filePath1; - } - public String getFilePath2() { - return filePath2; - } - public void setFilePath2(String filePath2) { - this.filePath2 = filePath2; - } - public String getFilePath3() { - return filePath3; - } - public void setFilePath3(String filePath3) { - this.filePath3 = filePath3; - } - public Date getSentDate() { - return sentDate; - } - public void setSentDate(Date sentDate) { - this.sentDate = sentDate; - } - public String getAgentCode() { - return agentCode; - } - public void setAgentCode(String agentCode) { - this.agentCode = agentCode; - } - public String getUserData() { - return userData; - } - public void setUserData(String userData) { - this.userData = userData; - } - public List getUserDataList() { - return userDataList; - } - public void setUserDataList(List userDataList) { - this.userDataList = userDataList; - } - public Date getCancelDate() { - return cancelDate; - } - public void setCancelDate(Date cancelDate) { - this.cancelDate = cancelDate; - } - public String getStartDate() { - return startDate; - } - public void setStartDate(String startDate) { - this.startDate = startDate; - } - public String getEndDate() { - return endDate; - } - public void setEndDate(String endDate) { - this.endDate = endDate; - } - public String getSearchMsgType() { - return searchMsgType; - } - public void setSearchMsgType(String searchMsgType) { - this.searchMsgType = searchMsgType; - } - public String getTabType() { - return tabType; - } - public void setTabType(String tabType) { - this.tabType = tabType; - } - public String getStateType() { - return stateType; - } - public void setStateType(String stateType) { - this.stateType = stateType; - } - public String getListType() { - return listType; - } - public void setListType(String listType) { - this.listType = listType; - } - public String getResultType() { - return resultType; - } - public void setResultType(String resultType) { - this.resultType = resultType; - } - public String getMsgResultCnt() { - return msgResultCnt; - } - public void setMsgResultCnt(String msgResultCnt) { - this.msgResultCnt = msgResultCnt; - } - public String getMsgResultSts() { - return msgResultSts; - } - public void setMsgResultSts(String msgResultSts) { - this.msgResultSts = msgResultSts; - } - public String getAddrGrpNm() { - return addrGrpNm; - } - public void setAddrGrpNm(String addrGrpNm) { - this.addrGrpNm = addrGrpNm; - } - public int getOrderByrsltCode() { - return orderByrsltCode; - } - public void setOrderByrsltCode(int orderByrsltCode) { - this.orderByrsltCode = orderByrsltCode; - } - public String getMsgResult() { - return msgResult; - } - public void setMsgResult(String msgResult) { - this.msgResult = msgResult; - } - public String getNtceBgnde() { - return ntceBgnde; - } - public void setNtceBgnde(String ntceBgnde) { - this.ntceBgnde = ntceBgnde; - } - public String getNtceEndde() { - return ntceEndde; - } - public void setNtceEndde(String ntceEndde) { - this.ntceEndde = ntceEndde; - } - public String getMsgKind() { - return msgKind; - } - public void setMsgKind(String msgKind) { - this.msgKind = msgKind; - } - public String getDelayYn() { - return delayYn; - } - public void setDelayYn(String delayYn) { - this.delayYn = delayYn; - } - public String getDelayCompleteYn() { - return delayCompleteYn; - } - public void setDelayCompleteYn(String delayCompleteYn) { - this.delayCompleteYn = delayCompleteYn; - } - public String getBizKakaoResendYn() { - return bizKakaoResendYn; - } - public void setBizKakaoResendYn(String bizKakaoResendYn) { - this.bizKakaoResendYn = bizKakaoResendYn; - } - public String getBizKakaoResendType() { - return bizKakaoResendType; - } - public void setBizKakaoResendType(String bizKakaoResendType) { - this.bizKakaoResendType = bizKakaoResendType; - } - public String getBizKakaoResendData() { - return bizKakaoResendData; - } - public void setBizKakaoResendData(String bizKakaoResendData) { - this.bizKakaoResendData = bizKakaoResendData; - } - public String getCallStatus() { - return callStatus; - } - public void setCallStatus(String callStatus) { - this.callStatus = callStatus; - } - public String getBizKakaoAtPrice() { - return bizKakaoAtPrice; - } - public void setBizKakaoAtPrice(String bizKakaoAtPrice) { - this.bizKakaoAtPrice = bizKakaoAtPrice; - } - public String getBizKakaoFtPrice() { - return bizKakaoFtPrice; - } - public void setBizKakaoFtPrice(String bizKakaoFtPrice) { - this.bizKakaoFtPrice = bizKakaoFtPrice; - } - public String getBizSmsPrice() { - return bizSmsPrice; - } - public void setBizSmsPrice(String bizSmsPrice) { - this.bizSmsPrice = bizSmsPrice; - } - public String getDiffMin() { - return diffMin; - } - public void setDiffMin(String diffMin) { - this.diffMin = diffMin; - } - public String getBizMmsPrice() { - return bizMmsPrice; - } - public void setBizMmsPrice(String bizMmsPrice) { - this.bizMmsPrice = bizMmsPrice; - } - public int getSuccessCount() { - return successCount; - } - public void setSuccessCount(int successCount) { - this.successCount = successCount; - } - public String getBizUmid() { - return bizUmid; - } - public void setBizUmid(String bizUmid) { - this.bizUmid = bizUmid; - } - public int getKakaoResendSuccCount() { - return kakaoResendSuccCount; - } - public void setKakaoResendSuccCount(int kakaoResendSuccCount) { - this.kakaoResendSuccCount = kakaoResendSuccCount; - } - public int getKakaoResendFailCount() { - return kakaoResendFailCount; - } - public void setKakaoResendFailCount(int kakaoResendFailCount) { - this.kakaoResendFailCount = kakaoResendFailCount; - } - public int getWaitCount() { - return waitCount; - } - public void setWaitCount(int waitCount) { - this.waitCount = waitCount; - } - public int getFailCount() { - return failCount; - } - public void setFailCount(int failCount) { - this.failCount = failCount; - } - public String getAtDelayYn() { - return atDelayYn; - } - public void setAtDelayYn(String atDelayYn) { - this.atDelayYn = atDelayYn; - } - public String getAtDelayCompleteYn() { - return atDelayCompleteYn; - } - public void setAtDelayCompleteYn(String atDelayCompleteYn) { - this.atDelayCompleteYn = atDelayCompleteYn; - } - public Date getAtDelayOrgTime() { - return atDelayOrgTime; - } - public void setAtDelayOrgTime(Date atDelayOrgTime) { - this.atDelayOrgTime = atDelayOrgTime; - } - - + private String divideYn; } diff --git a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java index 969bdb6b..d2a47e18 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java +++ b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; +import itn.let.kakao.user.sent.service.KakaoSentDetailVO; import itn.let.kakao.user.sent.service.KakaoSentVO; @Repository("KakaoSentDAO") @@ -45,6 +46,10 @@ public class KakaoSentDAO extends EgovAbstractDAO { public List selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{ return (List) list("KakaoSentDAO.selectAllKakaoSentList",kakaoSentVO); } + @SuppressWarnings("unchecked") + public List selectAllKakaoSentList_advc(KakaoSentVO kakaoSentVO) throws Exception{ + return (List) list("KakaoSentDAO.selectAllKakaoSentList_advc",kakaoSentVO); + } @SuppressWarnings("unchecked") public List selectAllPrivateKakaoSentList(KakaoSentVO KakaoSentVO) throws Exception{ @@ -90,4 +95,39 @@ public class KakaoSentDAO extends EgovAbstractDAO { return (List) list("KakaoSentDAO.selectReservKakaoSentList",kakaoSentVO); } + @SuppressWarnings("unchecked") + public List selectKakaoSentCntAll_advc(KakaoSentVO kakaoSentVO) throws Exception{ + + List result = new ArrayList(); + + try { + + result = (List) list("KakaoSentDAO.selectKakaoSentCntAll_advc", kakaoSentVO); + + } catch (Exception e) { + + throw new Exception("++++++++++ ErrorService DAO :: " + e); + + } + + return result; + } + + public KakaoSentVO selectKakaoSentCntEachCnt_advc(KakaoSentVO kakaoSentVO) throws Exception{ + return (KakaoSentVO) select("KakaoSentDAO.selectKakaoSentCntEachCnt_advc",kakaoSentVO); + } + + public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception{ + return (KakaoSentDetailVO) select("KakaoSentDAO.selectKakaoSentDetailView", kakaoSentDetailVO); + } + + public List findByReqDateWhereMsgGroupId(String msgGroupId) { + return (List) list("KakaoSentDAO.findByReqDateWhereMsgGroupId", msgGroupId); + } + + //발송 관리 문자발송 내용 상세보기 팝업[그룹] + public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{ + return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO); + } + } diff --git a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java index 3bbcf29e..0a622283 100644 --- a/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java +++ b/src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java @@ -1,7 +1,15 @@ package itn.let.kakao.user.sent.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import javax.annotation.Resource; @@ -10,6 +18,7 @@ import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; +import itn.let.kakao.user.sent.service.KakaoSentDetailVO; import itn.let.kakao.user.sent.service.KakaoSentService; import itn.let.kakao.user.sent.service.KakaoSentVO; @@ -29,7 +38,8 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka try { - result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO); +// result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO); + result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO); } catch (Exception e) { throw new Exception("++++++++++ ErrorService Impl :: " + e); @@ -38,30 +48,83 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka return result; } + public Map selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception{ + + List result = new ArrayList(); + Map returnMap = new HashMap(); + + try { + +// result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO); + result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO); + + + KakaoSentVO allVO = new KakaoSentVO(); + KakaoSentVO atVO = new KakaoSentVO(); + KakaoSentVO ftVO = new KakaoSentVO(); + + result.stream() + .forEach(t -> + { + Integer rsultCnt = Integer.parseInt(t.getMsgResultCnt()); + + if(Integer.parseInt(t.getFilePath1()) > 0) { + if("S".equals(t.getMsgResultSts())) { + atVO.setSuccessCount(atVO.getSuccessCount()+rsultCnt); + }else if("W".equals(t.getMsgResultSts())) { + atVO.setWaitCount(atVO.getWaitCount()+rsultCnt); + }else { + atVO.setFailCount(atVO.getFailCount()+rsultCnt); + } + + atVO.setAllCount(atVO.getAllCount()+rsultCnt); + allVO.setAllCount(allVO.getAllCount()+rsultCnt); + + }else { + if("S".equals(t.getMsgResultSts())) { + ftVO.setSuccessCount(ftVO.getSuccessCount()+rsultCnt); + }else if("W".equals(t.getMsgResultSts())) { + ftVO.setWaitCount(ftVO.getWaitCount()+rsultCnt); + }else { + ftVO.setFailCount(ftVO.getFailCount()+rsultCnt); + } + + ftVO.setAllCount(ftVO.getAllCount()+rsultCnt); + allVO.setAllCount(allVO.getAllCount()+rsultCnt); + + } + }); + + allVO.setSuccessCount(atVO.getSuccessCount()+ftVO.getSuccessCount()); + allVO.setWaitCount(atVO.getWaitCount()+ftVO.getWaitCount()); + allVO.setFailCount(atVO.getFailCount()+ftVO.getFailCount()); + + //전체 성공건, 실패건 불러오기 + returnMap.put("allCnt", allVO); + + //알림톡 성공건, 실패건 불러오기 + returnMap.put("atCnt", atVO); + + //친구톡 성공건, 실패건 불러오기 + returnMap.put("ftCnt", ftVO); + + + } catch (Exception e) { + throw new Exception("++++++++++ ErrorService Impl :: " + e); + } + + return returnMap; + } + //발송 관리 전체 발송 리스트 불러오기 public List selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{ List resultList = new ArrayList(); - String listType = kakaoSentVO.getListType(); - String stateType = kakaoSentVO.getStateType(); + resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO); - if(stateType.equals("fail")) { - - listType = "privateList"; - - } - - System.out.println("listType : "+ listType); - if(listType.equals("groupList")) {//전송건별 리스트 불러오기 - - resultList = kakaoSentDAO.selectAllKakaoSentList(kakaoSentVO); - - }else {//개인별 리스트 불러오기 - - resultList = kakaoSentDAO.selectAllPrivateKakaoSentList(kakaoSentVO); - - } + //totPrice 계산 및 상태코드 set + resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList()); return resultList; } @@ -149,5 +212,229 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka return kakaoSentDAO.selectReservKakaoSentList(kakaoSentVO); } + + @Override + public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception{ + + KakaoSentDetailVO resultVO = kakaoSentDAO.selectKakaoSentDetailView(kakaoSentDetailVO); + + int total = Integer.parseInt(resultVO.getMsgGroupCnt()); // 전체 건수 + int success = 0; // 성공 건수 + int waiting = 0; // 대기 건수 + int failed = 0; // 실패 건수 + if("Y".equals(resultVO.getBizKakaoResendYn())) { + success = resultVO.getSuccessCount() + resultVO.getKakaoResendSuccCount(); + failed = resultVO.getKakaoResendFailCount(); + }else { + success = resultVO.getSuccessCount(); + failed = resultVO.getFailCount(); + } + waiting = resultVO.getWaitCount(); // 대기 건수 + + String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%"; + String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%"; + String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%"; + + resultVO.setSuccessPct(successPct); + resultVO.setFailedPct(waitingPct); + resultVO.setWaitingPct(failedPct); + + resultVO.setTotPrice(this.priceProc(resultVO.getSuccessPrice(), resultVO.getKakaoResendSuccPrice())); + + resultVO = this.codeProc(resultVO); + + // 분할문자인 경우 + if("Y".equals(resultVO.getDivideYn())) { + String divideText = calculateBatchInfo(resultVO); + resultVO.setDivideText(divideText); + } + + return resultVO; + } + + //발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA) + public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception{ + + return kakaoSentDAO.selectKakaoSentDetailViewPhoneAjax(kakaoSentVO); + } + + + // 공통코드 ITN057에 대한 코드화 진행 + /* + * CODE_ID CODE CODE_NM CODE_DC + * ITN057 01 진행중 진행중 + * ITN057 02 완료 완료출해야함 + * ITN057 03 예약대기 예약대기(발송전) 버튼으로 노출해야함 + * ITN057 04 - 예약취소 ( - 으로 노출 ) + * */ + private KakaoSentVO setPriceNCode(KakaoSentVO result) { + + //성공 건수 세팅 + KakaoSentVO eachCnt = new KakaoSentVO(); + eachCnt.setMsgGroupId(result.getMsgGroupId()); + try { + eachCnt = kakaoSentDAO.selectKakaoSentCntEachCnt_advc(eachCnt); + } catch (Exception e) { + System.out.println("setPriceNCode error!!"); + } + + result.setSuccessCount(eachCnt.getSuccessCount()); + result.setWaitCount(eachCnt.getWaitCount()); + result.setFailCount(eachCnt.getFailCount()); + result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount()); + result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount()); + + + //완료상태 시작 + result = this.codeProc(result); + + //완료상태 끝 + //======================================================= + + //총금액 시작 + result.setTotPrice(this.priceProc(eachCnt.getSuccessPrice(), eachCnt.getKakaoResendSuccPrice())); + + + return result; + + } + + private String priceProc(int successPrice, int kakaoResendSuccPrice) { + + String totPrice = "-"; + + //총금액 시작 + //======================================================= + // TotPrice : 성공건수에 대한 금액 곱하기 + BigDecimal atPrice = new BigDecimal(successPrice); + BigDecimal kakaoResendPrice = new BigDecimal(kakaoResendSuccPrice); + BigDecimal totalPrice = atPrice.add(kakaoResendPrice); + // 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장 + // RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림 + BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP); + + // roundedTotalPrice가 0인지 확인 + // BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드 + // 결과: + // - 반환 값이 0이면 두 값이 같음 + // - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음 + // - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼 + if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) { + // roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정 + totPrice = "-"; + } else { + // roundedTotalPrice 값이 0이 아닌 경우 + // 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정 + // toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환 + totPrice = roundedTotalPrice.toPlainString(); + } + //총금액 끝 + //======================================================= + + + return totPrice; + } + + private KakaoSentVO codeProc(KakaoSentVO result) { + //======================================================= + String returnCode; + if ("Y".equals(result.getReserveCYn())) { + returnCode = "04"; // 예약취소 코드 + } else if ( + "Y".equals(result.getReserveYn()) + && "N".equals(result.getReserveCYn()) + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount()) + && Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만 + ) { + returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 ) + } else if ( + //대체문자 발송 Y일때 + ("Y".equals(result.getBizKakaoResendYn()) + //알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건 + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()) + //알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건 + && result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount()) + ) + || + //대체문자 발송 N일때 + ("N".equals(result.getBizKakaoResendYn()) + //알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건 + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())) + ) { + returnCode = "02"; // 완료 코드 + } else { + returnCode = "01"; // 진행중 코드 + } + + result.setStatusCd(returnCode); + + return result; + } + private KakaoSentDetailVO codeProc(KakaoSentDetailVO result) { + //======================================================= + String returnCode; + if ("Y".equals(result.getReserveCYn())) { + returnCode = "04"; // 예약취소 코드 + } else if ( + "Y".equals(result.getReserveYn()) + && "N".equals(result.getReserveCYn()) + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount()) + && Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만 + ) { + returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 ) + } else if ( + //대체문자 발송 Y일때 + ("Y".equals(result.getBizKakaoResendYn()) + //알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건 + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()) + //알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건 + && result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount()) + ) + || + //대체문자 발송 N일때 + ("N".equals(result.getBizKakaoResendYn()) + //알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건 + && Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())) + ) { + returnCode = "02"; // 완료 코드 + } else { + returnCode = "01"; // 진행중 코드 + } + + result.setStatusCd(returnCode); + + return result; + } + + private String calculateBatchInfo(KakaoSentDetailVO resultVO) { + + String msgGroupId = resultVO.getMsgGroupId(); + + + List requestTimes = kakaoSentDAO.findByReqDateWhereMsgGroupId(msgGroupId); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); + Map timeCountMap = new LinkedHashMap<>(); + + // REQ_DATE 그룹화 (같은 시간대 몇 건인지) + for (String timeStr : requestTimes) { + LocalDateTime time = LocalDateTime.parse(timeStr, formatter); + timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1); + } + + // 가장 첫 번째 시간 & 간격 계산 + List sortedKeys = new ArrayList<>(timeCountMap.keySet()); + if (sortedKeys.size() < 2) { + return "데이터 부족 (분석 불가)"; + } + + int batchSize = timeCountMap.get(sortedKeys.get(0)); // 한 번에 보낸 건수 + int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산 +// int batchCount = sortedKeys.size(); // 총 몇 번 보냈는지 + +// return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount); + return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes); + + } } diff --git a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java index 19d95a5e..39dddf44 100644 --- a/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java +++ b/src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java @@ -8,6 +8,7 @@ import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -26,6 +27,8 @@ import org.json.simple.parser.JSONParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; @@ -43,6 +46,7 @@ import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; +import itn.let.kakao.user.sent.service.KakaoSentDetailVO; import itn.let.kakao.user.sent.service.KakaoSentService; import itn.let.kakao.user.sent.service.KakaoSentVO; @@ -82,26 +86,26 @@ public class KakaoSentController { //전체 발송 건수 통계 불러오기 kakaoSentVO.setMsgType(""); - List totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO); - model.addAttribute("totalMsgCnt", totalMsgCnt); - - List atCnt = new ArrayList(); - List ftCnt = new ArrayList(); - - - totalMsgCnt.forEach(t->{ - if (Integer.parseInt(t.getFilePath1())>0) { - atCnt.add(t); - } else if (Integer.parseInt(t.getFilePath2())>0) { - ftCnt.add(t); - } - }); - - //알림톡 성공건, 실패건 불러오기 - model.addAttribute("atCnt", atCnt); - - //친구톡 성공건, 실패건 불러오기 - model.addAttribute("ftCnt", ftCnt); +// List totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO); +// model.addAttribute("totalMsgCnt", totalMsgCnt); +// +// List atCnt = new ArrayList(); +// List ftCnt = new ArrayList(); +// +// +// totalMsgCnt.forEach(t->{ +// if (Integer.parseInt(t.getFilePath1())>0) { +// atCnt.add(t); +// } else if (Integer.parseInt(t.getFilePath2())>0) { +// ftCnt.add(t); +// } +// }); +// +// //알림톡 성공건, 실패건 불러오기 +// model.addAttribute("atCnt", atCnt); +// +// //친구톡 성공건, 실패건 불러오기 +// model.addAttribute("ftCnt", ftCnt); // 검색 리스트 불러오기 if(kakaoSentVO.getPageUnit() != 10) kakaoSentVO.setPageUnit(kakaoSentVO.getPageUnit()); @@ -193,7 +197,7 @@ public class KakaoSentController { List resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO); System.out.println("??"); model.addAttribute("resultAllSentList", resultAllSentList); - model.addAttribute("resultAllSentCnt", resultAllSentList.size()); +// model.addAttribute("resultAllSentCnt", resultAllSentList.size()); model.addAttribute("searchKeyword", kakaoSentVO.getSearchKeyword()); paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0); @@ -498,7 +502,6 @@ public class KakaoSentController { * 발송관리 엑셀다운로드 기능 - 카카오톡 * @param searchVO * @param model - * @return "/web/mjon/msgsent/msgSentExcelDownLoadAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do"}) @@ -985,5 +988,105 @@ public class KakaoSentController { } + @RequestMapping(value= {"/web/kakao/sent/selectKakaoSentViewTotalSumAjax.do"}) + public ResponseEntity selectKakaoSentViewTotalSumAjax( + KakaoSentVO kakaoSentVO + ) throws Exception{ + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(loginVO == null) { +// return "redirect:/web/user/login/login.do"; + } + + kakaoSentVO.setUserId(userId); + + Map returnMap = kakaoSentService.selectKakaoSentCntAll_Advc(kakaoSentVO); + + return new ResponseEntity<>(returnMap, HttpStatus.OK); + } + /** + * 발송관리 상세화면 + * @param searchVO + * @param model + * @return "/web/kakao/sent/selectKakaoSentDetailView.do" + * @throws Exception + */ + @RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailView.do"}) + public String selectKakaoSentDetailView(@ModelAttribute("searchVO") KakaoSentDetailVO kakaoSentDetailVO, + RedirectAttributes redirectAttributes, ModelMap model) throws Exception{ + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(loginVO == null) { + return "redirect:/web/user/login/login.do"; + } + + kakaoSentDetailVO.setUserId(userId); + + model.addAttribute("result", kakaoSentService.selectKakaoSentDetailView(kakaoSentDetailVO)); + + return "web/kakao/sent/KakaoSentDetailView"; + } + + + /** + * @methodName : selectMsgSentDetailDataAjax + * @author : 이호영 + * @date : 2023.03.06 + * @description : 알림톡 전송 - 내용 상세 팝업 [전송건별] + * @param mjonKakaoATVO + * @param model + * @return + * @throws Exception + */ + @RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailViewPhoneAjax.do"}) + public String selectKakaoSentDetailViewPhoneAjax(@ModelAttribute("searchVO") MjonKakaoATVO mjonKakaoATVO, ModelMap model) throws Exception{ + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + mjonKakaoATVO.setUserId(userId); + + + + //발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA) + MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO); + // 대체문자 엔터키 치환 + mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt())); + model.addAttribute("resultMsgDetail", mjonKakaoATResultVO); + + String msgType = mjonKakaoATResultVO.getMsgType(); + + if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리 + + // 템플릿 api 가져오기 + KakaoVO kakaoVO = new KakaoVO(); + kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey()); + kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey()); + + KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + // //템플릿 api 가져오기 + + }else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리 + + //String smsTxt = mjonKakaoATResultVO.getSmsTxt(); + + KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO); + //kakaoTemplateInfo.setTemplateContent(smsTxt); + + model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo); + + }else { + + model.addAttribute("kakaoTemplateInfo", ""); + + } + + model.addAttribute("msgType", msgType); + return "web/kakao/sent/KakaoSentDetailPopAjax"; + } } diff --git a/src/main/java/itn/let/mjo/addr/service/AddrService.java b/src/main/java/itn/let/mjo/addr/service/AddrService.java index ea1179a2..ad8f1b03 100644 --- a/src/main/java/itn/let/mjo/addr/service/AddrService.java +++ b/src/main/java/itn/let/mjo/addr/service/AddrService.java @@ -109,4 +109,8 @@ public interface AddrService { void deleteAddr_advc(AddrGroupVO addrGroupVO) throws Exception; int getAddrCount(AddrGroupVO addrGroupVO) throws Exception; + + StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception; + + StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception; } diff --git a/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java b/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java index 7e5a1bd2..d3be405f 100644 --- a/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java +++ b/src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java @@ -292,5 +292,9 @@ public class AddrDAO extends EgovAbstractDAO { return (Integer)select("AddrDAO.getAddrCount", addrVO); } + public int deleteAddrPhoneNo(AddrVO addrVO) { + return update("AddrDAO.deleteAddrPhoneNo", addrVO); + } + } diff --git a/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java b/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java index f1437a01..0fb6d3dc 100644 --- a/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java +++ b/src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java @@ -34,6 +34,8 @@ import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrVO; +import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import lombok.extern.slf4j.Slf4j; /** * 주소록 관리를 위한 서비스 구현 클래스 @@ -49,6 +51,7 @@ import itn.let.mjo.addr.service.AddrVO; * 2021.04.08 ITN 최초 생성 * */ +@Slf4j @Service("AddrService") public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrService { @@ -644,5 +647,81 @@ public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrSer return aa; } + + @Override + public StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception { + + String userId = addrVO.getMberId(); + + log.info("addrVO.getAddrGrpId() :: [{}]", addrVO.getAddrGrpId()); + + // 새로운 그룹 생성 + if ("NEW".equals(addrVO.getAddrGrpId())) { + + + AddrGroupVO addrGroupVO = new AddrGroupVO(); + addrGroupVO.setMberId(userId); + addrGroupVO.setAddrGrpNm(addrVO.getAddrGrpNm()); + addrGroupVO.setFrstRegisterId(userId); + + int usedCnt = addrGroupDAO.selectDuplAddrGroupCnt(addrGroupVO); + if(usedCnt > 0) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "이미 등록되어있는 그룹이름입니다.", LocalDateTime.now()); + } + + int nextOrderNumber = addrGroupDAO.selectMaxOrderNumber(addrGroupVO); + addrGroupVO.setGrpOrder(nextOrderNumber); + + String addrGrpIdTemp = addrGroupDAO.insertAddrGroup(addrGroupVO); + + + addrVO.setAddrGrpId(addrGrpIdTemp); + + } + else if ("bookmark".equals(addrVO.getAddrGrpId())) + {// 자주 보내는 그룹 + addrVO.setBookmark("Y"); + addrVO.setAddrGrpId("0"); + } + else + { + addrVO.setBookmark("N"); + } + + String bookmark = addrVO.getBookmark(); + String addrGrpId = addrVO.getAddrGrpId(); + + List addrDataInfo = new ArrayList(); + + for(String phone : addrVO.getAddrPhones()) { + AddrVO addrTempVO = new AddrVO(); + addrTempVO.setAddrPhoneNo(phone); + addrTempVO.setAddrGrpId(addrGrpId); + addrTempVO.setBookmark(bookmark); + addrTempVO.setFrstRegisterId(userId); + addrTempVO.setMberId(userId); + addrDataInfo.add(addrTempVO); + } + + int resultCnt = addrDAO.insertAddrList(addrDataInfo); + + + + return new StatusResponse(HttpStatus.OK, "총" + resultCnt + "건의 주소록 등록이 완료되었습니다.", addrVO); + + } + + @Override + public StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception { + +// AddrPhones + //아이디 저장 + + //주소록 디비에서 연락처 정보를 delete 시킴 + int resultCnt = addrDAO.deleteAddrPhoneNo(addrVO); + + + return new StatusResponse(HttpStatus.OK, "총 " + resultCnt + "건의 주소록을 삭제하였습니다.", addrVO); + } } diff --git a/src/main/java/itn/let/mjo/addr/web/AddrController.java b/src/main/java/itn/let/mjo/addr/web/AddrController.java index 2f04ae77..dd4f014d 100644 --- a/src/main/java/itn/let/mjo/addr/web/AddrController.java +++ b/src/main/java/itn/let/mjo/addr/web/AddrController.java @@ -4,6 +4,7 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -31,10 +32,13 @@ import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -52,12 +56,14 @@ import itn.com.cmm.util.RedirectUrlMaker; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.fax.addr.service.FaxAddrVO; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.msgdata.service.PhoneVO; +import lombok.extern.slf4j.Slf4j; /** * 주소록 관한 controller 클래스를 정의한다. @@ -75,6 +81,7 @@ import itn.let.mjo.msgdata.service.PhoneVO; * * */ +@Slf4j @Controller public class AddrController { @@ -2223,6 +2230,47 @@ public class AddrController { return modelAndView; } + + @RequestMapping(value = {"/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do"}) + public ResponseEntity insertByAddrGrpDataAndAddrDataAjax(@RequestBody AddrVO addrVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + + addrVO.setMberId(userId); + + + return ResponseEntity.ok().body(addrService.insertByAddrGrpDataAndAddrDataAjax(addrVO)); + } + + @RequestMapping(value = {"/web/mjon/addr/deleteAddrNoDataAjax.do"}) + public ResponseEntity deleteAddrNoDataAjax(@RequestBody AddrVO addrVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + + addrVO.setMberId(userId); + + return ResponseEntity.ok().body(addrService.deleteAddrNoDataAjax(addrVO)); + } + + public boolean getNameRepLenChk(String type, String value) { diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 5803b62f..d1217838 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -1,10 +1,12 @@ package itn.let.mjo.mjocommon; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @@ -14,13 +16,18 @@ import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.mysql.jdbc.StringUtils; +import egovframework.com.idgen.CustomIdGnrService; +import egovframework.rte.fdl.cmmn.exception.FdlException; import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.OptimalMsgResultDTO; import itn.com.cmm.util.MsgSendUtils; +import itn.com.cmm.util.SlackMessageFormatUtil; +import itn.let.kakao.kakaoComm.KakaoSendAdvcVO; import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.mail.service.StatusResponse; import itn.let.mjo.event.service.MjonEventService; @@ -60,11 +67,14 @@ public class MjonCommon { /** xpedite 솔루션 ID*/ @Value("#{globalSettings['Globals.slack.channel.name']}") private String SLACK_CHANNEL; - + + @Resource(name = "egovMjonMsgIdCGnrService") + private CustomIdGnrService idgenMsgCId; + /** - * @methodName : getAdminMsgSandSlack + * @methodName : getAdminSandSlack * @author : 이호영 * @date : 2024.12.04 * @description : 기존 메소드 리펙토링 @@ -120,8 +130,8 @@ public class MjonCommon { try { // 메시지 내용 설정 - String smsTxt = formatSmsText(mjonMsgVO); - String sandName = formatSandName(mjonMsgVO); + String smsTxt = SlackMessageFormatUtil.formatSmsText(mjonMsgVO); + String sandName = SlackMessageFormatUtil.formatSandName(mjonMsgVO); // Slack 메시지 생성 JSONObject json = new JSONObject(); @@ -150,94 +160,49 @@ public class MjonCommon { } } - /** - * @throws Exception - * @Method Name : getAdminSlackSand - * @작성일 : 2022. 12. 6. - * @작성자 : WYH - * @Method 설명 : slack 메시지 전송 - */ - /*public void getAdminMsgSandSlack(MjonMsgVO mjonMsgVO) { - + public void getAdminKakaoAtSendSlack(KakaoSendAdvcVO kakaoVO) { HttpClient client = new HttpClient(); - PostMethod post = new PostMethod(url); - JSONObject json = new JSONObject(); + PostMethod post = new PostMethod(SLACK_URL); + try { - - String reserveYn = mjonMsgVO.getReserveYn(); - String delayYn = mjonMsgVO.getDelayYn(); - String smsTxt = mjonMsgVO.getSmsTxt(); - String smishingYn = mjonMsgVO.getSmishingYn(); - String reservSmsTxt = ""; - String smisingSmsTxt = ""; - //예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리 + // 메시지 내용 설정 + String smsTxt = SlackMessageFormatUtil.formatKakaoText(kakaoVO); + String sandName = SlackMessageFormatUtil.formatKakaoSandName(kakaoVO); - if(reserveYn.equals("Y")) { - - if(smishingYn.equals("Y") || delayYn.equals("Y")) { - reservSmsTxt = "[스미싱의심][예약]" + smsTxt; - }else { - reservSmsTxt = "[예약]" + smsTxt; - } - - smsTxt = reservSmsTxt; - System.out.println("smishingYn : "+ smishingYn); - System.out.println("delayYn : "+ delayYn); - }else if(smishingYn.equals("Y") || delayYn.equals("Y")) { - - smisingSmsTxt = "[스미싱의심]" + smsTxt; - smsTxt = smisingSmsTxt; - } - - String sandName = mjonMsgVO.getCallFrom(); - String userId = mjonMsgVO.getUserId(); - String msgType = ""; - int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수 - if(mjonMsgVO.getMsgType().equals("4")) { //단문 금액 - msgType = "[단문]"; - }else if(mjonMsgVO.getMsgType().equals("6")){ - if(fileCount == 0) { - msgType = "[장문]"; - }else { - msgType = "[그림]"; - // 2022.12.21 JSP => 텍스트없는 그림문자만 발송시 슬랙알림 안됨 - if (StringUtils.isNullOrEmpty(smsTxt)) { - smsTxt = "그림문자 " + smsTxt; - } - } - } -// sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType; - sandName = "[개발테스트]"+"[" + userId + "]" + "[" + sandName + "]" + msgType; - - json.put("channel", "mjon메시지"); + // Slack 메시지 생성 + JSONObject json = new JSONObject(); + json.put("channel", SLACK_CHANNEL); json.put("text", smsTxt); json.put("username", sandName); - + // Slack 요청 post.addParameter("payload", json.toString()); - // 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서 content-type넣어줌 post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + + // Slack 응답 처리 int responseCode = client.executeMethod(post); - String response = post.getResponseBodyAsString(); - if (responseCode != HttpStatus.SC_OK) { - System.out.println("Response: " + response); + if (responseCode != HttpStatus.SC_OK) { + log.warn("Slack 메시지 전송 실패. Response: {}", post.getResponseBodyAsString()); } } catch (IllegalArgumentException e) { - System.out.println("IllegalArgumentException posting to Slack " + e); - } - catch (IOException e) { - System.out.println("IOException posting to Slack " + e); - } - catch (Exception e) { - System.out.println("Exception posting to Slack " + e); - e.printStackTrace(); + log.error("Slack 메시지 전송 중 IllegalArgumentException 발생", e); + } catch (IOException e) { + log.error("Slack 메시지 전송 중 IOException 발생", e); + } catch (Exception e) { + log.error("Slack 메시지 전송 중 Exception 발생", e); } finally { post.releaseConnection(); } - - }*/ + } + private String formatKakaoSandName(KakaoVO kakaoVO) { + // TODO Auto-generated method stub + return null; + } + + + /** * @Method Name : sendSimpleSlackMsg * @작성일 : 2022. 12. 9 @@ -384,7 +349,7 @@ public class MjonCommon { return mjonMsgVO; } - + /* @SuppressWarnings("unchecked") public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) { @@ -448,7 +413,7 @@ public class MjonCommon { } } - + */ public String getCreateMsgUserIdgen(String subUserId, String lastId) throws Exception{ @@ -485,27 +450,6 @@ public class MjonCommon { -private String formatSmsText(MjonMsgVO mjonMsgVO) { - String smsTxt = mjonMsgVO.getSmsTxt(); - String reserveYn = safeGetString(mjonMsgVO.getReserveYn()); - String delayYn = safeGetString(mjonMsgVO.getDelayYn()); - String smishingYn = safeGetString(mjonMsgVO.getSmishingYn()); - - // 예약 문자와 스미싱 의심 처리 - if ("Y".equals(reserveYn)) { - smsTxt = ("Y".equals(smishingYn) || "Y".equals(delayYn)) ? "[스미싱의심][예약]" + smsTxt : "[예약]" + smsTxt; - } else if ("Y".equals(smishingYn) || "Y".equals(delayYn)) { - smsTxt = "[스미싱의심]" + smsTxt; - } - - // 그림 문자 처리 - int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0); - if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isNullOrEmpty(smsTxt)) { - smsTxt = "그림문자 " + smsTxt; - } - - return smsTxt; -} private String formatSandName(MjonMsgVO mjonMsgVO) { String userId = mjonMsgVO.getUserId(); @@ -542,7 +486,18 @@ private int parseIntOrDefault(String value, int defaultValue) { - // 전체 로직 처리 (한 번에 모든 필요한 정보 반환) + /** + * @methodName : processUserAndCheckSms + * @author : 이호영 + * @date : 2025. 3. 25. + * @description : SMS 알림 전체 로직 처리 (한 번에 모든 필요한 정보 반환) + * @return : boolean + * @param mjonMsgVO + * @param userId + * @return + * @throws Exception + * + */ public boolean processUserAndCheckSms(MjonMsgVO mjonMsgVO, String userId) throws Exception { UserManageVO userManageVO = getUserManageInfo(userId); @@ -556,11 +511,41 @@ private int parseIntOrDefault(String value, int defaultValue) { mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정 // 스미싱 알림 처리 - return handleSmishingAlert(mjonMsgVO); // 알림 처리 결과 반환 + return handleSmishingAlert(); // 알림 처리 결과 반환 } return false; // 알림 처리되지 않음 } + + /** + * @methodName : processUserAndCheckAT + * @author : 이호영 + * @date : 2025. 3. 25. + * @description : SMS 알림 전체 로직 처리 (한 번에 모든 필요한 정보 반환) + * @return : boolean + * @param mjonMsgVO + * @param userId + * @return + * @throws Exception + * + */ + public boolean processUserAndCheckAT(KakaoVO kakaoVO) throws Exception { + UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId()); + + // 기본값 처리된 사용자 정보와 문자 상태 + String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); + String atSmishingYn = userManageVO.getAtSmishingYn(); + + // 조건 체크 + if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) { + kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정 + + // 스미싱 알림 처리 + return handleSmishingAlert(); // 알림 처리 결과 반환 + } + + return false; // 알림 처리되지 않음 + } // 사용자 정보 조회 및 기본값 처리 public UserManageVO getUserManageInfo(String userId) throws Exception { @@ -572,18 +557,28 @@ private int parseIntOrDefault(String value, int defaultValue) { } // 스미싱 알림 처리 - public boolean handleSmishingAlert(MjonMsgVO mjonMsgVO) throws Exception { + public boolean handleSmishingAlert() throws Exception { + /** + * MJ_MBER_SETTING => 기본 시스템 알림 여부 + * 슬랙 Y + * 야간스미싱알림 Y + * 등등 + * + */ JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); +/** @시스템 설정에 야간스미싱 알림 || 슬랙알림이 N이면 false*/ if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) || !"Y".equals(joinSettingVO.getSlackNoti())) { return false; // 알림 조건 미충족 } - // 알림 조건 충족 시 추가 작업 +/** @MJ_SPAMPASS_ALARM : 현재 활성화된 알림 SELECT */ List alarmList = getAlarmSettings(); +/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */ List holidayList = getHolidayList(); - boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus(alarmList, holidayList); +/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */ + boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus_advc(alarmList, holidayList); return !isNotificationAllowed; // 알림 발송 조건 미충족 } @@ -699,9 +694,55 @@ private int parseIntOrDefault(String value, int defaultValue) { + public List getNextCustomMsgCId (int cnt) throws FdlException { + + List idList = idgenMsgCId.getNextStringId(cnt); + return idList; + + } - + /** + * @methodName : getSmsTxtBytes + * @author : 이호영 + * @date : 2024.09.23 + * @description : sms 텍스트 바이트 계산 후 return; + * @param smsTxt + * @return + * @throws UnsupportedEncodingException + */ + public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException { //문자열 길이 체크 해주기 + int smsBytes = 0; + //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산 + String charset = "euc-kr"; + if(org.apache.commons.lang3.StringUtils.isNotEmpty(smsTxt)) { + String smsCont = smsTxt.replace("\r\n", "\n"); + smsBytes = smsCont.getBytes(charset).length; + } +// log.info(" + smsBytes :: [{}]", smsBytes); + return smsBytes; + } + + + /** + * @methodName : replaceTemplateVariables + * @author : 이호영 + * @date : 2025. 3. 12. + * @description : 헬퍼 메서드: 템플릿 변수 치환 + * @return : String + * @param content + * @param variables + * @return + */ + public static String ATReplaceTemplateVariables(String content, Map variables) { + String result = content; + for (Map.Entry entry : variables.entrySet()) { + String placeholder = entry.getKey(); + String value = entry.getValue(); + result = result.replace(placeholder, value); + } + return result; + } diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java b/src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java index 71f24e95..e2dfc815 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java @@ -231,4 +231,71 @@ public class MjonHolidayApi { return smishingAlarmPassSts; } + /** + * @methodName : getHolidaySmishingPassStatus_advc + * @author : 이호영 + * @date : 2025. 3. 19. + * @description : getHolidaySmishingPassStatus 개선 버전 + * @return : boolean + * @param resultAlarmList + * @param resultHolidayList + * @return + * @throws Exception + * + */ + public boolean getHolidaySmishingPassStatus_advc(List alarmList, List holidayList) throws Exception{ + + Date now = new Date(); // 현재 시스템 시간 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 날짜-시간 포맷 (예: 2025-03-18 14:30) + + // 현재 날짜와 요일 계산 + Calendar cal = Calendar.getInstance(); + cal.setTime(now); + int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1(일요일) ~ 7(토요일) + // 오늘 날짜를 "yyyy-MM-dd" 형식으로 포맷팅 (mj_holiday.HOLIDAY_DATE와 비교용) + String today = String.format("%d-%02d-%02d", + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH) + 1, // Calendar.MONTH는 0부터 시작하므로 +1 + cal.get(Calendar.DATE)); + + // 공휴일 여부 확인 + // mj_holiday 테이블의 HOLIDAY_DATE와 오늘 날짜가 일치하는지 체크 + // HOLIDAY_DATE는 'yyyy-MM-dd' 형식으로 저장됨 (예: '2025-01-01') + boolean isHoliday = holidayList.stream() + .anyMatch(holiday -> today.equals(holiday.getHolidayDate())); + + // 알람 설정 순회 + // alarmList는 MsgAlarmSetVO 객체의 리스트로, 알람 타입과 시작/종료 시간을 포함 + for (MsgAlarmSetVO alarm : alarmList) { + String alarmType = alarm.getAlarmType(); // 알람 유형: 'W'(평일), 'E'(주말), 'H'(공휴일) + // 오늘 날짜에 알람 시작/종료 시간을 붙여 Date 객체로 변환 + Date start = sdf.parse(today + " " + alarm.getAlarmStart()); // 예: "2025-03-18 09:00" + Date end = sdf.parse(today + " " + alarm.getAlarmEnd()); // 예: "2025-03-18 18:00" + + // 현재 시간이 알람 시작~종료 시간 범위 내에 있는지 확인 + boolean isWithinTime = now.after(start) && now.before(end); + if (!isWithinTime) continue; // 시간 범위 밖이면 다음 알람으로 + + // 평일 체크 (월~금: dayOfWeek 2~6) + // alarmType 'W'는 평일에만 적용 + if (dayOfWeek > 1 && dayOfWeek < 7 && alarmType.equals("W")) { + return true; // 평일이고, 시간이 맞고, 타입이 'W'면 스미싱 알람 통과 + } + // 주말 체크 (일:1, 토:7) + // alarmType 'E'는 주말에만 적용 + else if ((dayOfWeek == 1 || dayOfWeek == 7) && alarmType.equals("E")) { + return true; // 주말이고, 시간이 맞고, 타입이 'E'면 스미싱 알람 통과 + } + // 공휴일 체크 + // alarmType 'H'는 mj_holiday에 등록된 공휴일에 적용 + // HOLIDAY_TYPE(1:법정, 2:임시, 3:기타)과 관계없이 날짜만 확인 + else if (isHoliday && alarmType.equals("H")) { + return true; // 공휴일이고, 시간이 맞고, 타입이 'H'면 스미싱 알람 통과 + } + } + + // 모든 조건에 부합하지 않으면 false 반환 (스미싱 알람 비활성화) + return false; + } + } diff --git a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java index 809414c0..0e93135a 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -7,12 +7,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import itn.com.cmm.ComDefaultVO; import itn.com.cmm.MjonMsgSendVO; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @JsonIgnoreProperties(ignoreUnknown = true) @Getter @Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MjonMsgVO extends ComDefaultVO{ private static final long serialVersionUID = 1L; @@ -34,6 +40,7 @@ public class MjonMsgVO extends ComDefaultVO{ private String[] callToList; // '수신번호리스트', private String callFrom; // '발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)', private String subject; // 'MMS용 메시지제목', + private String subjectChkYn; // 'MMS용 메시지제목', private String smsTxt; // 'SMS용 메시지본문', private String smsTxtArea;//문자 작성 화면 본문 내용 private String msgType; // '메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)', diff --git a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java index e4704a72..09d9aa28 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java +++ b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java @@ -28,6 +28,7 @@ public class MjonMsgDataVO extends UserDefaultVO{ private List msgIdList; private List msgSeqList; private String subject; + private String subjectChkYn; private String mmsSubject; private String smsTxt; private String smsLen; diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index a3f1ac0d..efade919 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -4061,7 +4061,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M System.out.println("================================"); // 스팸 및 스미싱 의심이면 slack 알림 - boolean isHolidayNotified = mjonCommon.handleSmishingAlert(mjonMsgVO); + boolean isHolidayNotified = mjonCommon.handleSmishingAlert(); // 스팸관련 키워드 select @@ -4095,7 +4095,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M MsgSendUtils.setPriceforVO(mjonMsgVO, mjonMsgSendVOList, sysJoinSetVO, mberManageVO); // msg_id 대량 생성 - List idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size()); + +// List idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size()); + List idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size()); for (int i = 0; i < mjonMsgSendVOList.size(); i++) { mjonMsgSendVOList.get(i).setMsgId(idList.get(i)); } @@ -4136,7 +4138,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M int instTotalCnt = 0; // Step 2: 그룹화 된 데이터를 그룹별로 insert 처리 for (Map.Entry> entry : priceGroupedMessages.entrySet()) { - String price = entry.getKey(); // 가격 (String) List groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 // msgGroupId 생성 @@ -4150,6 +4151,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M instTotalCnt += instCnt; this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList); + log.info(" :: group data insert :: "); // 금액 및 포인트 insert priceAndPoint.insertCashAndPoint( @@ -4171,7 +4173,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 수신거부 목록 업데이트 // returnMap.put("resultSts", instCnt); - log.debug("가격 [{}]의 총 갯수: [{}]", price, groupedMsgList.size()); + log.debug("가격 [{}]의 총 갯수: [{}]", entry.getKey(), groupedMsgList.size()); } diff --git a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java index 79b24d41..de13ab68 100644 --- a/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java +++ b/src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java @@ -114,8 +114,9 @@ import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.UserManageVO; import itn.let.utl.sim.service.EgovClntInfo; +import lombok.extern.slf4j.Slf4j; - +@Slf4j @Controller public class MjonMsgDataController { @@ -816,6 +817,7 @@ public class MjonMsgDataController { mjonMsgDataVO.setMsgSeqList(tempList); + log.info("==================================================="); List resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO); //문자발송 이미지 처리 - 사용하지 않아서 주석처리함. @@ -2088,16 +2090,8 @@ public class MjonMsgDataController { } - long startTime = System.currentTimeMillis(); // 시작 시간 측정 - List resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO); - long endTime = System.currentTimeMillis(); // 종료 시간 측정 - - long elapsedTime = endTime - startTime; // 소요 시간 계산 - System.out.println("소요 시간: " + elapsedTime + " 밀리초"); - - modelAndView.addObject("resultAddrList", resultAddrList); modelAndView.addObject("result", "success"); @@ -5961,7 +5955,6 @@ public class MjonMsgDataController { * 발송관리 엑셀다운로드 기능 * @param searchVO * @param model - * @return "/web/mjon/msgsent/msgSentExcelDownLoadAjax.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgdata/recieveCallToListExcelDownAjax.do"}) diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java new file mode 100644 index 00000000..403de3c8 --- /dev/null +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java @@ -0,0 +1,64 @@ +package itn.let.mjo.msgsent.service; + +import java.util.List; + +import itn.let.cmm.vo.FileInfoVO; +import itn.let.uss.umt.service.UserDefaultVO; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MjonMsgDetailSentVO extends UserDefaultVO{ + + private static final long serialVersionUID = 1L; + + + private String msgGroupId; + private String reqDate; + private String regDate; + private String msgGroupCnt; + private String reserveYn; + private String reserveCYn; + private String canceldate; + private String callFrom; + private String userId; + private String smsTxt; + private String subject; + private String subjectChkYn; + private String msgType; + private String fileCnt; + private String msgKind; + private String eachPrice; + private String sentDate; + private String filePath1; + private String filePath2; + private String filePath3; + + private String callTo; + private String statusTxt; + private String addrNm; + + + private String resultSValue; + private String resultFValue; + private String resultWValue; + + private String successPct; + private String failedPct; + private String waitingPct; + + + + + + private String statusCd; // 진행상태 코드 + private String divideYN; + private String divideText; + private int diffMin; + private String totPrice; + + + // FileInfo 리스트 필드 추가 + private List fileInfos; +} diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java new file mode 100644 index 00000000..7cafbab5 --- /dev/null +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java @@ -0,0 +1,33 @@ +package itn.let.mjo.msgsent.service; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * + * @author : 이호영 + * @fileName : MjonMsgSWFDTO.java + * @date : 2025.01.16 + * @description : 그룹ID로 성공 실패 대기 건수를 구해서 전달해주는 DTO + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2025.01.16 이호영 최초 생성 + * + * + * + */ +@Getter +@Setter +public class MjonMsgSWFDTO implements Serializable { + + private static final long serialVersionUID = 1L; // 선언 + + private int resultSValue; // 성공건수 + private int resultFValue; // 실패건수 + private int resultWValue; // 대기건수 + private String divideYN; // 분할여부 + +} diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java index c0d73343..ca2dbe0f 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java @@ -1,6 +1,10 @@ package itn.let.mjo.msgsent.service; +import java.io.IOException; import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO; @@ -16,6 +20,8 @@ public interface MjonMsgSentService { //발송 관리 전체 발송 리스트 불러오기 public List selectAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) throws Exception; + public Map selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception; + //발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전 public List selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception; @@ -54,5 +60,14 @@ public interface MjonMsgSentService { //첨부파일 정보 불러오기 public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception; + + public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO); + + public Map selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception; + + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO); + + public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws IOException, Exception; + } diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java index f7478240..1e412147 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java @@ -4,7 +4,17 @@ import java.util.Date; import java.util.List; import itn.let.uss.umt.service.UserDefaultVO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MjonMsgSentVO extends UserDefaultVO{ private static final long serialVersionUID = 1L; @@ -16,8 +26,9 @@ public class MjonMsgSentVO extends UserDefaultVO{ private List msgGroupIdList; //문자 그룹아이디 리스트 private String smsTxt; //문자 내용 private String subject; //문자 제목 - private Date regdate; //문자 등록일자 - private Date reqdate; //문자 예약 발송 일자 + private String subjectChkYn; //문자 제목 + private String regDate; //문자 등록일자 + private String reqDate; //문자 예약 발송 일자 private String callFrom; //발신번호 private String callTo; //수신자 번호 private List callToList; //수신자 번호 리스트 @@ -86,399 +97,16 @@ public class MjonMsgSentVO extends UserDefaultVO{ private String successCount; private String resultSValue; + private String resultFValue; + private String resultWValue; private String resultWFValue; - public String getSuccessCount() { - return successCount; - } - public void setSuccessCount(String successCount) { - this.successCount = successCount; - } - public String getMsgSentType() { - return msgSentType; - } - public void setMsgSentType(String msgSentType) { - this.msgSentType = msgSentType; - } - public String getCallFromComma() { - return callFromComma; - } - public void setCallFromComma(String callFromComma) { - this.callFromComma = callFromComma; - } - public String getCallToComma() { - return callToComma; - } - public void setCallToComma(String callToComma) { - this.callToComma = callToComma; - } + private String divideYN; // 분할여부 - public String getAtchFiles() { - return atchFiles; - } - public void setAtchFiles(String atchFiles) { - this.atchFiles = atchFiles; - } + private String statusCd; // 진행상태 코드 - public String getMsgId() { - return msgId; - } - public void setMsgId(String msgId) { - this.msgId = msgId; - } - public int getSuccessCnt() { - return successCnt; - } - public void setSuccessCnt(int successCnt) { - this.successCnt = successCnt; - } - public String getMsgTypeName() { - return msgTypeName; - } - public void setMsgTypeName(String msgTypeName) { - this.msgTypeName = msgTypeName; - } - public int getOrderByCode() { - return orderByCode; - } - public void setOrderByCode(int orderByCode) { - this.orderByCode = orderByCode; - } - public String getAtchFileId() { - return atchFileId; - } - public void setAtchFileId(String atchFileId) { - this.atchFileId = atchFileId; - } - public String getFileSn() { - return fileSn; - } - public void setFileSn(String fileSn) { - this.fileSn = fileSn; - } - public String getUserId() { - return userId; - } - public void setUserId(String userId) { - this.userId = userId; - } - public String getAddrNm() { - return addrNm; - } - public void setAddrNm(String addrNm) { - this.addrNm = addrNm; - } - public String getMsgSeq() { - return msgSeq; - } - public void setMsgSeq(String msgSeq) { - this.msgSeq = msgSeq; - } - public String getMsgGroupId() { - return msgGroupId; - } - public void setMsgGroupId(String msgGroupId) { - this.msgGroupId = msgGroupId; - } - public List getMsgGroupIdList() { - return msgGroupIdList; - } - public void setMsgGroupIdList(List msgGroupIdList) { - this.msgGroupIdList = msgGroupIdList; - } - public String getSmsTxt() { - return smsTxt; - } - public void setSmsTxt(String smsTxt) { - this.smsTxt = smsTxt; - } - public String getSubject() { - return subject; - } - public void setSubject(String subject) { - this.subject = subject; - } - public Date getRegdate() { - return regdate; - } - public void setRegdate(Date regdate) { - this.regdate = regdate; - } - public Date getReqdate() { - return reqdate; - } - public void setReqdate(Date reqdate) { - this.reqdate = reqdate; - } - public String getCallFrom() { - return callFrom; - } - public void setCallFrom(String callFrom) { - this.callFrom = callFrom; - } - public String getCallTo() { - return callTo; - } - public void setCallTo(String callTo) { - this.callTo = callTo; - } - public List getCallToList() { - return callToList; - } - public void setCallToList(List callToList) { - this.callToList = callToList; - } - public String getTotPrice() { - return totPrice; - } - public void setTotPrice(String totPrice) { - this.totPrice = totPrice; - } - public String getEachPrice() { - return eachPrice; - } - public void setEachPrice(String eachPrice) { - this.eachPrice = eachPrice; - } - public String getDelFlag() { - return delFlag; - } - public void setDelFlag(String delFlag) { - this.delFlag = delFlag; - } - public String getTotMsgPrice() { - return totMsgPrice; - } - public void setTotMsgPrice(String totMsgPrice) { - this.totMsgPrice = totMsgPrice; - } - public String getRsltCode() { - return rsltCode; - } - public void setRsltCode(String rsltCode) { - this.rsltCode = rsltCode; - } - public String getRsltCode2() { - return rsltCode2; - } - public void setRsltCode2(String rsltCode2) { - this.rsltCode2 = rsltCode2; - } - public String getMsgType() { - return msgType; - } - public void setMsgType(String msgType) { - this.msgType = msgType; - } - public String getMsgGroupCnt() { - return msgGroupCnt; - } - public void setMsgGroupCnt(String msgGroupCnt) { - this.msgGroupCnt = msgGroupCnt; - } - public String getFileCnt() { - return fileCnt; - } - public void setFileCnt(String fileCnt) { - this.fileCnt = fileCnt; - } - public String getTotMsgCnt() { - return totMsgCnt; - } - public void setTotMsgCnt(String totMsgCnt) { - this.totMsgCnt = totMsgCnt; - } - public String getCurState() { - return curState; - } - public void setCurState(String curState) { - this.curState = curState; - } - public String getReserveYn() { - return reserveYn; - } - public void setReserveYn(String reserveYn) { - this.reserveYn = reserveYn; - } - public String getReserveCYn() { - return reserveCYn; - } - public void setReserveCYn(String reserveCYn) { - this.reserveCYn = reserveCYn; - } - public String getFilePath1() { - return filePath1; - } - public void setFilePath1(String filePath1) { - this.filePath1 = filePath1; - } - public String getFilePath2() { - return filePath2; - } - public void setFilePath2(String filePath2) { - this.filePath2 = filePath2; - } - public String getFilePath3() { - return filePath3; - } - public void setFilePath3(String filePath3) { - this.filePath3 = filePath3; - } - public Date getSentDate() { - return sentDate; - } - public void setSentDate(Date sentDate) { - this.sentDate = sentDate; - } - public String getAgentCode() { - return agentCode; - } - public void setAgentCode(String agentCode) { - this.agentCode = agentCode; - } - public String getUserData() { - return userData; - } - public void setUserData(String userData) { - this.userData = userData; - } - public List getUserDataList() { - return userDataList; - } - public void setUserDataList(List userDataList) { - this.userDataList = userDataList; - } - public Date getCancelDate() { - return cancelDate; - } - public void setCancelDate(Date cancelDate) { - this.cancelDate = cancelDate; - } - public String getStartDate() { - return startDate; - } - public void setStartDate(String startDate) { - this.startDate = startDate; - } - public String getEndDate() { - return endDate; - } - public void setEndDate(String endDate) { - this.endDate = endDate; - } - public String getSearchMsgType() { - return searchMsgType; - } - public void setSearchMsgType(String searchMsgType) { - this.searchMsgType = searchMsgType; - } - public String getTabType() { - return tabType; - } - public void setTabType(String tabType) { - this.tabType = tabType; - } - public String getStateType() { - return stateType; - } - public void setStateType(String stateType) { - this.stateType = stateType; - } - public String getListType() { - return listType; - } - public void setListType(String listType) { - this.listType = listType; - } - public String getResultType() { - return resultType; - } - public void setResultType(String resultType) { - this.resultType = resultType; - } - public String getMsgResultCnt() { - return msgResultCnt; - } - public void setMsgResultCnt(String msgResultCnt) { - this.msgResultCnt = msgResultCnt; - } - public String getMsgResultSts() { - return msgResultSts; - } - public void setMsgResultSts(String msgResultSts) { - this.msgResultSts = msgResultSts; - } - public String getAddrGrpNm() { - return addrGrpNm; - } - public void setAddrGrpNm(String addrGrpNm) { - this.addrGrpNm = addrGrpNm; - } - public int getOrderByrsltCode() { - return orderByrsltCode; - } - public void setOrderByrsltCode(int orderByrsltCode) { - this.orderByrsltCode = orderByrsltCode; - } - public String getMsgResult() { - return msgResult; - } - public void setMsgResult(String msgResult) { - this.msgResult = msgResult; - } - public String getNtceBgnde() { - return ntceBgnde; - } - public void setNtceBgnde(String ntceBgnde) { - this.ntceBgnde = ntceBgnde; - } - public String getNtceEndde() { - return ntceEndde; - } - public void setNtceEndde(String ntceEndde) { - this.ntceEndde = ntceEndde; - } - public String getMsgKind() { - return msgKind; - } - public void setMsgKind(String msgKind) { - this.msgKind = msgKind; - } - public String getDelayYn() { - return delayYn; - } - public void setDelayYn(String delayYn) { - this.delayYn = delayYn; - } - public String getDelayCompleteYn() { - return delayCompleteYn; - } - public void setDelayCompleteYn(String delayCompleteYn) { - this.delayCompleteYn = delayCompleteYn; - } - public String getSendKind() { - return sendKind; - } - public void setSendKind(String sendKind) { - this.sendKind = sendKind; - } - public String getResultSValue() { - return resultSValue; - } - public void setResultSValue(String resultSValue) { - this.resultSValue = resultSValue; - } - public String getResultWFValue() { - return resultWFValue; - } - public void setResultWFValue(String resultWFValue) { - this.resultWFValue = resultWFValue; - } - public Date getDelayOrgTime() { - return delayOrgTime; - } - public void setDelayOrgTime(Date delayOrgTime) { - this.delayOrgTime = delayOrgTime; - } + // 결과 리스트 select 할 떄 + // TIMESTAMPDIFF(minute, DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin + private int diffMin; } diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java index bb43a7f0..7e1e84ae 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java @@ -9,6 +9,8 @@ import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.block.service.MjonBlockVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; +import itn.let.mjo.msgsent.service.MjonMsgSWFDTO; import itn.let.mjo.msgsent.service.MjonMsgSentVO; @Repository("MjonMsgSentDAO") @@ -56,6 +58,13 @@ public class MjonMsgSentDAO extends EgovAbstractDAO { return (List) list("MjonMsgSentDAO.selectAllMsgSentList",mjonMsgSentVO); } + //발송 관리 전체 발송 리스트 불러오기 + @SuppressWarnings("unchecked") + public List selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{ + + return (List) list("MjonMsgSentDAO.selectAllMsgSentList_advc",mjonMsgSentVO); + } + //발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전 @SuppressWarnings("unchecked") public List selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{ @@ -158,5 +167,28 @@ public class MjonMsgSentDAO extends EgovAbstractDAO { public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception{ return (MjonMsgSentVO) select("MjonMsgSentDAO.selectFileInfo", streFileId); } + + public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) { + return (Integer)select("MjonMsgSentDAO.countAllMsgSentList", mjonMsgSentVO); + } + + public MjonMsgSWFDTO findBySWF(String msgGroupId) { + + return (MjonMsgSWFDTO) select("MjonMsgSentDAO.findBySWF", msgGroupId); + } + + public MjonMsgDetailSentVO selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) { + // TODO Auto-generated method stub + return (MjonMsgDetailSentVO) select("MjonMsgSentDAO.selectAllMsgSentDetailView", mjonMsgDetailSentVO); + } + + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { + + return (List) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO); + } + + public List findByReqDateWhereMsgGroupId(String msgGroupId) { + return (List) list("MjonMsgSentDAO.findByReqDateWhereMsgGroupId", msgGroupId); + } } diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java index f142d639..60105a6e 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java @@ -1,20 +1,51 @@ package itn.let.mjo.msgsent.service.impl; +import java.io.OutputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.idgnr.EgovIdGnrService; +import itn.com.cmm.util.StringUtil2; +import itn.let.cmm.vo.FileInfoVO; import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.block.service.MjonBlockVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; +import itn.let.mjo.msgsent.service.MjonMsgSWFDTO; import itn.let.mjo.msgsent.service.MjonMsgSentService; import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service("MjonMsgSentService") public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements MjonMsgSentService{ @@ -84,6 +115,204 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements return resultList; } + /** + * advc + * 이호영 20250121 + * 발송 관리 전체 발송 리스트 불러오기 + */ + public Map selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{ + + + Map resultMap = new HashMap(); + + // 목록 + List resultList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO); + + + // groupID에 대한 결과건수(대기, 성공 실패) 분할건수를 가져옴 + resultList = makeDetailFunction(resultList); + + /* + * 진행상태 코드화 + * */ + resultList.stream().forEach(t->{ + String code = getStatusCode(t); + t.setStatusCd(code); + }); + + + resultList.stream().forEach(t->{ + + // 내용이 없고 이미지만 있을 경우 + // 내용에 "이미지"표시 + if("6".equals(t.getMsgType()) + && StringUtils.isEmpty(t.getSmsTxt()) + && !"0".equals(t.getFileCnt()) + ) { + t.setSmsTxt("이미지"); + } + + // 예약 취소일 시 대기건도 0으로 표시 + if( t.getReserveCYn().equals(("Y")) ) { + t.setResultSValue("0"); + t.setResultFValue("0"); + t.setResultWValue("0"); + } + }); + + + + + // 총 카운트 + int totalCnt = mjonMsgSentDAO.countAllMsgSentList(mjonMsgSentVO); + resultMap.put("resultList", resultList); + resultMap.put("totalCnt", totalCnt); + + + return resultMap; + } + + + + public Map selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception{ + + Map resultMap = new HashMap(); + + // 목록 + MjonMsgDetailSentVO resultVO = mjonMsgSentDAO.selectAllMsgSentDetailView(mjonMsgDetailSentVO); + + log.info(" + :: [{}]", resultVO.getSmsTxt()); + + + // 성공 대기 실패 발송금액 분할여부 + MjonMsgSentVO updatedVO = getDetailFunction(resultVO.getMsgGroupId(), resultVO.getEachPrice()); + resultVO.setResultSValue(updatedVO.getResultSValue()); // 성공건수 + resultVO.setResultWValue(updatedVO.getResultWValue()); // 대기건수 + resultVO.setResultFValue(updatedVO.getResultFValue()); // 실패건수 + resultVO.setTotPrice(updatedVO.getTotPrice()); // 총 발송 금액 (성공건수 * 개별금액) + resultVO.setDivideYN(updatedVO.getDivideYN()); // 분할 여부 + + + // 퍼센트 계산 실행 + Map returnMap = calculatePercentages(resultVO); + resultVO.setSuccessPct(returnMap.get("successPct")); + resultVO.setWaitingPct(returnMap.get("waitingPct")); + resultVO.setFailedPct(returnMap.get("failedPct")); + + + // 진행상태 코드화 + String statusCode = getStatusCode(MjonMsgSentVO.builder() + .reserveCYn(resultVO.getReserveCYn()) + .reserveYn(resultVO.getReserveYn()) + .msgGroupCnt(resultVO.getMsgGroupCnt()) + .resultSValue(resultVO.getResultSValue()) + .resultWValue(resultVO.getResultWValue()) + .resultFValue(resultVO.getResultFValue()) + .diffMin(resultVO.getDiffMin()) + .build()); + + resultVO.setStatusCd(statusCode); + + // 결과 출력 +// log.info("성공률: [{}]", returnMap.get("successPct")); +// log.info("대기율: [{}]", returnMap.get("waitingPct")); +// log.info("실패율: [{}]", returnMap.get("failedPct")); + + + // 광고일떄 (광고)와 줄바꿈+무료거부 0808800858 삭제 + if("A".equals(resultVO.getMsgKind())) { + resultVO.setSmsTxt(resultVO.getSmsTxt().replace("(광고)", "") + .replaceAll("\\s*무료거부 0808800858", "")); + } + + // 그림문자일 경우 그림정보 가져오기 + if(StringUtils.isNotEmpty(resultVO.getFileCnt()) && Integer.parseInt(resultVO.getFileCnt()) > 0) + { + List fileInfos = getFileInfo(resultVO); + resultVO.setFileInfos(fileInfos); + } + + // 분할문자인 경우 + if("Y".equals(resultVO.getDivideYN())) { + String divideText = calculateBatchInfo(resultVO); + resultVO.setDivideText(divideText); + } + + + + + resultMap.put("result", resultVO); + + return resultMap; + } + + + private String calculateBatchInfo(MjonMsgDetailSentVO resultVO) { + + String msgGroupId = resultVO.getMsgGroupId(); + + + List requestTimes = mjonMsgSentDAO.findByReqDateWhereMsgGroupId(msgGroupId); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); + Map timeCountMap = new LinkedHashMap<>(); + + // REQ_DATE 그룹화 (같은 시간대 몇 건인지) + for (String timeStr : requestTimes) { + LocalDateTime time = LocalDateTime.parse(timeStr, formatter); + timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1); + } + + // 가장 첫 번째 시간 & 간격 계산 + List sortedKeys = new ArrayList<>(timeCountMap.keySet()); + if (sortedKeys.size() < 2) { + return "데이터 부족 (분석 불가)"; + } + + int batchSize = timeCountMap.get(sortedKeys.get(0)); // 한 번에 보낸 건수 + int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산 +// int batchCount = sortedKeys.size(); // 총 몇 번 보냈는지 + +// return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount); + return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes); + + } + + private List getFileInfo(MjonMsgDetailSentVO result) throws Exception { + + + List fileInfos = new ArrayList<>(); + + // 파일 경로 필드들을 배열로 관리 + String[] filePaths = { result.getFilePath1(), result.getFilePath2(), result.getFilePath3() }; + + for (String filePath : filePaths) { + if (filePath != null) { + // 파일 ID 추출 + + // 확장자 제외한 파일명 + String fileId = FilenameUtils.getBaseName(filePath); + + // 파일 정보 조회 + MjonMsgSentVO info = mjonMsgSentDAO.selectFileInfo(fileId); + + // FileInfo 객체 생성 및 추가 + FileInfoVO fileInfo = new FileInfoVO(); + fileInfo.setAtchFileId(info.getAtchFileId()); + fileInfo.setFileSn(info.getFileSn()); + + fileInfos.add(fileInfo); + } + } + return fileInfos; + + } + + @Override + public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) { + return mjonMsgSentDAO.countAllMsgSentList(mjonMsgSentVO); + } + //발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전 public List selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{ List resultList = new ArrayList(); @@ -243,4 +472,384 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception { return mjonMsgSentDAO.selectFileInfo(streFileId); } + + @Override + public List findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) { + + List list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO); + list.stream().forEach(t->{ + t.setCallTo(StringUtil2.formatPhone(t.getCallTo())); + }); + + return list; + } + + public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws Exception{ + + + mjonMsgSentVO.setRecordCountPerPage(100000); + mjonMsgSentVO.setFirstIndex(0); + + if(StringUtils.isEmpty(mjonMsgSentVO.getSearchSortOrd())) { + mjonMsgSentVO.setSearchSortOrd("desc"); + mjonMsgSentVO.setSearchSortCnd("B.REQ_DATE"); + } + + //예약 관리 리스트 불러오기 + List resultAllSentList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO); + +// long startTime = System.nanoTime(); // 시작 시간 측정 + resultAllSentList = makeDetailFunction(resultAllSentList); +// long endTime = System.nanoTime(); // 끝난 시간 측정 +// double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0; +// System.out.println("Execution time: " + executionTimeInSeconds + " seconds"); + + SXSSFWorkbook workbook = null; // SXSSFWorkbook 변수 선언 + try{ + + + // Workbook 생성 + workbook = new SXSSFWorkbook(); + Sheet sheet = workbook.createSheet("발송 내역"); + + // 열 너비 설정 + sheet.setColumnWidth(0, 3000); // 번호 열 + sheet.setColumnWidth(1, 4000); // 발송일시 열 + sheet.setColumnWidth(2, 5000); // 구분 열 + sheet.setColumnWidth(3, 3000); // 형태 열 + sheet.setColumnWidth(4, 10000); // 내용 열 + sheet.setColumnWidth(5, 4000); // 발송건수 열 + sheet.setColumnWidth(6, 3000); // 대기 열 + sheet.setColumnWidth(7, 3000); // 성공 열 + sheet.setColumnWidth(8, 3000); // 실패 열 + sheet.setColumnWidth(9, 4000); // 금액 열 + sheet.setColumnWidth(10, 5000); // 진행상황 열 + + // 헤더 스타일 설정 + CellStyle headerStyle = workbook.createCellStyle(); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + headerStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + + Font font = workbook.createFont(); + font.setBold(true); // 글씨체 굵게 + font.setFontHeightInPoints((short) 12); // 글씨 크기 + headerStyle.setFont(font); + + // 데이터 스타일 설정 (가운데 정렬) + CellStyle centerStyle = workbook.createCellStyle(); + centerStyle.setAlignment(HorizontalAlignment.CENTER); + centerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + centerStyle.setBorderTop(BorderStyle.THIN); + centerStyle.setBorderBottom(BorderStyle.THIN); + centerStyle.setBorderLeft(BorderStyle.THIN); + centerStyle.setBorderRight(BorderStyle.THIN); + centerStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + centerStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + centerStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + centerStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + + // 첫 번째 헤더 작성 (상단 병합) + Row headerRow = sheet.createRow(0); + + // 번호 열 추가 + Cell cell = headerRow.createCell(0); + cell.setCellValue("번호"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 번호 병합 + + // 구분 열 추가 + cell = headerRow.createCell(1); + cell.setCellValue("발송일시"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1)); // 구분 병합 + + cell = headerRow.createCell(2); + cell.setCellValue("구분"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 2, 2)); // 발송일시 병합 + + cell = headerRow.createCell(3); + cell.setCellValue("형태"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 3, 3)); // 형태 병합 + + cell = headerRow.createCell(4); + cell.setCellValue("내용"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 4, 4)); // 내용 병합 + + cell = headerRow.createCell(5); + cell.setCellValue("발송건수"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 5, 5)); // 발송건수 병합 + + cell = headerRow.createCell(6); + cell.setCellValue("결과"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 0, 6, 8)); // 결과 병합 + + cell = headerRow.createCell(9); + cell.setCellValue("금액(원)"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 9, 9)); // 금액(원) 병합 + + cell = headerRow.createCell(10); + cell.setCellValue("진행상황"); + cell.setCellStyle(headerStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 1, 10, 10)); // 진행상황 병합 + + // 두 번째 헤더 작성 (결과 하위 열) + Row subHeaderRow = sheet.createRow(1); + + String[] subHeaders = {"대기", "성공", "실패"}; + for (int i = 0; i < subHeaders.length; i++) { + cell = subHeaderRow.createCell(6 + i); // 결과 열 시작점(6번 열)부터 순차적으로 설정 + cell.setCellValue(subHeaders[i]); + cell.setCellStyle(headerStyle); + } + + // 샘플 데이터 추가 + // Object[][] data = { + // {1, "2025-01-23 12:00", "web", "SMS", "테스트 메시지입니다.", 139, 1, 0, 12, "-", "진행중"} + // }; + + + + + // Object[][]로 변환 + Object[][] data = new Object[resultAllSentList.size()][11]; // 11은 필드 수 + + for (int i = 0; i < resultAllSentList.size(); i++) { + MjonMsgSentVO vo = resultAllSentList.get(i); + data[i][0] = i+1; + data[i][1] = vo.getReqDate(); +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// data[i][1] = sdf.format(vo.getReqDate()); + + +// log.info("엑셀에 넣을 데이터: [{}]", data[i][1]); + + data[i][2] = "H".equals(vo.getSendKind()) ? "WEB" : "API"; + + String msgType="단문"; + if ("6".equals(vo.getMsgType())) { + msgType = "0".equals(vo.getFileCnt()) ? "장문" : "그림"; + } + data[i][3] = msgType; + + String reserveTxt = ""; + if("Y".equals(vo.getReserveYn())) {reserveTxt="[예약]";} + if("Y".equals(vo.getDivideYN())) {reserveTxt+="[분할]";} + + data[i][4] = reserveTxt + (StringUtils.isEmpty(vo.getSmsTxt()) ? "-" : vo.getSmsTxt()); + data[i][5] = vo.getMsgGroupCnt(); + data[i][6] = vo.getResultWValue(); + data[i][7] = vo.getResultSValue(); + data[i][8] = vo.getResultFValue(); + data[i][9] = vo.getTotPrice(); + + String statusTxt="진행중"; + if ("Y".equals(vo.getReserveCYn())) { + statusTxt = "예약취소"; // 예약취소 코드 + // } else if ("Y".equals(vo.getReserveYn()) && vo.getMsgGroupCnt().equals(vo.getResultWValue())) { + // statusTxt = "예약대기"; // 예약대기 코드 ( 예약취소 버튼 노출 ) + } else if (vo.getMsgGroupCnt().equals(vo.getResultSValue()) || vo.getMsgGroupCnt().equals(vo.getResultFValue())) { + statusTxt = "완료"; // 완료 코드 + } + + + + + data[i][10] = statusTxt; + } + + + + + int rowNum = 2; // 데이터 시작 행 + for (Object[] rowData : data) { + Row row = sheet.createRow(rowNum++); + for (int col = 0; col < rowData.length; col++) { + cell = row.createCell(col); + + // "내용" 열만 제외하고 가운데 정렬 + if (col == 4) { // 내용 열 + cell.setCellValue((String) rowData[col]); + } else if (rowData[col] instanceof String) { + cell.setCellValue((String) rowData[col]); + cell.setCellStyle(centerStyle); + } else if (rowData[col] instanceof Integer) { + cell.setCellValue((Integer) rowData[col]); + cell.setCellStyle(centerStyle); + } + } + } + + // 파일 다운로드 응답 설정 + String fileName ="발송결과_리스트"; // 저장 파일명 + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd_HHmmss", Locale.KOREA ); + Date currentTime = new Date (); + String mTime = mSimpleDateFormat.format ( currentTime ); + fileName = fileName+"("+mTime+")"; + + response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + // 파일 출력 + workbook.write(response.getOutputStream()); + workbook.close(); + + } catch (Exception e) { + // 에러 처리 로직 + response.setHeader("Set-Cookie", "fileDownload=false; path=/"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Content-Type", "text/html; charset=utf-8"); + + try (OutputStream out = response.getOutputStream()) { + byte[] data = "fail..".getBytes(); + out.write(data, 0, data.length); + } catch (Exception ignore) { + ignore.printStackTrace(); + } + } finally { + if (workbook != null) { + try { + workbook.dispose(); // SXSSFWorkbook 임시 파일 제거 + workbook.close(); + } catch (Exception ignore) { + ignore.printStackTrace(); + } + } + } + + } + + + /** + * @methodName : makeDetailFunction + * @author : 이호영 + * @date : 2025.02.04 + * @description : 발송결과 성공건수, 실패건수, 대기건수, 분할발송여부, 총 발송금액 구하기 + * @param resultList + * @return + */ + private List makeDetailFunction(List resultList) { + resultList.stream().forEach(t->{ + MjonMsgSentVO updatedVO = getDetailFunction(t.getMsgGroupId(), t.getEachPrice()); + + t.setResultSValue(updatedVO.getResultSValue()); + t.setResultFValue(updatedVO.getResultFValue()); + t.setResultWValue(updatedVO.getResultWValue()); + t.setDivideYN(updatedVO.getDivideYN()); + t.setTotPrice(updatedVO.getTotPrice()); + }); + return resultList; + } + + + private MjonMsgSentVO getDetailFunction(String p_msgGroupId, String p_eachPrice) { + + + MjonMsgSentVO returnVO = new MjonMsgSentVO(); + + MjonMsgSWFDTO mjonMsgSWFDTO = mjonMsgSentDAO.findBySWF(p_msgGroupId); + returnVO.setResultSValue(String.valueOf(mjonMsgSWFDTO.getResultSValue())); // 성공건수 + returnVO.setResultFValue(String.valueOf(mjonMsgSWFDTO.getResultFValue())); // 실패건수 + returnVO.setResultWValue(String.valueOf(mjonMsgSWFDTO.getResultWValue())); // 대기건수 + returnVO.setDivideYN(mjonMsgSWFDTO.getDivideYN()); + + + // TotPrice : 성공건수에 대한 금액 곱하기 + BigDecimal eachPrice = new BigDecimal(p_eachPrice); + BigDecimal resultSValue = new BigDecimal(mjonMsgSWFDTO.getResultSValue()); + BigDecimal totalPrice = eachPrice.multiply(resultSValue); + // 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장 + // RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림 + BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP); + + // roundedTotalPrice가 0인지 확인 + // BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드 + // 결과: + // - 반환 값이 0이면 두 값이 같음 + // - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음 + // - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼 + if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) { + // roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정 + returnVO.setTotPrice("-"); + } else { + // roundedTotalPrice 값이 0이 아닌 경우 + // 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정 + // toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환 + returnVO.setTotPrice(roundedTotalPrice.toPlainString()); + } +// log.info(" + returnVO.getTotPrice() :: [{}]", returnVO.getTotPrice()); + return returnVO; + + + } + + + + private Map calculatePercentages(MjonMsgDetailSentVO result) { + int total = Integer.parseInt(result.getMsgGroupCnt()); // 전체 건수 + int success = Integer.parseInt(result.getResultSValue()); // 성공 건수 + int waiting = Integer.parseInt(result.getResultWValue()); // 대기 건수 + int failed = Integer.parseInt(result.getResultFValue()); // 실패 건수 + + // 퍼센트 계산 (0으로 나누는 경우 대비) + String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%"; + String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%"; + String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%"; + + // 결과 맵에 저장 + Map percentages = new HashMap<>(); + percentages.put("successPct", successPct); + percentages.put("waitingPct", waitingPct); + percentages.put("failedPct", failedPct); + + return percentages; + + } + + // 공통코드 ITN057에 대한 코드화 진행 + /* + * CODE_ID CODE CODE_NM CODE_DC + * ITN057 01 진행중 진행중 + * ITN057 02 완료 완료출해야함 + * ITN057 03 예약대기 예약대기(발송전) 버튼으로 노출해야함 + * ITN057 04 - 예약취소 ( - 으로 노출 ) + * */ + private String getStatusCode(MjonMsgSentVO result) { + + String returnCode; + + if ("Y".equals(result.getReserveCYn())) { + returnCode = "04"; // 예약취소 코드 + } else if ( + "Y".equals(result.getReserveYn()) + && "N".equals(result.getReserveCYn()) + && result.getMsgGroupCnt().equals(result.getResultWValue()) + && result.getDiffMin() < -5 // 예약 시간이 5분 이상인 것들만 + ) { + returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 ) + } else if (result.getMsgGroupCnt().equals(result.getResultSValue()) + || result.getMsgGroupCnt().equals(result.getResultFValue())) { + returnCode = "02"; // 완료 코드 + } else { + returnCode = "01"; // 진행중 코드 + } + + + return returnCode; + + } } diff --git a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java index 89898107..c33fe418 100644 --- a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java +++ b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java @@ -5,14 +5,17 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; @@ -22,6 +25,8 @@ import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; @@ -38,16 +43,20 @@ import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.util.DateUtils; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.user.sent.service.KakaoSentService; +import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrGroupService; import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.apikey.service.ApiKeyMngService; import itn.let.mjo.apikey.service.ApiKeyVO; +import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO; import itn.let.mjo.msgsent.service.MjonMsgSentCntVO; import itn.let.mjo.msgsent.service.MjonMsgSentService; import itn.let.mjo.msgsent.service.MjonMsgSentVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Controller public class MjonMsgSentController { @@ -99,115 +108,10 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll return "redirect:/web/user/login/login.do"; } - mjonMsgSentVO.setUserId(userId); - - /* - //전체 발송 건수 통계 불러오기 - mjonMsgSentVO.setMsgType(""); - List totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO); - model.addAttribute("totalMsgCnt", totalMsgCnt); - - //단문 성공건, 실패건 불러오기 - mjonMsgSentVO.setMsgType("4"); - List smsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO); - model.addAttribute("smsMsgCnt", smsMsgCnt); - - //장문 성공건, 실패건 불러오기 - mjonMsgSentVO.setMsgType("6"); - mjonMsgSentVO.setFileCnt("0"); - List lmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO); - model.addAttribute("lmsMsgCnt", lmsMsgCnt); - - //그림문자 성공건, 실패건 불러오기 - mjonMsgSentVO.setMsgType("6"); - mjonMsgSentVO.setFileCnt("1"); - List mmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO); - model.addAttribute("mmsMsgCnt", mmsMsgCnt); - */ - - /* - //전체 발송 건수 통계 불러오기 - mjonMsgSentVO.setMsgType(""); - List totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO); - - System.out.println("start"); - - // H:홈페이지, A:API 로 sms, lms, mms 나누는 영역 - List H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList()); - List H_smsMsgCnt = new ArrayList(); - List H_lmsMsgCnt = new ArrayList(); - List H_mmsMsgCnt = new ArrayList(); - - System.out.println("start"); - - List A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList()); - List A_smsMsgCnt = new ArrayList(); - List A_lmsMsgCnt = new ArrayList(); - List A_mmsMsgCnt = new ArrayList(); - - System.out.println(" ::H_totalMsgCnt :: "+ H_totalMsgCnt.size()); - System.out.println(" ::A_totalMsgCnt :: "+ A_totalMsgCnt.size()); - - H_totalMsgCnt.forEach(t->{ - if (Integer.parseInt(t.getFilePath1())>0) { - H_smsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath2())>0) { - H_lmsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath3())>0) { - H_mmsMsgCnt.add(t); - } - }); - - A_totalMsgCnt.forEach(t->{ - if (Integer.parseInt(t.getFilePath1())>0) { - A_smsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath2())>0) { - A_lmsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath3())>0) { - A_mmsMsgCnt.add(t); - } - }); - - - - //* 홈페이지에서 보낸 데이터 LIST - //* SEND_KIND = "H" - - // 전체 영역 - model.addAttribute("H_allSentCntVO", this.getResultCntProc(H_totalMsgCnt)); - // 전체 단문(SMS) - model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("H_mmsSentCntVO", this.getResultCntProc(H_mmsMsgCnt)); - - - - - - // * 홈페이지에서 보낸 데이터 LIST - //* SEND_KIND = "A" - - // 전체 영역 - model.addAttribute("A_allSentCntVO", this.getResultCntProc(A_totalMsgCnt)); - // 전체 단문(SMS) - model.addAttribute("A_smsSentCntVO", this.getResultCntProc(A_smsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("A_lmsSentCntVO", this.getResultCntProc(A_lmsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("A_mmsSentCntVO", this.getResultCntProc(A_mmsMsgCnt)); - */ - - - - /* - a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%') - - */ - ApiKeyVO apiKeyVO = new ApiKeyVO(); - apiKeyVO.setMberId(userId); - model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false); +// mjonMsgSentVO.setUserId(userId); +// ApiKeyVO apiKeyVO = new ApiKeyVO(); +// apiKeyVO.setMberId(userId); +// model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false); @@ -231,37 +135,67 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll } - String startDate = mjonMsgSentVO.getStartDate(); - String endDate = mjonMsgSentVO.getEndDate(); +// log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); +// log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); +// log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); +// log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); +// log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); + String startDate = mjonMsgSentVO.getSearchStartDate(); + String endDate = mjonMsgSentVO.getSearchEndDate(); - if(startDate == null && endDate == null ) { + if(StringUtils.isEmpty(startDate) + && StringUtils.isEmpty(endDate)) + { - -// -// Calendar cal = Calendar.getInstance(); -// Date now = new Date(); -// -// SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); -// -// //종료일은 오늘날짜 -// cal.setTime(now); -// endDate = format.format(cal.getTime()); -// -// //시작일은 전날로 셋팅 -// cal.add(Calendar.DATE, -1); -// startDate = format.format(cal.getTime()); - - mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3)); - mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate()); + mjonMsgSentVO.setSearchStartDate(DateUtils.getDateMonthsAgo(3)); + mjonMsgSentVO.setSearchEndDate(DateUtils.getCurrentDate()); } - + + log.info("pageIndex :: [{}]", mjonMsgSentVO.getPageIndex()); model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword()); model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); model.addAttribute("siteId", mjonMsgSentVO.getSiteId()); return "web/msgsent/MsgSentView"; } + + + /** + * 발송관리 화면 + * @param searchVO + * @param model/web/user/login/login.do + * @return "/web/mjon/msgtxt/selectMsgTxtView.do" + * @throws Exception + */ + @RequestMapping(value= {"/web/mjon/msgsent/msgSentDetailView.do"}) + public String selectMsgSentDetailView(@ModelAttribute("searchVO") MjonMsgDetailSentVO mjonMsgDetailSentVO + , ModelMap model) throws Exception{ + + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(loginVO == null) { + return "redirect:/web/user/login/login.do"; + } + + Map resultMap = mjonMsgSentService.selectAllMsgSentDetailView(mjonMsgDetailSentVO); + model.addAttribute("result", resultMap.get("result")); + + return "web/msgsent/MsgSentDetailView"; + } + + // 팩스 금일 발송통계 갱신 + @RequestMapping(value= {"/web/mjon/msgsent/findByMsgDetailListAjax.do"}) + public ResponseEntity findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception { + + + List resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO); + + + return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", resultList)); + } /** * 마이페이지 - 이용내역 - ajax @@ -275,7 +209,6 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll HttpServletRequest request, ModelMap model) throws Exception{ - System.out.println("MsgSentView_HA_allSentAjax"); LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); @@ -283,29 +216,24 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll mjonMsgSentVO.setUserId(userId); + log.info("+ mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate()); + log.info("+ mjonMsgSentVO.getSearchEndDate() :: [{}]", mjonMsgSentVO.getSearchEndDate()); //전체 발송 건수 통계 불러오기 mjonMsgSentVO.setMsgType(""); + long startTime = System.nanoTime(); // 시작 시간 측정 List totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO); + + long endTime = System.nanoTime(); // 종료 시간 측정 + double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0; + System.out.println("Execution time: " + executionTimeInSeconds + " seconds"); - System.out.println("start"); // H:홈페이지, A:API 로 sms, lms, mms 나누는 영역 - List H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList()); List H_smsMsgCnt = new ArrayList(); List H_lmsMsgCnt = new ArrayList(); List H_mmsMsgCnt = new ArrayList(); - System.out.println("start"); - - List A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList()); - List A_smsMsgCnt = new ArrayList(); - List A_lmsMsgCnt = new ArrayList(); - List A_mmsMsgCnt = new ArrayList(); - - System.out.println(" ::H_totalMsgCnt :: "+ H_totalMsgCnt.size()); - System.out.println(" ::A_totalMsgCnt :: "+ A_totalMsgCnt.size()); - - H_totalMsgCnt.forEach(t->{ + totalMsgCnt.forEach(t->{ if (Integer.parseInt(t.getFilePath1())>0) { H_smsMsgCnt.add(t); } else if (Integer.parseInt(t.getFilePath2())>0) { @@ -315,60 +243,24 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll } }); - A_totalMsgCnt.forEach(t->{ - if (Integer.parseInt(t.getFilePath1())>0) { - A_smsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath2())>0) { - A_lmsMsgCnt.add(t); - } else if (Integer.parseInt(t.getFilePath3())>0) { - A_mmsMsgCnt.add(t); - } - }); - - - //* 홈페이지에서 보낸 데이터 LIST //* SEND_KIND = "H" // 전체 영역 - model.addAttribute("H_allSentCntVO", this.getResultCntProc(H_totalMsgCnt)); + log.info("all"); + model.addAttribute("H_allSentCntVO", this.getResultCntProc(totalMsgCnt)); // 전체 단문(SMS) + log.info("sms"); model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt)); // 전체 장문(LMS) + log.info("lms"); model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt)); - // 전체 장문(LMS) + // 전체 그림(MMS) + log.info("mms"); model.addAttribute("H_mmsSentCntVO", this.getResultCntProc(H_mmsMsgCnt)); - - - // * 홈페이지에서 보낸 데이터 LIST - //* SEND_KIND = "A" - - // 전체 영역 - model.addAttribute("A_allSentCntVO", this.getResultCntProc(A_totalMsgCnt)); - // 전체 단문(SMS) - model.addAttribute("A_smsSentCntVO", this.getResultCntProc(A_smsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("A_lmsSentCntVO", this.getResultCntProc(A_lmsMsgCnt)); - // 전체 장문(LMS) - model.addAttribute("A_mmsSentCntVO", this.getResultCntProc(A_mmsMsgCnt)); - - - - - /* - a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%') - - */ - ApiKeyVO apiKeyVO = new ApiKeyVO(); - apiKeyVO.setMberId(userId); - model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false); - - - System.out.println("MsgSentView_HA_allSentAjax_end"); - return "/web/msgsent/subcontent/MsgSentView_HA_allSentAjax"; } @@ -395,14 +287,17 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll cntVO.setWaitCnt(msgCnt.stream() .filter(f->"W".equals(f.getMsgResultSts())) .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); + log.info(" :: cntVO.getWaitCnt() :: [{}]", cntVO.getWaitCnt()); // 전체 성공 갯수 cntVO.setSuccCnt(msgCnt.stream() .filter(f->"S".equals(f.getMsgResultSts())) .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); + log.info(" :: cntVO.getSuccCnt() :: [{}]", cntVO.getSuccCnt()); // 전체 실패 갯수 cntVO.setFailCnt(msgCnt.stream() .filter(f->"F".equals(f.getMsgResultSts())) .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); + log.info(" :: cntVO.getFailCnt() :: [{}]", cntVO.getFailCnt()); // 전체 갯수 구하기 cntVO.setTotCnt(cntVO.getWaitCnt() + cntVO.getSuccCnt() + cntVO.getFailCnt()); @@ -421,89 +316,173 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll @RequestMapping(value= {"/web/mjon/msgsent/selectMsgSentListViewAjax.do"}) public String selectMsgSentListViewAjax(@ModelAttribute("searchVO") MjonMsgSentVO mjonMsgSentVO, ModelMap model) throws Exception{ + String pageUrl = ""; + try { + + + log.info(" ListView pageIndex :: [{}]", mjonMsgSentVO.getPageIndex()); + log.info(" ListView pageUnit :: [{}]", mjonMsgSentVO.getPageUnit()); + + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + mjonMsgSentVO.setUserId(userId); + + // 검색 리스트 불러오기 +// if(mjonMsgSentVO.getPageUnit() != 10) { +// mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit()); +// } + + //기본 내림차순 정렬 + if(StringUtils.isEmpty(mjonMsgSentVO.getSearchSortOrd())) { + + mjonMsgSentVO.setSearchSortOrd("desc"); + mjonMsgSentVO.setSearchSortCnd("B.REQ_DATE"); + } + + + //선택 탭 정보 저장 + //mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType()); + + /** pageing */ + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex()); + paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit()); + paginationInfo.setPageSize(mjonMsgSentVO.getPageSize()); + + mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex()); + mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getSearchStartDate(),mjonMsgSentVO.getSearchEndDate(), 3 )) { + mjonMsgSentVO.setSearchStartDate(DateUtils.getDateMonthsAgo(3)); + mjonMsgSentVO.setSearchEndDate(DateUtils.getCurrentDate()); + }; + + model.addAttribute("searchStartDate", mjonMsgSentVO.getSearchStartDate()); + model.addAttribute("searchEndDate", mjonMsgSentVO.getSearchEndDate()); + + //전체 발송 리스트 불러오기 + Map resultMap = mjonMsgSentService.selectAllMsgSentList_advc(mjonMsgSentVO); + + + model.addAttribute("resultAllSentList", resultMap.get("resultList")); + + + paginationInfo.setTotalRecordCount((Integer)resultMap.get("totalCnt")); + model.addAttribute("paginationInfo", paginationInfo); + model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount()); + + model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); + + String stateType = mjonMsgSentVO.getStateType(); + + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception + } + + return "web/msgsent/MsgSentAllListAjax"; + } + + @RequestMapping(value= {"/web/mjon/msgsent/selectMsgSentListViewAjax_backup.do"}) + public String selectMsgSentListViewAjax_backup(@ModelAttribute("searchVO") MjonMsgSentVO mjonMsgSentVO, ModelMap model) throws Exception{ + + + + //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - mjonMsgSentVO.setUserId(userId); - - // 검색 리스트 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + mjonMsgSentVO.setUserId(userId); + + // 검색 리스트 불러오기 if(mjonMsgSentVO.getPageUnit() != 10) { mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit()); } - //기본 내림차순 정렬 - if(mjonMsgSentVO.getSearchSortOrd().equals("")) { - - mjonMsgSentVO.setSearchSortOrd("desc"); - mjonMsgSentVO.setSearchSortCnd("regdate"); - } - - if(mjonMsgSentVO.getListType().equals("")) { - - mjonMsgSentVO.setListType("groupList"); - - } - - //선택 탭 정보 저장 - //mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType()); - + //기본 내림차순 정렬 + if(mjonMsgSentVO.getSearchSortOrd().equals("")) { + + mjonMsgSentVO.setSearchSortOrd("desc"); + mjonMsgSentVO.setSearchSortCnd("regdate"); + } + + if(mjonMsgSentVO.getListType().equals("")) { + + mjonMsgSentVO.setListType("groupList"); + + } + + //선택 탭 정보 저장 + //mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType()); + /** pageing */ PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex()); paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit()); paginationInfo.setPageSize(mjonMsgSentVO.getPageSize()); - + mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); - + if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getStartDate(),mjonMsgSentVO.getEndDate(), 3 )) { mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3)); mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate()); }; - - model.addAttribute("startDate", mjonMsgSentVO.getStartDate()); - model.addAttribute("endDate", mjonMsgSentVO.getEndDate()); - //전체 발송 리스트 불러오기 - List resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO); - model.addAttribute("resultAllSentList", resultAllSentList); - model.addAttribute("resultAllSentCnt", resultAllSentList.size()); - - model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword()); - paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0); - model.addAttribute("paginationInfo", paginationInfo); - model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount()); - - //발송 결과 성공 실패 건수 리스트 불러오기 - List resultMsgSucFailList = new ArrayList(); - - if(resultAllSentList.size() > 0) { - resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO); - } - model.addAttribute("resultMsgSucFailList", resultMsgSucFailList); - - model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); - - String stateType = mjonMsgSentVO.getStateType(); - String pageUrl = "web/msgsent/MsgSentAllListAjax"; - - if(stateType.equals("ready")) { - - pageUrl = "web/msgsent/MsgSentReadyListAjax"; - - }else if(stateType.equals("complete")) { - - pageUrl = "web/msgsent/MsgSentCompleteListAjax"; - - }else if(stateType.equals("fail")) { - - pageUrl = "web/msgsent/MsgSentFailListAjax"; - - } + model.addAttribute("startDate", mjonMsgSentVO.getStartDate()); + model.addAttribute("endDate", mjonMsgSentVO.getEndDate()); + + //전체 발송 리스트 불러오기 + List resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO); + + + model.addAttribute("resultAllSentList", resultAllSentList); + model.addAttribute("resultAllSentCnt", resultAllSentList.size()); + + model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword()); + paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0); + model.addAttribute("paginationInfo", paginationInfo); + model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount()); + + //발송 결과 성공 실패 건수 리스트 불러오기 + List resultMsgSucFailList = new ArrayList(); + + if(resultAllSentList.size() > 0) { + System.out.println("=====resultMsgSucFailList====="); + resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO); + System.out.println("//=====resultMsgSucFailList====="); + } + model.addAttribute("resultMsgSucFailList", resultMsgSucFailList); + + model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); + + String stateType = mjonMsgSentVO.getStateType(); + // String pageUrl = "web/msgsent/MsgSentAllListAjax"; + String pageUrl = "web/msgsent/MsgSentAllListAjax"; + + if(stateType.equals("ready")) { + + pageUrl = "web/msgsent/MsgSentReadyListAjax"; + + }else if(stateType.equals("complete")) { + + pageUrl = "web/msgsent/MsgSentCompleteListAjax"; + + }else if(stateType.equals("fail")) { + + pageUrl = "web/msgsent/MsgSentFailListAjax"; + + } + + log.info(" :: pageUrl [{}]", pageUrl); return pageUrl; } @@ -622,6 +601,9 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll return "web/msgsent/MsgSentDetailPopAjax"; } + + + /** * 발송관리 문자 상세보기 내용 * @param searchVO @@ -1138,320 +1120,9 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll } - String stateType = mjonMsgSentVO.getStateType(); - String tabType = mjonMsgSentVO.getTabType(); - // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. - SXSSFWorkbook wb = new SXSSFWorkbook(100); - String fileName ="발송관리 엑셀 리스트"; // 저장 파일명 - String sheetTitle = "문자 발송 내역" ; // 셀 제목 - Sheet sheet = wb.createSheet(sheetTitle); - Cell cell = null; - Row row = null; - - CellStyle style = wb.createCellStyle(); - style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 - style.setBorderLeft(CellStyle.BORDER_THIN); - style.setBorderRight(CellStyle.BORDER_THIN); - style.setBorderTop(CellStyle.BORDER_THIN); - - // 정렬 - style.setAlignment(CellStyle.ALIGN_CENTER); //가운데 정렬 - style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //높이 가운데 정렬 - - Font font = wb.createFont(); - font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold - - - String type = ""; - String fCnt = ""; - - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - - try{ - - - mjonMsgSentVO.setRecordCountPerPage(100000); - mjonMsgSentVO.setFirstIndex(0); - - if("".equals(mjonMsgSentVO.getSearchSortCnd())){ //최초조회시 최신것 조회List - mjonMsgSentVO.setSearchSortCnd("regdate"); - mjonMsgSentVO.setSearchSortOrd("desc"); - } - - //예약 관리 리스트 불러오기 - List resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO); - - {//화면 리스트 - - row = sheet.createRow(0); - - sheet.setColumnWidth(1, 5000); // 발송일시 칼럼의 폭 조절 - sheet.setColumnWidth(3, 10000); // 내용 칼럼의 폭 조절 - sheet.setColumnWidth(4, 5000); // 받는사람 이름 칼럼의 폭 조절 - sheet.setColumnWidth(5, 5000); // 받는사람 연락처 칼럼의 폭 조절 - sheet.setColumnWidth(6, 5000); // 발신번호 칼럼의 폭 조절 - sheet.setColumnWidth(7, 5000); // 발송상태 칼럼의 폭 조절 - sheet.setColumnWidth(8, 5000); // 발송건수 칼럼의 폭 조절 - - //셀병합 처리 - sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); //번호 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); //발송일시 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); //형태 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); //내용 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,4,4)); //받는사람 이름 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,5,5)); //받는사람 연락처 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,6,6)); //발신번호 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,7,7)); //발송상태 세로 셀병합 - sheet.addMergedRegion(new CellRangeAddress(0,1,8,8)); //발송건수 세로 셀병합 - - - cell = row.createCell(0); - cell.setCellValue("번호"); - cell.setCellStyle(style); - - cell = row.createCell(1); - cell.setCellValue("발송일시"); - cell.setCellStyle(style); - - cell = row.createCell(2); - cell.setCellValue("형태"); - cell.setCellStyle(style); - - cell = row.createCell(3); - cell.setCellValue("내용"); - cell.setCellStyle(style); - - cell = row.createCell(4); - cell.setCellValue("수신자"); - cell.setCellStyle(style); - - cell = row.createCell(5); - cell.setCellValue("수신번호"); - cell.setCellStyle(style); - - cell = row.createCell(6); - cell.setCellValue("발신번호"); - cell.setCellStyle(style); - - cell = row.createCell(7); - cell.setCellValue("발송상태"); - cell.setCellStyle(style); - - cell = row.createCell(8); - cell.setCellValue("발송건수"); - cell.setCellStyle(style); - - cell = row.createCell(9); - cell.setCellValue("발송결과"); - sheet.addMergedRegion(new CellRangeAddress(0,0,9,10)); // 발송결과 건수 가로 셀병합 - cell.setCellStyle(style); - - cell = row.createCell(10); - cell.setCellStyle(style); - - cell = row.createCell(11); - cell.setCellValue("금액"); - sheet.addMergedRegion(new CellRangeAddress(0,0,11,12)); // 발송결과 건수 가로 셀병합 - cell.setCellStyle(style); - - cell = row.createCell(12); - cell.setCellValue("예약취소"); - cell.setCellStyle(style); - - row = sheet.createRow(1); - - cell = row.createCell(0); - cell.setCellStyle(style); - - cell = row.createCell(1); - cell.setCellStyle(style); - - cell = row.createCell(2); - cell.setCellStyle(style); - - cell = row.createCell(3); - cell.setCellStyle(style); - - cell = row.createCell(4); - cell.setCellStyle(style); - - cell = row.createCell(5); - cell.setCellStyle(style); - - cell = row.createCell(6); - cell.setCellStyle(style); - - cell = row.createCell(7); - cell.setCellStyle(style); - - cell = row.createCell(8); - cell.setCellStyle(style); - - cell = row.createCell(9); - cell.setCellValue("성공"); - cell.setCellStyle(style); - - cell = row.createCell(10); - cell.setCellValue("실패/대기"); - cell.setCellStyle(style); - - cell = row.createCell(11); - cell.setCellValue("과금"); - cell.setCellStyle(style); - - cell = row.createCell(12); - cell.setCellValue("비과금"); - cell.setCellStyle(style); - } - - for(int i=0; i < resultAllSentList.size(); i++) { - String msgType = "단문"; - if(resultAllSentList.get(i).getMsgType().equals("6") && resultAllSentList.get(i).getFileCnt().equals("0")) { - msgType = "장문"; - }else if(resultAllSentList.get(i).getMsgType().equals("6") && !resultAllSentList.get(i).getFileCnt().equals("0")) { - msgType = "그림"; - } - - - int excelLen = 0; - row = sheet.createRow(i+2); - excelLen = 12; - - for(int j=0 ; j <= excelLen ; j++) { - cell = row.createCell(j); - cell.setCellStyle(style); - - if(j==0) cell.setCellValue(i+1); //번호 - if(j==1) cell.setCellValue(sdf.format((resultAllSentList.get(i)).getReqdate())); //발송일자 - if(j==2) { - - type = resultAllSentList.get(i).getMsgType(); - fCnt = resultAllSentList.get(i).getFileCnt(); - - if(type.equals("4")) { - - cell.setCellValue("단문"); //형태 - - }else { - - if(fCnt.equals("0")) { - - cell.setCellValue("장문"); //형태 - - }else { - - cell.setCellValue("그림"); //형태 - - } - - } - - } - if(j==3) cell.setCellValue((resultAllSentList.get(i)).getSmsTxt()); //내용 - if(j==4) cell.setCellValue((resultAllSentList.get(i)).getAddrNm()); - if(j==5) cell.setCellValue((resultAllSentList.get(i)).getCallToComma()); - if(j==6) cell.setCellValue((resultAllSentList.get(i)).getCallFromComma()); //발신번호 - if(j==7) { //발송상태 처리해주기 - - String resvCYn = resultAllSentList.get(i).getReserveCYn(); - String curState = resultAllSentList.get(i).getCurState(); - - if(resvCYn.equals("Y")) { - - cell.setCellValue("예약 취소"); //발송상태 - - }else { - - if(curState.equals("0")) { - - cell.setCellValue("발송 대기"); //발송상태 - - }else if(curState.equals("1")) { - - cell.setCellValue("발송중"); //발송상태 - - }else if(curState.equals("2")) { - - cell.setCellValue("결과 대기"); //발송상태 - - }else if(curState.equals("3")) { - - cell.setCellValue("발송 완료"); //발송상태 - - } - } - - } - if(j==8) cell.setCellValue((resultAllSentList.get(i)).getMsgGroupCnt()); //발송건수 - - //발송결과 성공, 실패 처리 - int resSucCnt = 0; - int resFailCnt = 0; - double resSucPrice = 0; - double resFailPirce = 0; - - - double eachPrice = Float.parseFloat(resultAllSentList.get(i).getEachPrice()); - int resultSValue = 0; - int resultWFValue = 0; - - if(resultAllSentList.get(i).getResultSValue() != null) { - resultSValue = Integer.parseInt(resultAllSentList.get(i).getResultSValue()); - }else { - resultSValue = 1; - } - - if(resultAllSentList.get(i).getResultWFValue() != null) { - resultWFValue = Integer.parseInt(resultAllSentList.get(i).getResultWFValue()); - }else { - resultWFValue = 1; - } - - - if("S".equals(resultAllSentList.get(i).getMsgResult())) { - resSucCnt = resultSValue; - } else { - resFailCnt = resultWFValue; - } - - resSucPrice = eachPrice * resSucCnt; - resFailPirce = eachPrice * resFailCnt; - - - if(j==9) cell.setCellValue(resSucCnt); //발송결과 성공 - if(j==10) cell.setCellValue(resFailCnt); //발송결과 실패 - if(j==11) cell.setCellValue(resSucPrice); // 과금 금액 - if(j==12) cell.setCellValue(resFailPirce); //비과금 금액 - } - } - response.setHeader("Set-Cookie", "fileDownload=true; path=/"); - SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd_HHmmss", Locale.KOREA ); - Date currentTime = new Date (); - String mTime = mSimpleDateFormat.format ( currentTime ); - fileName = fileName+"("+mTime+")"; - - response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); - wb.write(response.getOutputStream()); - }catch(Exception e) { - response.setHeader("Set-Cookie", "fileDownload=false; path=/"); - response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); - response.setHeader("Content-Type","text/html; charset=utf-8"); - OutputStream out = null; - try { - out = response.getOutputStream(); - byte[] data = new String("fail..").getBytes(); - out.write(data, 0, data.length); - } catch(Exception ignore) { - ignore.printStackTrace(); - } finally { - if(out != null) try { out.close(); } catch(Exception ignore) {} - } - }finally { - // 디스크 적었던 임시파일을 제거합니다. - wb.dispose(); - try { wb.close(); } catch(Exception ignore) {} - } + mjonMsgSentService.msgSentExcelDownLoad(mjonMsgSentVO, response); + } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index d54a74e5..08267bdb 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -13,11 +13,9 @@ import java.nio.charset.Charset; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -41,18 +39,12 @@ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.HandlerMapping; @@ -67,7 +59,6 @@ import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.ComDefaultCodeVO; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; -import itn.com.cmm.RestResponse; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.FileVO; import itn.com.cmm.util.DateUtils; @@ -76,8 +67,6 @@ import itn.com.cmm.util.PayUtils; import itn.com.cmm.util.RedirectUrlMaker; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; -import itn.let.fax.admin.service.FaxStatVO; -import itn.let.mail.service.StatusResponse; import itn.let.mjo.mjocommon.MjonCommon; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgVO; @@ -107,6 +96,7 @@ import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.UserManageVO; import itn.let.utl.fcc.service.EgovCryptoUtil; +import itn.let.utl.user.service.ExcelUtil; import itn.let.utl.user.service.MjonNoticeSendUtil; @Controller @@ -1952,7 +1942,6 @@ public class MjonPayController { model.addAttribute("prePaymentYn", userManageVO.getPrePaymentYn()); - System.out.println("pattern :: "+ pattern); if(pattern.equals("/web/member/pay/PayListAllAjax.do") || pattern.equals("/web/member/pay/PayListMobileAjax.do") @@ -2051,7 +2040,7 @@ public class MjonPayController { return "/web/pay/PayListRefundAjax"; } - + //일반 결제 페이지 처리 if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List mjonPayVO.setSearchSortCnd("moid"); @@ -2073,7 +2062,7 @@ public class MjonPayController { } } - + if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체 mjonPayVO.setPageType("all"); } @@ -2121,7 +2110,7 @@ public class MjonPayController { // mjonPayVO.setStartDate(mjonPayVO.getStartDate() == null ? DateUtil.getDateDaysAgo(365) : mjonPayVO.getStartDate()); // mjonPayVO.setEndDate(mjonPayVO.getEndDate() == null ? DateUtil.getCurrentDate() : mjonPayVO.getEndDate()); - + if(!DateUtils.dateChkAndValueChk(mjonPayVO.getStartDate(),mjonPayVO.getEndDate(), 12 )) { mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12)); mjonPayVO.setEndDate(DateUtils.getCurrentDate()); @@ -4085,7 +4074,7 @@ public class MjonPayController { } //결제 엑셀 다운로드 - @RequestMapping(value= {"/web/member/pay/PayExcelDownload.do"}) + @RequestMapping(value= {"/web/member/pay/PayExcelDownload_OLD.do"}) public void PayExcelDownload( MjonPayVO mjonPayVO, HttpServletRequest request, HttpServletResponse response , @@ -4180,6 +4169,118 @@ public class MjonPayController { } } + //결제 엑셀 다운로드 + @RequestMapping(value= {"/web/member/pay/PayExcelDownload.do"}) + public void PayNewExcelDownload( MjonPayVO mjonPayVO, + HttpServletRequest request, + HttpServletResponse response , + ModelMap model) throws Exception { + + //로그인 여부 체크 및 ID 획득 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(loginVO != null) { + + String fileName ="결제내역 엑셀 리스트"; //file name + + try{ + /** pageing */ + PaginationInfo paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(1); + paginationInfo.setRecordCountPerPage(10000); + paginationInfo.setPageSize(10); + + mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); + mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex()); + mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); + + mjonPayVO.setUserId(userId); + + + //url에 따른 타입 처리 + String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); + System.out.println("pattern========"); + System.out.println(pattern); + + //url에 따른 검색 조건 처리 + mjonPayVO = this.p_checkSearchCnd(pattern, mjonPayVO); + + + //검색 기간 처리 + mjonPayVO = this.p_checkSearchDate(mjonPayVO); + + + //정렬 처리 + mjonPayVO = this.p_checkSortCnd(mjonPayVO); + + + //결과 리스트 정보 불러오기 + List resultList = mjonPayService.selectPayList(mjonPayVO); + + //필요 컬럼 추가 + for (int i=0;i excelData = new ArrayList<>(); + excelData.addAll(resultList); + // 세팅값 + String title = "요금결제내역"; //sheet name & title + + // 너비 + int[] width = { + 4000 + , 4000 + , 4000 + , 4000 + , 4000 + + , 4000 + //, 4000 + , 4000 + }; + + // 헤더 + String[] header = { + "번호" + , "결제일시" + , "결제방식" + , "결제금액" + , "충전금액" + + , "결제상태" + //, "증빙서류 발행 요청" + , "비고1" + }; + + // 컬럼명 + String[] order = { + "SeqNo" + , "RegDate" + , "PayMethodTxt" + , "Amt" + , "Cash" + + , "PgStatusTxt" + //, "RcptTypeTxt" + , "VbankNum" + + }; + + // 호출 - download file 처리 + SXSSFWorkbook workbook = ExcelUtil.makeSimpleFruitExcelWorkbook(excelData , header, order, width, title); + response = this.p_makeResponse(response, fileName); + workbook.write(response.getOutputStream()); + + }catch(Exception e) { + e.printStackTrace(); + } + + } + + } //포인트 교환내역 엑셀 다운로드 @RequestMapping(value= {"/web/member/pay/PointExcelDownload.do"}) @@ -6088,6 +6189,119 @@ public class MjonPayController { model.addAttribute("paginationInfo", paginationInfo); return "/uss/ion/pay/cashPointSendList"; - } + } + + /** + * @param p_pattern + * @param p_mjonPayVO + * @return + * @throws Exception + */ + private MjonPayVO p_checkSearchCnd( + String p_pattern + , MjonPayVO p_mjonPayVO + ) throws Exception{ + if(p_pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체 + p_mjonPayVO.setPageType("all"); + } + if(p_pattern.equals("/web/member/pay/PayListMobileAjax.do")) { //모바일일때 + p_mjonPayVO.setSearchCondition2("CELLPHONE"); + p_mjonPayVO.setPayMethod("CELLPHONE"); + p_mjonPayVO.setPageType("cellphone"); + } + if(p_pattern.equals("/web/member/pay/PayListCardAjax.do")) { //신용카드 + p_mjonPayVO.setSearchCondition2("CARD"); + p_mjonPayVO.setPayMethod("CARD"); + p_mjonPayVO.setPageType("card"); + } + if(p_pattern.equals("/web/member/pay/PayListVBankAjax.do")) { //전용계좌 + p_mjonPayVO.setSearchCondition2("VBANK"); + p_mjonPayVO.setPayMethod("VBANK"); + p_mjonPayVO.setPageType("vbank"); + } + if(p_pattern.equals("/web/member/pay/PayListBankAjax.do")) { //즉시이체 + p_mjonPayVO.setSearchCondition2("BANK"); + p_mjonPayVO.setPayMethod("BANK"); + p_mjonPayVO.setPageType("bank"); + } + if(p_pattern.equals("/web/member/pay/PayListSPayAjax.do")) { //즉시이체 + p_mjonPayVO.setSearchCondition2("SPAY"); + p_mjonPayVO.setPayMethod("SPAY"); + p_mjonPayVO.setPageType("SPAY"); + } + if(p_pattern.equals("/web/member/pay/PayListOfflineAjax.do")) { //무통장 + p_mjonPayVO.setSearchCondition2("OFFLINE"); + p_mjonPayVO.setPayMethod("OFFLINE"); + p_mjonPayVO.setPageType("offline"); + } + + return p_mjonPayVO; + } + + /** + * @param p_mjonPayVO + * @return + * @throws Exception + */ + private MjonPayVO p_checkSortCnd( + MjonPayVO p_mjonPayVO + ) throws Exception{ + //정렬 처리 + if("".equals(p_mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List + p_mjonPayVO.setSearchSortCnd("moid"); + p_mjonPayVO.setSearchSortOrd("desc"); + }else {//포인트 교환내역에서 정렬 종류가 달라서 변환처리 해줌 + + String sortCnt = p_mjonPayVO.getSearchSortCnd(); + + if(sortCnt.equals("pointUseId") || sortCnt.equals("refundId")) { + p_mjonPayVO.setSearchSortCnd("moid"); + }else if(sortCnt.equals("frstRegistPnttm") || sortCnt.equals("frstRegisterPnttm") || sortCnt.equals("refundHandlePnttm")) { + p_mjonPayVO.setSearchSortCnd("regDate"); + }else if(sortCnt.equals("type")) { + p_mjonPayVO.setSearchSortCnd("payMethodTxt"); + }else if(sortCnt.equals("point") || sortCnt.equals("refundMoney") || sortCnt.equals("refundCash")) { + p_mjonPayVO.setSearchSortCnd("amt"); + }else if(sortCnt.equals("cmpltYn") || sortCnt.equals("refundStatus")) { + p_mjonPayVO.setSearchSortCnd("pgStatusTxt"); + } + + } + + return p_mjonPayVO; + } + + /** + * @param p_mjonPayVO + * @return + * @throws Exception + */ + private MjonPayVO p_checkSearchDate( + MjonPayVO p_mjonPayVO + ) throws Exception{ + //검색 기간 처리 + if(!DateUtils.dateChkAndValueChk(p_mjonPayVO.getStartDate(),p_mjonPayVO.getEndDate(), 12 )) + { + p_mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12)); + p_mjonPayVO.setEndDate(DateUtils.getCurrentDate()); + } + + return p_mjonPayVO; + } + + private HttpServletResponse p_makeResponse( + HttpServletResponse p_response + , String p_fileName + ) throws Exception{ + p_response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA ); + Date currentTime = new Date (); + String mTime = mSimpleDateFormat.format ( currentTime ); + p_fileName = p_fileName+"("+mTime+")"; + + p_response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((p_fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); + + return p_response; + } } diff --git a/src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java b/src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java index 988625d6..4be2baa8 100644 --- a/src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java +++ b/src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java @@ -341,6 +341,7 @@ public class MjonReservMsgServiceImpl extends EgovAbstractServiceImpl implements } } catch (Exception e) { + e.printStackTrace(); System.out.println("++++++++++++++++++++++ 예약문자 취소 deleteReservMsgCancelDataAjax Service Imple Error !!! " + e); } diff --git a/src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java b/src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java index c8fa6cd3..462adf29 100644 --- a/src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java +++ b/src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java @@ -610,37 +610,43 @@ public class MjonReservMsgController { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); + try { - //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - if(!userId.equals("")) { - - mjonResvMsgVO.setUserId(userId); - - }else { - - modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); - modelAndView.addObject("result", "fail"); - - return modelAndView; - - } - - // 디비에 문자 내용을 저장해 준다. - int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO); - - if(resultSts > 0) { + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(!userId.equals("")) { + + mjonResvMsgVO.setUserId(userId); + + }else { + + modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); + modelAndView.addObject("result", "fail"); + + return modelAndView; + + } + + // 디비에 문자 내용을 저장해 준다. + int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO); - modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다."); - modelAndView.addObject("result", "success"); - - }else { - - modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요."); - modelAndView.addObject("result", "fail"); + if(resultSts > 0) { + + modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다."); + modelAndView.addObject("result", "success"); + + }else { + + modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요."); + modelAndView.addObject("result", "fail"); + + } + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception } return modelAndView; diff --git a/src/main/java/itn/let/module/base/PriceAndPoint.java b/src/main/java/itn/let/module/base/PriceAndPoint.java index d1eec610..d4f190f1 100644 --- a/src/main/java/itn/let/module/base/PriceAndPoint.java +++ b/src/main/java/itn/let/module/base/PriceAndPoint.java @@ -117,6 +117,7 @@ public class PriceAndPoint { MjonPayVO mjonPayVO = new MjonPayVO(); mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); mjonPayVO.setUserId(userId); + System.out.println(" + totPrice :: "+ totPrice); mjonPayVO.setCash(totPrice); mjonPayVO.setFrstRegisterId(userId); mjonPayVO.setMemo(memo); diff --git a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java index 87b3d301..eed122fa 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java @@ -1074,12 +1074,21 @@ public class EgovLoginController { String message = (String) commandMap.get("message"); String goEventPay = (String) commandMap.get("goEventPay"); - // sns 회원가입 key 값 설정 - String naverClientId = itnNaverClientId; - String naverClientSecret = itnNaverClientSecret; + /* + * 헤더에서 id/pw는 맞지만 보안로그인 설정 되어있을때 -> secure + * + */ - String kakaoRestApiKey = itnKakaoRestApiKey; - String kakaoReturnUrl = itnKakaoReturnUrl; + String headerLoginResult = (String) commandMap.get("headerLoginResult"); + String id = (String) commandMap.get("id"); + String pw = (String) commandMap.get("password"); + + // sns 회원가입 key 값 설정 +// String naverClientId = itnNaverClientId; +// String naverClientSecret = itnNaverClientSecret; +// +// String kakaoRestApiKey = itnKakaoRestApiKey; +// String kakaoReturnUrl = itnKakaoReturnUrl; // config 정보 가져오기 MberManageConfigVO mberConfigVO = new MberManageConfigVO(); @@ -1129,6 +1138,16 @@ public class EgovLoginController { model.addAttribute("userIp", userIp); model.addAttribute("goEventPay", goEventPay); + + + if(StringUtil.isNotEmpty(headerLoginResult)) { + model.addAttribute("id_secure", id); + model.addAttribute("pw_secure", pw); + }else { + headerLoginResult = "N"; + } + + model.addAttribute("headerLoginResult", headerLoginResult); return "web/login/EgovLoginGnrlUsr"; } @@ -1833,6 +1852,8 @@ public class EgovLoginController { HttpServletRequest request, @RequestParam Map commandMap, ModelMap model, HttpSession session, RedirectAttributes redirectAttributes) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); diff --git a/src/main/java/itn/let/uss/umt/service/UserDefaultVO.java b/src/main/java/itn/let/uss/umt/service/UserDefaultVO.java index a4a8d8c0..3432dcd3 100644 --- a/src/main/java/itn/let/uss/umt/service/UserDefaultVO.java +++ b/src/main/java/itn/let/uss/umt/service/UserDefaultVO.java @@ -4,6 +4,9 @@ import java.io.Serializable; import org.apache.commons.lang3.builder.ToStringBuilder; +import lombok.Getter; +import lombok.Setter; + /** * 사용자정보 VO클래스로서일반회원, 기업회원, 업무사용자의 비지니스로직 처리시 기타조건성 항을 구성한다. * @author 공통서비스 개발팀 조재영 @@ -21,6 +24,8 @@ import org.apache.commons.lang3.builder.ToStringBuilder; * * */ +@Getter +@Setter public class UserDefaultVO implements Serializable { /** @@ -34,9 +39,19 @@ public class UserDefaultVO implements Serializable { /** 검색조건-성별 (0, M, F)*/ private String searchSexdstn = "0"; - /** 검색조건 */ + /** + * 검색조건 + * 20250122 이호영 + * 개선은 검색조건을 아래 세개만 사용하려고 함 + * */ private String searchCondition ; + private String searchCondition01 ; + private String searchCondition02 ; + + + /** 검색조건 - 기존 */ +// private String searchCondition ; private String searchCondition_01 ; private String searchConditionSite ; @@ -173,45 +188,6 @@ public class UserDefaultVO implements Serializable { private String searchDeleteType; - public String getSearchDeleteType() { - return searchDeleteType; - } - - public void setSearchDeleteType(String searchDeleteType) { - this.searchDeleteType = searchDeleteType; - } - - public String getSearchHotlineAgentCode() { - return searchHotlineAgentCode; - } - - public void setSearchHotlineAgentCode(String searchHotlineAgentCode) { - this.searchHotlineAgentCode = searchHotlineAgentCode; - } - - public String getSearchExceptSpamYn() { - return searchExceptSpamYn; - } - - public void setSearchExceptSpamYn(String searchExceptSpamYn) { - this.searchExceptSpamYn = searchExceptSpamYn; - } - - public String getSearchSmishingYn() { - return searchSmishingYn; - } - - public void setSearchSmishingYn(String searchSmishingYn) { - this.searchSmishingYn = searchSmishingYn; - } - - public String getSearchDeptPrePayment() { - return searchDeptPrePayment; - } - - public void setSearchDeptPrePayment(String searchDeptPrePayment) { - this.searchDeptPrePayment = searchDeptPrePayment; - } private String searchAdminSmsNoticeYn; @@ -224,570 +200,5 @@ public class UserDefaultVO implements Serializable { private String searchThrDptCategoryCode; //3뎁스(하위카테고리) 검색 - public String getEditMode() { - return editMode; - } - - public void setEditMode(String editMode) { - this.editMode = editMode; - } - - public String getSearchSmsSalePrice() { - return searchSmsSalePrice; - } - - public void setSearchSmsSalePrice(String searchSmsSalePrice) { - this.searchSmsSalePrice = searchSmsSalePrice; - } - - public String getSearchAdminSmsNoticeYn() { - return searchAdminSmsNoticeYn; - } - - public void setSearchAdminSmsNoticeYn(String searchAdminSmsNoticeYn) { - this.searchAdminSmsNoticeYn = searchAdminSmsNoticeYn; - } - - public String getSearchDept() { - return searchDept; - } - - public void setSearchDept(String searchDept) { - this.searchDept = searchDept; - } - - public String getAuthorCode() { - return authorCode; - } - - public void setAuthorCode(String authorCode) { - this.authorCode = authorCode; - } - - public String getSearchCategoryCode() { - return searchCategoryCode; - } - - public void setSearchCategoryCode(String searchCategoryCode) { - this.searchCategoryCode = searchCategoryCode; - } - - public String getSearchKeywordFrom() { - return searchKeywordFrom; - } - - public void setSearchKeywordFrom(String searchKeywordFrom) { - this.searchKeywordFrom = searchKeywordFrom; - } - - public String getSearchKeywordTo() { - return searchKeywordTo; - } - - public void setSearchKeywordTo(String searchKeywordTo) { - this.searchKeywordTo = searchKeywordTo; - } - - public String getFrstRegistPnttm() { - return frstRegistPnttm; - } - - public void setFrstRegistPnttm(String frstRegistPnttm) { - this.frstRegistPnttm = frstRegistPnttm; - } - - public String getFrstRegisterId() { - return frstRegisterId; - } - - public void setFrstRegisterId(String frstRegisterId) { - this.frstRegisterId = frstRegisterId; - } - - public String getLastUpdtPnttm() { - return lastUpdtPnttm; - } - - public void setLastUpdtPnttm(String lastUpdtPnttm) { - this.lastUpdtPnttm = lastUpdtPnttm; - } - - public String getLastUpdusrId() { - return lastUpdusrId; - } - - public void setLastUpdusrId(String lastUpdusrId) { - this.lastUpdusrId = lastUpdusrId; - } - - public int getTotCnt() { - return totCnt; - } - - public void setTotCnt(int totCnt) { - this.totCnt = totCnt; - } - - public String getUserTotailCount() { - return userTotailCount; - } - - public void setUserTotailCount(String userTotailCount) { - this.userTotailCount = userTotailCount; - } - - public String getUserNewCount() { - return userNewCount; - } - - public void setUserNewCount(String userNewCount) { - this.userNewCount = userNewCount; - } - - public String getUserDeleteCount() { - return userDeleteCount; - } - - public void setUserDeleteCount(String userDeleteCount) { - this.userDeleteCount = userDeleteCount; - } - - public String getUserNewBlock() { - return userNewBlock; - } - - public void setUserNewBlock(String userNewBlock) { - this.userNewBlock = userNewBlock; - } - - public String getSnsSiteId() { - return snsSiteId; - } - - public void setSnsSiteId(String snsSiteId) { - this.snsSiteId = snsSiteId; - } - - public String getSnsSiteName() { - return snsSiteName; - } - - public void setSnsSiteName(String snsSiteName) { - this.snsSiteName = snsSiteName; - } - - public String getSnsSite() { - return snsSite; - } - - public void setSnsSite(String snsSite) { - this.snsSite = snsSite; - } - - public String getSnsId() { - return snsId; - } - - public void setSnsId(String snsId) { - this.snsId = snsId; - } - - public String getSnsEmail() { - return snsEmail; - } - - public void setSnsEmail(String snsEmail) { - this.snsEmail = snsEmail; - } - - public static long getSerialversionuid() { - return serialVersionUID; - } - - /** - * sbscrbSttus attribute 값을 리턴한다. - * @return String - */ - public String getSbscrbSttus() { - return sbscrbSttus; - } - - /** - * sbscrbSttus attribute 값을 설정한다. - * @param sbscrbSttus String - */ - public void setSbscrbSttus(String sbscrbSttus) { - this.sbscrbSttus = sbscrbSttus; - } - - /** - * searchCondition attribute 값을 리턴한다. - * @return String - */ - public String getSearchCondition() { - return searchCondition; - } - - /** - * searchCondition attribute 값을 설정한다. - * @param searchCondition String - */ - public void setSearchCondition(String searchCondition) { - this.searchCondition = searchCondition; - } - - /** - * searchKeyword attribute 값을 리턴한다. - * @return String - */ - public String getSearchKeyword() { - return searchKeyword; - } - - /** - * searchKeyword attribute 값을 설정한다. - * @param searchKeyword String - */ - public void setSearchKeyword(String searchKeyword) { - this.searchKeyword = searchKeyword; - } - - /** - * searchUseYn attribute 값을 리턴한다. - * @return String - */ - public String getSearchUseYn() { - return searchUseYn; - } - - /** - * searchUseYn attribute 값을 설정한다. - * @param searchUseYn String - */ - public void setSearchUseYn(String searchUseYn) { - this.searchUseYn = searchUseYn; - } - - /** - * pageIndex attribute 값을 리턴한다. - * @return int - */ - public int getPageIndex() { - return pageIndex; - } - - /** - * pageIndex attribute 값을 설정한다. - * @param pageIndex int - */ - public void setPageIndex(int pageIndex) { - this.pageIndex = pageIndex; - } - - /** - * pageUnit attribute 값을 리턴한다. - * @return int - */ - public int getPageUnit() { - return pageUnit; - } - - /** - * pageUnit attribute 값을 설정한다. - * @param pageUnit int - */ - public void setPageUnit(int pageUnit) { - this.pageUnit = pageUnit; - } - - /** - * pageSize attribute 값을 리턴한다. - * @return int - */ - public int getPageSize() { - return pageSize; - } - - /** - * pageSize attribute 값을 설정한다. - * @param pageSize int - */ - public void setPageSize(int pageSize) { - this.pageSize = pageSize; - } - - /** - * firstIndex attribute 값을 리턴한다. - * @return int - */ - public int getFirstIndex() { - return firstIndex; - } - - /** - * firstIndex attribute 값을 설정한다. - * @param firstIndex int - */ - public void setFirstIndex(int firstIndex) { - this.firstIndex = firstIndex; - } - - /** - * lastIndex attribute 값을 리턴한다. - * @return int - */ - public int getLastIndex() { - return lastIndex; - } - - /** - * lastIndex attribute 값을 설정한다. - * @param lastIndex int - */ - public void setLastIndex(int lastIndex) { - this.lastIndex = lastIndex; - } - - /** - * recordCountPerPage attribute 값을 리턴한다. - * @return int - */ - public int getRecordCountPerPage() { - return recordCountPerPage; - } - - /** - * recordCountPerPage attribute 값을 설정한다. - * @param recordCountPerPage int - */ - public void setRecordCountPerPage(int recordCountPerPage) { - this.recordCountPerPage = recordCountPerPage; - } - - /*성별조건 검색*/ - public String getSearchSexdstn() { - return searchSexdstn; - } - - public void setSearchSexdstn(String searchSexdstn) { - this.searchSexdstn = searchSexdstn; - } - - /** - * toString 메소드를 대치한다. - */ - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - - public String getSiteId() { - return siteId; - } - - public void setSiteId(String siteId) { - this.siteId = siteId; - } - - public String getSearchConditionSite() { - return searchConditionSite; - } - - public void setSearchConditionSite(String searchConditionSite) { - this.searchConditionSite = searchConditionSite; - } - - public String getAdminYn() { - return adminYn; - } - - public void setAdminYn(String adminYn) { - this.adminYn = adminYn; - } - - public String getGnrlUser() { - return gnrlUser; - } - - public void setGnrlUser(String gnrlUser) { - this.gnrlUser = gnrlUser; - } - - - public String getEmplyrSttusCode() { - return emplyrSttusCode; - } - - public void setEmplyrSttusCode(String emplyrSttusCode) { - this.emplyrSttusCode = emplyrSttusCode; - } - - public String[] getEsntlIdNsttusCode() { - return esntlIdNsttusCode; - } - - public void setEsntlIdNsttusCode(String[] esntlIdNsttusCode) { - this.esntlIdNsttusCode = esntlIdNsttusCode; - } - - public String getEmplyrId() { - return emplyrId; - } - - public void setEmplyrId(String emplyrId) { - this.emplyrId = emplyrId; - } - - public String getSearchCondition_01() { - return searchCondition_01; - } - - public void setSearchCondition_01(String searchCondition_01) { - this.searchCondition_01 = searchCondition_01; - } - - public String getSearchSortCnd() { - return searchSortCnd; - } - - public void setSearchSortCnd(String searchSortCnd) { - this.searchSortCnd = searchSortCnd; - } - - public String getSearchSortOrd() { - return searchSortOrd; - } - - public void setSearchSortOrd(String searchSortOrd) { - this.searchSortOrd = searchSortOrd; - } - - public String getNiceFailUrl() { - return niceFailUrl; - } - - public void setNiceFailUrl(String niceFailUrl) { - this.niceFailUrl = niceFailUrl; - } - - public String getNiceSuccUrl() { - return niceSuccUrl; - } - - public void setNiceSuccUrl(String niceSuccUrl) { - this.niceSuccUrl = niceSuccUrl; - } - - public boolean isMobile() { - return isMobile; - } - - public void setMobile(boolean isMobile) { - this.isMobile = isMobile; - } - - public String getNiceMessage() { - return niceMessage; - } - - public void setNiceMessage(String niceMessage) { - this.niceMessage = niceMessage; - } - - public String getNiceNm() { - return niceNm; - } - - public void setNiceNm(String niceNm) { - this.niceNm = niceNm; - } - - public String getMblDn() { - return mblDn; - } - - public void setMblDn(String mblDn) { - this.mblDn = mblDn; - } - - public String getMberSttus() { - return mberSttus; - } - - public void setMberSttus(String mberSttus) { - this.mberSttus = mberSttus; - } - - public String getSearchStartDate() { - return searchStartDate; - } - - public void setSearchStartDate(String searchStartDate) { - this.searchStartDate = searchStartDate; - } - - public String getSearchEndDate() { - return searchEndDate; - } - - public void setSearchEndDate(String searchEndDate) { - this.searchEndDate = searchEndDate; - } - - public String getCandidateYn() { - return candidateYn; - } - - public void setCandidateYn(String candidateYn) { - this.candidateYn = candidateYn; - } - - public String getSearchBestCategory() { - return searchBestCategory; - } - - public void setSearchBestCategory(String searchBestCategory) { - this.searchBestCategory = searchBestCategory; - } - - public String getSearchDiv() { - return searchDiv; - } - - public void setSearchDiv(String searchDiv) { - this.searchDiv = searchDiv; - } - - public String getSearchTwoDptCategoryCode() { - return searchTwoDptCategoryCode; - } - - public void setSearchTwoDptCategoryCode(String searchTwoDptCategoryCode) { - this.searchTwoDptCategoryCode = searchTwoDptCategoryCode; - } - - public String getSearchThrDptCategoryCode() { - return searchThrDptCategoryCode; - } - - public void setSearchThrDptCategoryCode(String searchThrDptCategoryCode) { - this.searchThrDptCategoryCode = searchThrDptCategoryCode; - } - - public String getSearchStartDate2() { - return searchStartDate2; - } - - public void setSearchStartDate2(String searchStartDate2) { - this.searchStartDate2 = searchStartDate2; - } - - public String getSearchEndDate2() { - return searchEndDate2; - } - - public void setSearchEndDate2(String searchEndDate2) { - this.searchEndDate2 = searchEndDate2; - } - } diff --git a/src/main/java/itn/let/utl/user/service/ExcelUtil.java b/src/main/java/itn/let/utl/user/service/ExcelUtil.java new file mode 100644 index 00000000..5a83eb2b --- /dev/null +++ b/src/main/java/itn/let/utl/user/service/ExcelUtil.java @@ -0,0 +1,143 @@ +package itn.let.utl.user.service; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFDataFormat; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ExcelUtil { + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * 엑셀 파일을 방출합니다. + * + * @param voList 엑셀에 넣고 싶은 vo 리스트 형태로 넣습니다. + * @param header 엑셀 해더 + * @param order 헤더에 해당하는 내용의 vo 필드 이름을 작성합니다. 예를 들어 String userName; 필드의 1번째 해더이름을 "사용자 이름" 으로 정했으면 + * 순서를 맞추어 1번째 order 배열에 "UserName" 이라는 글짜를 입력해줍니다(*주의:첫 문자는 대문자, 낙타체). 첫번째 컬럼에는 "줄번호"가 + * 들어가는데, 이것에 대한 내용은 order에 값을 입력하지 않습니다. + * @param width 컬럼 너비를 설정합니다. length가 해더의 length와 일치할 필요는 없습니다. + * @param title + * @throws Exception + * @return SXSSFSheet + * + * 특징 : 해더보다 내용의 컬럼수가 많을 때 해당 줄의 컬럼은 cut, 해더 이름이 vo와 다르게 되면 해당 컬럼 출력 안됨 require : 날짜 포멧은 + * 지원하지 않습니다. + * + * + * *********************************************************************************************** + * EX String title = "게시판 리스트"; + * int[] width = {1500, 1500, 1500, 3000, 30000, 3000 }; + * String[] header = {"번호", "게시판번호", "작성자", "제목", "내용", "작성일" }; + * String[] order = { "Seq", "UserId", "Title", "Content", "RegDt" }; + * => 첫번째 "번호"에 대한 order 이름이 비어있습니다. + * + * *********************************************************************************************** + */ + public static SXSSFWorkbook makeSimpleFruitExcelWorkbook(List voList, String[] header, String[] order, int[] width, String title) throws Exception { + // 시트 생성 + SXSSFWorkbook workbook = new SXSSFWorkbook(); + SXSSFSheet sheet = workbook.createSheet(title); + for (int i = 0; i < width.length; i++) { + // JSP 2022.02.24 => width 변경 + //sheet.setColumnWidth(0, width[width.length - (i + 1)]); + sheet.setColumnWidth(i, width[i]); + } + + int r = 2;// 줄부터 찍기 + + CellStyle headerstyle = workbook.createCellStyle(); + headerstyle.setAlignment(HorizontalAlignment.CENTER); + headerstyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); + // 헤더 행 생 + Row headerRow = sheet.createRow(r); + // 해더 값 채움 (우측 방향으로) + Cell headerCell = null; + for (int i = 0; i < header.length; i++) { + headerRow.setHeight((short)512); + + headerCell = headerRow.createCell(i); + headerCell.setCellStyle(headerstyle); + headerCell.setCellValue(header[i]); + } + + // 내용 행 및 셀 생성 + Row bodyRow = null; + Cell bodyCell = null; + + bodyRow = sheet.createRow(0); + bodyCell = bodyRow.createCell(0); + bodyCell.setCellValue(title);// 읽어온 데이터 표시 + + //System.out.println("voList.size()"); + //System.out.println(voList.size()); + //System.out.println(voList.size()); + + int c = 0;// 컬럼 + for (Object vo : voList) { + bodyRow = sheet.createRow(r + 1); + bodyCell = bodyRow.createCell(0); + //bodyCell.setCellValue(r + 1); // 첫 컬럼은 줄 번호 + + PropertyDescriptor pd; // 클래스의 필드 메소드를 찾아줌. 이름을 기존에 vo.setUserId() 란 메소드를 통해서만 호출이 가능 했다면, PropertyDescriptor는 이름만으로 메소드 + // 호출이 가능함. 클래스가 변경 되어도 동일한 작동으로 getter&setter 호출이 가능하도록 도와줌 + Method[] methods = vo.getClass().getDeclaredMethods(); // 메소드들 호출함 + // 배열로 준 이름 과 같으면 해당 열 데이터 쓰기 + for (int i = 0; i < order.length; i++) { + for (Method method : methods) { // vo 내부 메소드 반복 + +// System.out.println("i :: "+ i + "methods : "+ methods); + /*System.out.println("voList.method()"); + System.out.println(method.getName());*/ + + if (method.getName().equals("get" + (order[i] == null ? "" : order[i]))) { // vo메소드 이름과 order의 이름 비교 + // getter 호출 준비 + String getMethodName = method.getName().substring(3); // getter의 이름 가져옴 + pd = new PropertyDescriptor(getMethodName, vo.getClass()); + // vo의 데이터 세팅 + String cellData = (pd.getReadMethod().invoke(vo) != null ? pd.getReadMethod().invoke(vo) : "").toString(); + bodyCell = bodyRow.createCell(c++); // 데이터 순서 + if(getMethodName.equals("InstrFee") || getMethodName.equals("SpecialWorkAllow") || getMethodName.equals("DistanceAllow") + || getMethodName.equals("TrafficFee") || getMethodName.equals("AcmdtFee") + || getMethodName.equals("Amt") || getMethodName.equals("Cash") + ){ + + // JSP 2022.02.22 => null 에러 try~catch 문 추가 + try { + double num = Double.parseDouble(cellData); + CellStyle bodyStyle = workbook.createCellStyle(); + bodyCell.setCellValue(num);// 읽어온 데이터 표시 + bodyStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0")); + bodyCell.setCellStyle(bodyStyle); + } + catch (Exception ex) { + bodyCell.setCellValue(cellData); + } + }else { + bodyCell.setCellValue(cellData);// 읽어온 데이터 표시 + } + //System.out.println("@@ : "+getMethodName +" --- " + cellData); + } + } + } + c = 0; + r++; + } + return workbook; + } + +} diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml index b43a863a..a20ea414 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml @@ -933,7 +933,7 @@ - + /* AddrDAO.insertAddrList */ INSERT INTO MJ_ADDR ( @@ -967,7 +967,18 @@ ) - + + + + + DELETE FROM MJ_ADDR + + WHERE MBER_ID = #mberId# + + #addrPhones[]# + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml index 9ff146a3..4f1cfa20 100644 --- a/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml @@ -4,9 +4,10 @@ ========= ======= ================================================= 2023.02.02 우영두 --> - + + INSERT INTO MJ_MSG_DATA @@ -54,6 +55,119 @@ + + INSERT INTO MJ_MSG_DATA + ( + MSG_ID + , MSG_GROUP_ID + , USER_ID + , AGENT_CODE + , CUR_STATE + + , MSG_NOTICETALK_SENDER_KEY + , MSG_NOTICETALK_TMP_KEY + , CALL_TO + , CALL_FROM + , MSG_TYPE + + , SMS_TXT + , BIZ_KAKAO_TITLE + + , BIZ_KAKAO_RESEND_YN + , BIZ_KAKAO_RESEND_DATA + , BIZ_KAKAO_RESEND_TYPE + , BIZ_KAKAO_JSON_FILE + , REQ_DATE + )VALUES + + ( + #[].msgId# + , #[].msgGroupId# + , #[].userId# + , #[].agentCode# + , 0 + + , #[].senderKey# + , #[].templateCode# + , #[].callTo# + , #[].callFrom# + , #[].msgType# + + , #[].templateContent# + , #[].templateTitle# + + , #[].subMsgSendYn# + , #[].subMsgTxt# + , #[].subMsgType# + , #[].bizJsonName# + , #[].reqDate# + ) + + + + INSERT INTO BIZ_ATTACHMENTS + ( + MSG_KEY + , TYPE + , CONTENTS + )VALUES + + ( + #[].msgId# + , 'JSON' + , #[].jsonStr# + ) + + + + + INSERT INTO MJ_MSG_GROUP_DATA + ( + MSG_GROUP_ID, + USER_ID, + CALL_FROM, + SMS_TXT, + + REQ_DATE, + MSG_GROUP_CNT, + MSG_TYPE, + + AGENT_CODE, + EACH_PRICE, + RESERVE_YN, + BEF_CASH, + BEF_POINT, + + TOT_PRICE, + + AT_DELAY_YN, + BIZ_KAKAO_RESEND_ORGNL_TXT, + BIZ_KAKAO_RESEND_TYPE + )VALUES + ( + #msgGroupId#, + #userId#, + #callFrom#, + #templateContent#, + + #reqDate#, + #msgGroupCnt#, + #msgType#, + + #agentCode#, + #eachPrice#, + #reserveYn#, + #befCash#, + #befPoint#, + + #totPrice#, + + #atDelayYn#, + #bizKakaoResendOrgnlTxt#, + #bizKakaoResendType# + ) + + INSERT INTO BIZ_KAKAO_PRICE ( diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index 1ce05fbd..e924647a 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -2319,7 +2319,8 @@ EVENT_YN, DELAY_YN, AT_DELAY_YN, - BIZ_KAKAO_RESEND_ORGNL_TXT + BIZ_KAKAO_RESEND_ORGNL_TXT, + SUBJECT_CHK_YN ) VALUES @@ -2345,7 +2346,8 @@ #eventYn#, #delayYn#, #atDelayYn#, - #kakaoSubMagOrgnlTxt# + #kakaoSubMagOrgnlTxt#, + #subjectChkYn# ) @@ -3307,10 +3309,16 @@ , ( ) AS RESULT - + from + MJ_MSG_DATA A , + MJ_MSG_GROUP_DATA B + where + A.MSG_GROUP_ID = B.MSG_GROUP_ID + /*and IFNULL(B.DEL_FLAG, 'N') = 'N'*/ + /*and A.DEL_FLAG = 'N'*/ AND A.USER_ID = #userId# AND B.USER_ID = #userId# - AND B.RESERVE_C_YN = 'N' + /*AND B.RESERVE_C_YN = 'N'*/ ORDER BY 1=1 , msgGroupId DESC , sentDate DESC @@ -4021,6 +4029,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -196,6 +197,16 @@ DELETE FROM MAIN_POPUP WHERE POP_ID=#popId# + + /* mainPopup.deleteMainPopupLinkInfo */ + + DELETE FROM MAIN_POPUP_LINK + WHERE + POP_ID=#popId# + AND + POP_LINK_ID = #popLinkId# + + /*mainPopup.resetMainPopupSort*/ diff --git a/src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml index 1fd5bf05..45219fc3 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml @@ -1083,7 +1083,6 @@ POP_ID , MLINK , COORDS - , SORT ) VALUES @@ -1091,7 +1090,6 @@ #[].popId# , #[].mlink# , #[].coords# - , #[].sort# ) @@ -1123,7 +1121,6 @@ SET MLINK = #mlink# , COORDS = #coords# - , SORT = #sort# WHERE POP_ID = #popId# diff --git a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml index 35067b05..eb97a567 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml @@ -1315,6 +1315,7 @@ ADMIN_SMS_NOTICE_YN AS adminSmsNoticeYn ,PRE_PAYMENT_YN AS prePaymentYn ,SMISHING_YN AS smishingYn + ,AT_SMISHING_YN AS atSmishingYn ,AUTO_CASH AS autoCash ,IFNULL(BLINE_CODE, 'N') AS blineCode ,IFNULL(RECOMMEND_ID, '') AS recommendId diff --git a/src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp b/src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp index 2e641f85..da771b41 100644 --- a/src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp +++ b/src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp @@ -553,6 +553,9 @@ function fn_save_menuInfo(menuNo) {
+
+ +
코드를 선택하세요 diff --git a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp index e8aa3a6a..9e54b0c9 100644 --- a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp +++ b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp @@ -22,6 +22,7 @@ <%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> +<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%> <% pageContext.setAttribute("newLineChar", "\r\n"); %> <% pageContext.setAttribute("newLineChar2", "\n"); %> <% String serverName = request.getServerName(); %> @@ -4157,8 +4158,10 @@ function fnInputSmsTxt(){ - - - - - - - - - - - - - diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp index fc77da82..7231f629 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp @@ -341,8 +341,8 @@ function whoisIpCountry() { } function actionLogin() { - location.href=""; - /* +// location.href=""; + // 아이디 공백 제거 document.loginForm.id_text.value = $.trim(document.loginForm.id_text.value); @@ -353,16 +353,6 @@ function actionLogin() { alert("비밀번호를 입력하세요"); return; } else { - - // Whois IP 국가코드 - //whoisIpCountry(); - setTimeout(function() { - if (isKoreaIpAddress == false) { - alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다."); - location.href='/web/uat/uia/actionLogout.do'; - return false; - } - // 로그인 START var rsa = new RSAKey(); rsa.setPublic($('#RSAModulus').val(),$('#RSAExponent').val()); @@ -373,13 +363,84 @@ function actionLogin() { $("#id").val(rsa.encrypt(id.val().toLowerCase())); $("#password").val(rsa.encrypt(pw.val())); - document.loginForm.action=""; saveid(document.loginForm); - document.loginForm.submit(); - }, 600); - + + var checkForm = $("form[name=loginForm]").serialize() ; + + $.ajax({ + type : "POST", + async : false, + url : "/web/user/login/actionSecurityLoginBeforeHpAjax.do", + data : checkForm, + dataType:'json', + success : function(data) { + if (data.status=="success"){ + + document.loginForm.passFlag.value = data.passFlag; + if(data.passFlag == "Y") + { + actionLogin_end(); + } + else + { + goLoginPage(id.val(), pw.val(), "secure"); + } + }else if (data.status=="fail"){ + + if (data.returnType == "A"){ + //휴면 회원 + document.loginForm.action=""; + document.loginForm.submit(); + }else if (data.returnType == "B"){ + //기업회원 기업정보 기입 + document.cmpChangeForm.mberId.value = data.mberId; + document.cmpChangeForm.action=""; + document.cmpChangeForm.submit(); + }else if (data.returnType == "C"){ + document.cmpChangeForm.mberId.value = data.mberId; + document.cmpChangeForm.action=""; + document.cmpChangeForm.submit(); + }else{ + //로그인 실패 page이동 + goLoginPage(id.val(), pw.val(), data.msg); + } + } + + //alert(JSON.stringify(data)); + console.log("sucess data1 : " + JSON.stringify(data)); + if (data.isSuccess == true) { + console.log("fn_click_banner_add_stat sucess data2 : " + JSON.stringify(data)); + } + else { + console.log("data.isSuccess not true "); + console.log("sucess data.msg : " + data.msg); + console.log("sucess data1 : " + JSON.stringify(data)); + } + }, + error : function(xhr, status, error) { + console.log("fn_click_banner_add_stat error : " + error); + console.log("fn_click_banner_add_stat xhr : " + JSON.stringify(xhr) + "\r\status : " + JSON.stringify(status) + "\r\error : " + JSON.stringify(error)); + return false; + } + }); } - */ + +} + +function goLoginPage(id, pw, headerLoginResult){ + document.loginForm.id.value = id; + document.loginForm.password.value = pw; + document.loginForm.headerLoginResult.value = headerLoginResult; + document.loginForm.action = ""; + + document.loginForm.submit(); +} + +//아이디/휴대폰 번호 체크 +function actionLogin_end(){ + document.loginForm.action=""; + saveid(document.loginForm); + document.loginForm.submit(); } function saveid(form) { @@ -1636,14 +1697,19 @@ function actionLogin() { + + +
- - + +<%-- --%> + ${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') } +<%-- --%> - @@ -4190,7 +4193,8 @@ function fnInputSmsTxt(){ [예약]
- +<%-- --%> + ${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
- @@ -4367,8 +4371,11 @@ function fnInputSmsTxt(){
- - + +<%-- --%> +<%-- --%> + + ${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') } - @@ -4400,7 +4407,8 @@ function fnInputSmsTxt(){ [예약]
- + ${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'yyyy-MM-dd HH:mm') } +<%-- --%>
- @@ -4586,8 +4594,8 @@ function fnInputSmsTxt(){
- - + + - @@ -4605,7 +4613,7 @@ function fnInputSmsTxt(){ - [스미싱의심] + [스미싱의심] - @@ -4785,6 +4793,10 @@ function fnInputSmsTxt(){ + + + +<%-- ${fnc:setStrToDataFormatter(kakaoResultList.regDate, 'MM-dd HH:mm') } --%> @@ -4925,8 +4937,10 @@ function fnInputSmsTxt(){ - - + + ${fnc:setStrToDataFormatter(kakaoReserveList.regDate, 'MM-dd HH:mm') } +<%-- --%> +<%-- --%> @@ -5073,8 +5087,11 @@ function fnInputSmsTxt(){ - - +<%-- --%> + ${fnc:setStrToDataFormatter(kakaoDelayInfo.regDate, 'MM-dd HH:mm') } +<%-- --%> +<%-- --%> +<%-- --%> - diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp index 614e740f..ef23eab8 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp @@ -31,8 +31,18 @@ $( document ).ready(function(){ makeDate('ntceBgndeYYYMMDD'); makeTomorrow('ntceEnddeYYYMMDD'); - - + // class="mlink"인 모든 input 요소에 대해 이벤트 리스너 추가 + document.getElementById('linkTable').addEventListener('paste', function(event) { + if (event.target.classList.contains('mlink')) { + let pastedText = event.clipboardData.getData("text"); + console.log("붙여넣기 한 URL:", pastedText); + let cleanedUrl = cleanUrlParameters(pastedText); + setTimeout(() => { + event.target.value = cleanedUrl; + console.log("정리된 URL:", cleanedUrl); + }, 0); + } + }); }); /** @@ -40,39 +50,37 @@ $( document ).ready(function(){ * @param {string} url 원본 URL 문자열 * @returns {string} 불필요한 파라미터가 제거된 URL */ - function cleanUrlParameters(url) { - try { - // URL이 절대경로 (/web/... 형태)인지 확인 - let hasFullDomain = url.startsWith("http://") || url.startsWith("https://"); - let urlObj; - - if (hasFullDomain) { - // 도메인이 포함된 URL 처리 - urlObj = new URL(url); - } else { - // 절대경로 URL 처리 (가상의 도메인 추가 후 파싱) - urlObj = new URL("https://www.munjaon.co.kr" + url); - } - - let params = new URLSearchParams(urlObj.search); - - // ❗ 값이 비어있는 모든 파라미터 제거 - for (let [key, value] of [...params.entries()]) { // `params.entries()`를 배열로 변환하여 반복 - if (!value.trim()) { // 값이 비어있는 경우 제거 - params.delete(key); - } - } - - // 정리된 URL 반환 - let cleanedPath = urlObj.pathname + (params.toString() ? "?" + params.toString() : ""); - // 정리된 URL 반환 (도메인을 제거하고 절대경로만 반환) - return cleanedPath.replace(/^https:\/\/www\.munjaon\.co\.kr/, ""); - - } catch (e) { - console.warn("잘못된 URL 형식:", url); - return url; // URL 파싱 실패 시 원본 유지 +function cleanUrlParameters(url) { + try { + // URL이 절대경로 (/web/... 형태)인지 확인 + let hasFullDomain = url.startsWith("http://") || url.startsWith("https://"); + let urlObj; + + if (hasFullDomain) { + // 도메인이 포함된 URL 처리 + urlObj = new URL(url); + } else { + // 절대경로 URL 처리 (가상의 도메인 추가 후 파싱) + urlObj = new URL("https://www.munjaon.co.kr" + url); } + + let params = new URLSearchParams(urlObj.search); + + // 값이 비어있는 모든 파라미터 제거 + for (let [key, value] of [...params.entries()]) { + if (!value.trim()) { // 값이 비어있는 경우 제거 + params.delete(key); + } + } + + // 정리된 URL 반환 + let cleanedPath = urlObj.pathname + (params.toString() ? "?" + params.toString() : ""); + return cleanedPath.replace(/^https:\/\/www\.munjaon\.co\.kr/, ""); + } catch (e) { + console.warn("잘못된 URL 형식:", url); + return url; // URL 파싱 실패 시 원본 유지 } +} //게시기간이 없으면 초기 값 입력 function makeDate(id){ @@ -141,17 +149,6 @@ function validate(method_parm) { for (let i = 0; i < linkRows.length; i++) { let linkInput = document.querySelector('input[name="mainPopupLinkList['+i+'].mlink"]'); let coordInput = document.querySelector('input[name="mainPopupLinkList['+i+'].coords"]'); - let sortInput = document.querySelector('input[name="mainPopupLinkList['+i+'].sort"]'); - - if (!linkInput.value && !coordInput.value) { - if(sortInput.value){ - let trElement = sortInput.closest("tr"); - if (trElement) { - trElement.remove(); - } - } - continue; // 요소가 없으면 건너뛴다. - } if (linkInput.value.trim() === "") { alert('['+(i + 1)+']번째 링크주소를 입력해 주십시오'); @@ -165,11 +162,6 @@ function validate(method_parm) { return false; } - if (sortInput.value.trim() === "") { - alert('['+(i + 1)+']번째 순서를 입력해 주십시오'); - sortInput.focus(); - return false; - } } console.log('isTbodyEmpty("tbody_fiielist") : ', isTbodyEmpty("tbody_fiielist")); @@ -286,30 +278,77 @@ function addLinkRow() { coordTd.innerHTML = ''; // 세 번째 컬럼 (링크 좌표) - let sortTh = document.createElement("th"); - sortTh.innerHTML = '순서'; let sortTd = document.createElement("td"); - sortTd.innerHTML = ''; - + sortTd.setAttribute("colspan", "2"); + sortTd.innerHTML = ''; // tr에 추가 newRow.appendChild(linkTh); newRow.appendChild(linkTd); newRow.appendChild(coordTh); newRow.appendChild(coordTd); - newRow.appendChild(sortTh); newRow.appendChild(sortTd); // tbody에 추가 tbody.appendChild(newRow); } - +function fn_linkDel(p_linkId) { + // event.target을 저장 + const $target = $(event.target); + + if (!p_linkId) { + + $target.closest('tr').remove(); + }else{ + + var p_popId = $('#popId').val(); + var p_popLinkId = p_linkId; + + var sendData = { + "popId" : p_popId + , "popLinkId" : p_popLinkId + } + + $.ajax({ + type: 'POST', + url: '', + contentType: 'application/json', + data: JSON.stringify(sendData), + dataType: 'json', + success : function(data) { + alert(data.msg); + console.log('data : ', data); + if(data.status == 'OK') + { + console.log('data OK : ', data); + $target.closest('tr').remove(); + } + else + { + // 실패 처리 로직 + } + }, + error : function(jqXHR, textStatus, errorThrown) { + console.error("AJAX Error:", textStatus, errorThrown); + console.error("Response:", jqXHR.responseText); + } + }); + + } + + + +} @@ -441,30 +480,12 @@ function addLinkRow() { 순서 - + +
[1]링크주소 - - 링크좌표 - - 순서 - -
+ + + + + + + + + + + + + + + + + + + + + + + + +
채널ID + + + +
템플릿 + + + +
+
    +
  • * 변수명 설정파일을 다운로드 받으신 후 전송대상과 변수를 입력 후 업로드해주세요.
  • +
  • * 엑셀서식은 반드시 텍스트 서식으로 등록해주세요.
  • +
  • * 한번에 전송가능한 최대 발송건은 500건입니다.
  • +
  • * 배송조회시 운송장 번호는 숫자만 등록해주세요.
  • +
+ + +
+
받는사람 +
+
+ + + +
+ + * 중복번호는 한번만 발송됩니다. + +
+ + * 한번에 전송가능한 최대 발송건은 500건 입니다. + +
+
+
+
+
+ + +
+
+

휴대폰

+ + +
+ + + + + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+

휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능

+ (예시) 010-1234-0001(O) / 010-123-0001(X) +
+
+
+
+
+
+ + +
+
+

0건 / 중복 0

+ +
+
+
+
+
+ + + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+

발송금액 :

+ +
+

0.0

+
+
+ +
+ + + + + + +
+
+
+
+
+

대체문자

+ +
+
+ + + + + + + + + + + + + + + + +
발신번호 + + + +
내용 +
+
+ +
    + + + +
    +
    +

    + 0 / + + 90byte +

    + 단문 +
    +
    +
    +
    + + + + + + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +

    + +
    +
    + 알림톡 도착 +
    +
    +

    템플릿을 선택해 주세요

    +
    +
    + +
    +
    + +
    + +
    +
    +

    ※ 단말기 설정에 따라 다르게 보일 수 있습니다

    +

    +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + + +
    +
    +
    +
    + 날짜 : +
    + +
    + +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    +
    +
    + + + + + + + +
    + +
    + + + +
    + +
    + + + + + +
    +
    + +
    +
    +
    + + + +
    + +
    + + +
    +
    + + +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp.jsp new file mode 100644 index 00000000..b6d64ba6 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp.jsp @@ -0,0 +1,219 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + + + + + + + +
    +
    +
    +
    Loading
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + <%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %> + + +
    +
    +
    +
    +
    +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    + + + +
    +
    +
    +
    + 날짜 : +
    + +
    + +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp new file mode 100644 index 00000000..ee9dbd7a --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp @@ -0,0 +1,916 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + + +
    + +
    + + + +
    + +
    + + + +
    + + + + + + + + + +
    +
    +

    - 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다.

    +

    - 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.

    +

    - 구분선(|), 역슬래시(\, ₩), 큰따옴표("), 이모지(이모티콘) 등 발송불가 특수문자는 저장되지 않습니다.

    +

    - 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.

    +

    - 주소록 등록이 어려우신 경우에는 주소록 입력대행 메뉴를 이용하실 수 있습니다.

    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + + +
    엑셀입력 표
    +
    +
    +

    파일 붙여넣기마우스로 엑셀파일을 여기에 끌어다 놓으세요

    +
    + + +
    +
    +
    + + +
    +

    + 총 0건 + / 중복 0건 + / 오류 0건 + +

    + + + + +

    + +
    + + + + +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp index 38fbb9f0..10115704 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp @@ -3,6 +3,7 @@ <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ page import="itn.com.cmm.LoginVO" %> @@ -48,102 +49,145 @@ $(document).ready(function(){ } }); - - if($("#tdType").val() == "groupList" || $("#tdType").val() == ""){ - $("#privateListTable").hide(); - $("#groupListTable").show(); - }else{ - $("#privateListTable").show(); - $("#groupListTable").hide(); - } }); +function fnReservCancel(msgGroupId){ + + var form = document.resCancelForm; + var loginVO = '${LoginVO}'; + + form.msgGroupId.value = msgGroupId; + + if(loginVO == "" || loginVO == null){ + + alert("로그인 후 이용이 가능합니다."); + return false; + + } + + var data = new FormData(form); + url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do"; + + if(confirm("정말 예약을 취소하시겠습니까?")){ + + $.ajax({ + type: "POST", + url: url, + data: data, + dataType:'json', + async: false, + processData: false, + contentType: false, + cache: false, + success: function (returnData, status) { + if(status == 'success'){ + if("fail"==returnData.result){ + + alert(returnData.message); + return false; + } + + var smsCnt = returnData.resultSts; + + alert("예약 발송이 정상적으로 취소 되었습니다."); + + linkPage(1); + + } else if(status== 'fail'){ + alert(returnData.message); + } + }, + error: function (e) { alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e); } + }); + + } + +} + +function fn_sentDetailView(msgGroupId) { + // msgGroupId 값을 form에 설정 + $("#searchForm #msgGroupId").val(msgGroupId); + + // form을 해당 URL로 제출 + $("#searchForm").attr("action", "/web/kakao/sent/selectKakaoSentDetailView.do"); + $("#searchForm").submit(); +} + -
    - -

    -
    - - + - -
    -
    - -
    + +
    + + +
    - - - - - - - + - + - <%-- --%> + + + + + + + - - - - - - - + - - - - - + + + + + + + + + + + + - - - - - + - + + + + + + - - - - - - - - - - <%-- --%> - - - - - - - <%----%> - +
    + - 발송일시 + 발송일시
    - 형태 + 형태
    - +
    내용 - 받는사람 -
    - -
    -
    - 발신번호 -
    - -
    -
    - 발송건수 + 내용발송건수
    카카오톡 결과건수대체문자 결과건수대기카카오톡결과대체문자결과금액(원)진행상황
    성공실패성공실패
    + - disabled> + disabled> + @@ -165,240 +209,89 @@ $(document).ready(function(){ -

    - 알림톡 - 친구톡 -

    +
    + 알림톡 + 친구톡 -<%-- --%> - + +
    + + 예약 + + + 분할 + + + + + +
    +
    + + + + +

    +
    +

    +
    +

    +
    +

    +
    + + + + + - + + - -

    - - - - - - - - 명 -

    -
    - -

    + + -

    +

    정상수신

    - -

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"> -

    -

    정상수신

    - -

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"> -

    -
    -

    - - 0 -

    -

    실패/대기

    - -

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"> - /

    -

    실패

    -

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"> -

    -

    - - 0 -

    -
    발송 내역이 없습니다.발송 내역이 없습니다.
    - - - - - + +
    -
    - - - - - +
    +
    - - +
    -
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax_back_250318.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax_back_250318.jsp new file mode 100644 index 00000000..43cfa302 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax_back_250318.jsp @@ -0,0 +1,405 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + +
    + +

    +
    + + +
    +
    + +
    + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + <%----%> + + + + + + + + + +
    + + + + 발송일시 +
    + +
    +
    + 형태 +
    + +
    +
    내용 + 받는사람 +
    + +
    +
    + 발신번호 +
    + +
    +
    + 발송건수 +
    + +
    +
    카카오톡 결과건수대체문자 결과건수
    + + disabled> + + + + + + <%-- + 20240906 추가 + 발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다. + 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 + --%> +

    +
    + +

    +
    +
    +
    + +

    +
    +
    +
    +

    + 알림톡 + 친구톡 +

    +
    +<%-- --%> + + + + +

    + + + + + + + + 명 +

    +
    + +

    +
    + +

    +
    +
    +<%--

    ${resultAllSentList.msgGroupId}

    --%> +

    정상수신

    + +

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"> +

    +

    정상수신

    + +

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"> +

    +
    +

    + + 0 +

    +

    실패/대기

    + +

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"> + /

    +

    실패

    +

    onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"> +

    +

    + + 0 +

    +
    발송 내역이 없습니다.
    +
    + + + + + + +
    +
    + + + + + +
    +
    + + +
    +
    + +
      + +
    +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp index f594a247..d8354c3c 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp @@ -5,111 +5,112 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <% pageContext.setAttribute("newLineChar", "\n"); %> -
    - -
      -
    • - -
    • -
      -
    -
    +
    + +
    +
      +
    • + +
    • +
      +
    +
    + -
    -
    -
    - - - - - 알림톡 - - - 친구톡 - - - - - -
    -
    -
    -
    - - - - 알림톡 도착 - - - 친구톡 도착 - - - - -
    -
    - - - - -

    -

    -
    - -
    - -
    -
    - - -
    - - -

    - - - -

    - - - - - -

    -
    - - -

    -
    - - -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    - - 대체문자 -
    -
    - ${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "
    ")} -
    + +
    +
    +
    +

    + +
    +
    + + + 알림톡 도착 + 친구톡 도착 + +
    +
    + + +

    +

    +
    + +
    + +
    +
    +
    + +

    + +

    + + + +

    +
    + +

    +
    +
    + + + + + + + + + + + +
    +
    +
    +

    ※ 단말기 설정에 따라 다르게 보일 수 있습니다

    +
    +
    + + + +
    +
    +
    +

    문자내용

    +
    + + + + 단문 + 장문 + + + 단문 + + + 장문 + + + +
    + 글자크기 + +
    +
    +
    +

    ${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "
    ")}

    +
    +
    +
    +
    +

    ※ 단말기 설정에 따라 다르게 보일 수 있습니다

    +
    + +
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax_back_250320.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax_back_250320.jsp new file mode 100644 index 00000000..f594a247 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax_back_250320.jsp @@ -0,0 +1,115 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<% pageContext.setAttribute("newLineChar", "\n"); %> + +
    + +
      +
    • + +
    • +
      +
    +
    + +
    +
    +
    + + + + + 알림톡 + + + 친구톡 + + + + + +
    +
    +
    +
    + + + + 알림톡 도착 + + + 친구톡 도착 + + + + +
    +
    + + + + +

    +

    +
    + +
    + +
    +
    + + +
    + + +

    + + + +

    + + + + + +

    +
    + + +

    +
    + + +
    + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + 대체문자 +
    +
    + ${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "
    ")} +
    +
    +
    + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp new file mode 100644 index 00000000..c00dd4d1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp @@ -0,0 +1,922 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> +<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ page import="itn.com.cmm.LoginVO" %> +<% pageContext.setAttribute("newLineChar", "\n"); %> + + + + + + +
    + + + + +
    + +
    +
    +

    발송결과 상세

    + +
    + + + +
    + +
    + +
    +
    +
    +

    발송정보

    +

    +
    +
    +
    +
    발송일시
    +
    ${result.reqDate}
    +
    + +
    +
    등록일시
    +
    ${result.regDate}
    +
    +
    +
    +
    형태
    +
    + 알림톡 + 친구톡 +
    +
    +
    +
    발송건수
    +
    +
    +
    +
    채널정보
    +
    +
    +
    +
    진행상황 + + +
    +
    예약
    + + +
    + +
    + ${result.divideText } +
    +
    +
    +
    +
    + +
    +
    + + + + 예약취소() + + + + + +

    +
    +
    +
    +
    +
    +
    +
    +
    발송요금(합계)
    +
    + + + + + 0 + +
    + +
    +
    +
    +
    · 카카오톡
    +
    + +
    +
    +
    +
    · 대체문자
    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +

    상세결과

    +

    +
    +
    +
    +
    +
    전체건수
    +
    +
    +
    +
    +
    +
    성공건수
    +
    건(${result.successPct})
    +
    +
    +
    +
    +
    +
    +
    대기건수
    +
    건(${result.waitingPct})
    +
    +
    +
    +
    +
    실패건수
    +
    건(${result.failedPct})
    +
    +
    +
    +

    * 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.

    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + + +
    +
    + +
    + + + + +
    + +
    + + + +
    + +
    + + + +
    + " /> + + + + + + + + + +
    + + +
    + +
    + + +
    + + + + +
    + +
    + + +
    + diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp index d3c53069..d418e9f5 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp @@ -45,20 +45,6 @@ $(document).ready(function(){ threefulstday = prevMonth(3); threefuledday = today(); - /* 목록 정렬 항목 아이콘 표시 */ - /* var searchSortCnd = $("[name='searchSortCnd']").val(); - var searchSortOrd = $("[name='searchSortOrd']").val(); - - if (searchSortCnd != "" && searchSortOrd != "" && searchSortCnd != undefined && searchSortOrd != undefined) { - var $sort_div = $("#sort_"+ searchSortCnd); - var sortClass = 'sortBtn' ; - - if (searchSortOrd == "desc") sortClass = "sortBtnDesc"; - - $sort_div.replaceClass('sortBtn' , sortClass) ; - $sort_div.attr("sortOrd", searchSortOrd); - } */ - // 정렬 항목 이벤트 $(document).on('click', '.sort', function (){ listSortOrd(this); @@ -101,6 +87,9 @@ $(document).ready(function(){ }); + //발송건수 셋 + cntSet(); + }); //오늘날짜 구하기 @@ -147,56 +136,16 @@ function linkPage(pageNo){ form.pageIndex.value = pageNo; var sendData = $(document.searchForm).serializeArray(); - $(".msgSentAllLoad").html('
    LOADING...
    '); +// $(".msgSentAllLoad").html('
    LOADING...
    '); + $(".msgSentAllLoad tbody:first").html('LOADING...'); $(".msgSentAllLoad").load("/web/kakao/sent/selectKakaoSentListViewAjax.do", sendData ,function(response, status, xhr){ + if (status === 'success') { + $(this).html(response); + } }); } -//선택 삭제 실행 - -/* -function fnDelete(){ - - var msgId = []; - if($("input:checkbox[name='msgSentDel']").is(":checked")==false){ - alert("한 개 이상의 전송 내역을 선택하세요"); - return; - } - - $("input:checkbox[name='msgSentDel']:checked").each(function(index){ - var disabledChk = $(this).prop('disabled'); - if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장 - msgId[index] = $(this).val(); - } - }); - - if(msgId.length > 0){ - - //22.04.25 구글 독스 alert 기준으로 이지우가 수정 - // if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) - if(confirm("선택한 목록을 삭제하시겠습니까?")){ - - document.searchForm.msgGroupIdList.value = msgId; - var sendData = $(document.searchForm).serializeArray(); - - $(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){ - }); - -// var form = document.searchForm; -// form.action="/web/mjon/msgsent/selectMsgSentView.do"; -// form.submit(); - } - - }else{ - - alert("삭제할 문자를 선택해 주세요."); - return false; - - } - -} - */ //상세보기 버튼 실행 function fnRevDetailPop(msgGroupId, msgId){ document.resPopForm.msgGroupId.value = msgGroupId; @@ -204,20 +153,11 @@ function fnRevDetailPop(msgGroupId, msgId){ var sendData = $(document.resPopForm).serializeArray(); var form = document.searchForm; - if (form.listType.value == "privateList") { - // 개인별 - $("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailData2Ajax.do", sendData ,function(response, status, xhr){ - $('#tooltopClick').trigger('click'); - }); - } - else { - // 전송건별 - $("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailDataAjax.do", sendData ,function(response, status, xhr){ - // 상세보기 클릭때마다 툴팁 1 tab이 열리게 설정 - popupTab($('#atBtn'),'1'); - $('#tooltopClick').trigger('click'); - }); - } + $("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailDataAjax.do", sendData ,function(response, status, xhr){ + // 상세보기 클릭때마다 툴팁 1 tab이 열리게 설정 + popupTab($('#atBtn'),'1'); + $('#tooltopClick').trigger('click'); + }); } @@ -231,12 +171,6 @@ function fnListLoad(pageType, tabNum){ $tab.siblings("li.btn_tab").removeClass("active"); $tab.siblings("li.tab").find("button").removeAttr("title"); - if(pageType == 'fail'){ - form.listType.value = "privateList"; - $(".tab_depth1").hide(); - } else { - $(".tab_depth1").show(); - } form.stateType.value = pageType; linkPage(1); @@ -311,182 +245,6 @@ $(document).on('click', '.msgGgoupList', function(){ }); -$(document).on('click', '.msgPrivateList', function(){ - - var form = document.searchForm; - form.listType.value = "privateList"; - linkPage(1); - -}); - - -function fnDeleteAddrNo(listType){ - - var msgId = []; - if($("input:checkbox[name='msgSentDel']").is(":checked")==false){ - alert("한 개 이상의 전송 내역을 선택하세요"); - return; - } - - $("input:checkbox[name='msgSentDel']:checked").each(function(index){ - - var disabledChk = $(this).prop('disabled'); - if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장 - - msgId[index] = $(this).val(); - - } - - }); - - if(msgId.length > 0){ - - //22.04.25 구글 독스 alert 기준으로 이지우가 수정 - /* if(confirm("선택한 수신번호를 주소록에서 삭제하시겠습니까? 삭제된 주소록은 복구가 불가능 합니다.")){ */ - if(confirm("선택하신 번호를 주소록에서 삭제하시겠습니까?")){ - - var form = document.searchForm; - - form.msgGroupIdList.value = msgId; - form.listType.value = listType; - - var data = new FormData(form); - url = "/web/mjon/msgsent/deleteAddrNoDataAjax.do"; - - $.ajax({ - type: "POST", - url: url, - data: data, - dataType:'json', - async: false, - processData: false, - contentType: false, - cache: false, - success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - if("fail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if("loginFail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if(returnData.resultCnt == '0'){ - - alert("주소록에 삭제할 연락처가 없습니다."); - return false; - - }else{ - - alert(returnData.message); - return false; - - } - - } else if(status== 'fail'){ - alert(returnData.message); - } - }, - error: function (e) { alert("주소록 삭제에 실패하였습니다."); console.log("ERROR : ", e); } - }); - - } - - }else{ - - alert("삭제할 문자를 선택해 주세요."); - return false; - - } - -} - -function fnAddBlockNo(listType){ - - var msgId = []; - if($("input:checkbox[name='msgSentDel']").is(":checked")==false){ - alert("선택된 항목이 없습니다."); - return; - } - - $("input:checkbox[name='msgSentDel']:checked").each(function(index){ - - var disabledChk = $(this).prop('disabled'); - if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장 - - msgId[index] = $(this).val(); - - } - - }); - - if(msgId.length > 0){ - - //if(confirm("선택한 수신번호를 주소록에서 삭제하시겠습니까? 삭제된 주소록은 복구가 불가능 합니다.")){ - - var form = document.searchForm; - - form.msgGroupIdList.value = msgId; - form.listType.value = listType; - - var data = new FormData(form); - url = "/web/mjon/msgsent/insertAddBlockNoDataAjax.do"; - - $.ajax({ - type: "POST", - url: url, - data: data, - dataType:'json', - async: false, - processData: false, - contentType: false, - cache: false, - success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - if("fail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if("loginFail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if(returnData.resultCnt == '0'){ - - alert("주소록에 삭제할 연락처가 없습니다."); - return false; - - }else{ - - alert(returnData.message); - return false; - - } - - } else if(status== 'fail'){ - alert(returnData.message); - } - }, - error: function (e) { alert("수신거부번호 등록에 실패하였습니다."); console.log("ERROR : ", e); } - }); - - //} - - }else{ - - alert("수신거부번호를 등록할 문자를 선택해 주세요."); - return false; - - } - - -} - function fnReSendMsg(){ var msgSeq = []; @@ -514,27 +272,6 @@ function fnReSendMsg(){ } -function fnMsgSFDetailList(msgGroupId, resultType){ - - var form = document.resPopForm; - form.msgGroupId.value = msgGroupId; - form.resultType.value = resultType; - - //만들려는 팝업의 크기 - var popup_wid = '1280'; - var popup_ht = '700'; - - var popup_left = (window.screen.width / 2) - (popup_wid / 2); - var popup_top =(window.screen.height / 2) - (popup_ht / 2); - - $("#resPopForm").attr("target","msgSFDetailPop"); - - window.open('', 'msgSFDetailPop', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top ); - $("#resPopForm").attr({"action":"/web/kakao/sent/selectKakaoSentSFDetailListAjax.do", "method":"post"}).submit(); - -} - - /* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ function fnShowPrintPopup(tabType, type) { //만들려는 팝업의 크기 @@ -552,129 +289,6 @@ function fnShowPrintPopup(tabType, type) { } -function addrGroupDuplCnt() { - document.searchForm.addrGrpNm.value = $('#grpNm').val(); - - var data = $('#searchForm').serialize(); - //var data = new FormData(form); - - var flag = true; - var url = "/web/addr/selectDuplAddrGroupNameAjax.do"; - - $.ajax({ - async: false, - type: "post", - url: url, - data: data, - dataType:"JSON", -// contentType: false, -// processData: false, - cache: false, - success: function (returnData, status) { - if("dupl"==returnData.result1) { - flag = false; - } - }, - error: function (e) { - alert("error"); - console.log("ERROR : ", e); - } - }); - - return flag; -} - -//주소록 그룹 등록 기능 -function fnAddAddrNo(){ - - var addrGrpNm = $('#grpNm').val(); //입력 그룹 이름 불러오기 - - var msgId = []; - if($("input:checkbox[name='msgSentDel']").is(":checked")==false){ - alert("한 개 이상의 전송 내역을 선택하세요"); - return; - } - - - $("input:checkbox[name='msgSentDel']:checked").each(function(index){ - - var disabledChk = $(this).prop('disabled'); - if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장 - - msgId[index] = $(this).val(); - - } - - }); - - if(msgId.length > 0 && addrGrpNm != ''){ - - - //주소록 그룹명 중복체크 - if(!addrGroupDuplCnt()) { - alert("이미 등록되어있는 주소록입니다."); - return false; - } - - - var form = document.searchForm; - - form.msgGroupIdList.value = msgId; - form.addrGrpNm.value = addrGrpNm; - - var data = new FormData(form); - url = "/web/mjon/msgsent/insertAddAddrGrpDataAjax.do"; - - $.ajax({ - type: "POST", - url: url, - data: data, - dataType:'json', - async: false, - processData: false, - contentType: false, - cache: false, - success: function (returnData, status) { - if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 - if("fail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if("loginFail"==returnData.result){ - - alert(returnData.message); - return false; - - }else if(returnData.resultCnt == '0'){ - - alert("주소록에 등록할 연락처가 없습니다."); - return false; - - }else{ - - alert(returnData.message); - $('#grpNm').val(""); //입력한 그룹명 초기화 - $(".tooltip-close").trigger("click"); - return false; - - } - - } else if(status== 'fail'){ - alert(returnData.message); - } - }, - error: function (e) { alert("주소록 등록에 실패하였습니다."); console.log("ERROR : ", e); } - }); - }else{ - - alert("등록할 문자를 선택해 주세요."); - return false; - - } - -} - /* 윈도우팝업 열기 */ function infoPop(pageUrl){ document.popForm.pageType.value = pageUrl; @@ -685,33 +299,90 @@ function infoPop(pageUrl){ document.popForm.submit(); } +function cntSet(){ + + $('#ntceBgnde').val($('#startDate').val()); + $('#ntceEndde').val($('#endDate').val()); + + $.ajax({ + url: '/web/kakao/sent/selectKakaoSentViewTotalSumAjax.do', + type: 'POST', +// contentType: 'application/json', + contentType: false, + processData: false, + data: new FormData(document.searchForm), + success: function(response) { + + cntView('allCnt', response.allCnt); + cntView('atCnt', response.atCnt); + //cntView('ftCnt', response.ftCnt); + }, + error: function(error) { + alert("error"); + }, + beforeSend : function(xmlHttpRequest) { + //로딩창 show + $('#lodingBefore').show(); + $('#lodingAfter').hide(); + }, + complete : function(xhr, textStatus) { + //로딩창 hide + $('#lodingBefore').hide(); + $('#lodingAfter').show(); + } + }); +} + +function cntView(type, obj){ + $('#'+type+' span[name="allCnt"]').text(obj.allCount.toLocaleString()); + $('#'+type+' span[name="waitCnt"]').text(obj.waitCount.toLocaleString()); + $('#'+type+' span[name="succCnt"]').text(obj.successCount.toLocaleString()); + $('#'+type+' span[name="failCnt"]').text(obj.failCount.toLocaleString()); +} + +//선택 삭제 실행 +function fnDelete(){ + + var msgId = []; + if($("input:checkbox[name='msgSentDel']").is(":checked")==false){ + alert("한 개 이상의 전송 내역을 선택하세요"); + return; + } + + $("input:checkbox[name='msgSentDel']:checked").each(function(index){ + var disabledChk = $(this).prop('disabled'); + if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장 + msgId[index] = $(this).val(); + } + }); + + console.log('msgId : ', msgId); + + if(msgId.length < 1){ + alert("삭제할 문자를 선택해 주세요."); + return false; + } + + //22.04.25 구글 독스 alert 기준으로 이지우가 수정 + /* if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) */ + if(confirm("선택한 목록을 삭제하시겠습니까?\n삭제한 목록은 복구가 불가합니다.")){ + + document.searchForm.msgGroupIdList.value = msgId; + var sendData = $(document.searchForm).serializeArray(); + + $(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){ + }); + + alert("삭제되었습니다."); + var form = document.searchForm; + form.action="/web/kakao/sent/selectKakaoSentView.do"; + form.submit(); + } + +} + - -
    - -
    - - - - - +
    @@ -763,154 +434,19 @@ function infoPop(pageUrl){ - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    전체

    -

    -
    -
    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -
    -
    -
    -

    알림톡

    -

    -
    -
    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -
    - <%--
    -
    -

    친구톡

    -

    -
    -
    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -
    --%> + + +
    +

    - 최대 3개월간의 발송내역만 확인하실 수 있습니다.

    +

    - 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.

    - + +
    @@ -931,6 +467,8 @@ function infoPop(pageUrl){
    + +
    +
    +
    +

    전체

    +

    +
    +
    +
    LOADING...
    +
    +
    +
    +
    +

    알림톡

    +

    +
    +
    +
    LOADING...
    +
    +
    +
    + + +
    • -<%-- --%> - -<%-- --%> + +
    • +
    -
    +
    - --> + + + + + + + +
      +
    • + +
    • + +
    • + +
    • +
    • + +
    • +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView_back_250305.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView_back_250305.jsp new file mode 100644 index 00000000..d3c53069 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView_back_250305.jsp @@ -0,0 +1,996 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + +
    + +
    + + + + + + + +
    + +
    +
    + +
    + +
    +
    +

    발송결과

    + + +
    +
    + + <%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp" %> + +
    +
    + + + " /> + " /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    전체

    +

    +
    +
    +
    +
    대기
    +
    +
    +
    +
    성공
    +
    +
    +
    +
    실패
    +
    +
    +
    +
    +
    +
    +

    알림톡

    +

    +
    +
    +
    +
    대기
    +
    +
    +
    +
    성공
    +
    +
    +
    +
    실패
    +
    +
    +
    +
    + <%--
    +
    +

    친구톡

    +

    +
    +
    +
    +
    대기
    +
    +
    +
    +
    성공
    +
    +
    +
    +
    실패
    +
    +
    +
    +
    --%> +
    + +
    +
    +
    + 기간선택 +
    + + ~ + +
    + + + + + + +
    +
    + + + +
    +
    +
    +
    + +
      +
    • +
    • +<%-- --%> + +<%-- --%> +
    +
    + +
    + +
    +
      +
    • +
    • +
    • +
    • +
    • +
    +
    + 받는사람(전송건별) + + 받는사람(개인별) +
    받는사람(전송건별)
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    + + + + +
    +
    + + +
    +
    + +
    + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp b/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp index 9442511e..63aadd8f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp @@ -25,10 +25,15 @@ $(document).ready(function (){ alert("${message}"); } + //웹헤더에서 보안로그인으로 인해 페이지 접근 시 getid(document.loginForm2); + + + headerLoginResult(""); + }); -function press(event) { if (event.keyCode == 13) actionLogin(); } +function press(event) { if (event.keyCode == 13) actionLoginPage(); } function actionLoginPage() { // 아이디 공백 제거 @@ -41,133 +46,22 @@ function actionLoginPage() { alert("비밀번호를 입력하세요"); return; } else { - - //IP체크 삭제 후 바로 로그인처리 - 22.05.03 -// ipCheck(); actionLogin(); - - /* var rsa = new RSAKey(); - rsa.setPublic($('#RSAModulus2').val(),$('#RSAExponent2').val()); - - var id = $("#id_text2"); - var pw = $("#password_text2"); - - document.loginForm2.id.value = rsa.encrypt(id.val()); - document.loginForm2.password.value = rsa.encrypt(pw.val()); - - document.loginForm2.action=""; - saveid(document.loginForm2); - document.loginForm2.submit(); */ } } -function ipCheck(){ - - //로그인 시 IP 체크 - var id = $("#id_text2").val().toLowerCase(); - var password = $("#password_text2").val(); - var ip = "${userIp}"; - var IPCnt; - - $.ajax({ - url : "", - type : 'POST', - data : {id : id, ip : ip}, - dataType:'json', - async : false, - success : function(returnData, status){ - if(status == "success") { - if(returnData.IPCheck == 0){ - IPCnt = returnData.IPCheck; - - $("#tr_certHeader").val(returnData.tr_cert); - $("#tr_urlHeader").val(returnData.tr_url); - $("#tr_addHeader").val(returnData.tr_add); - - var KMCIS_window; - - //등록된 IP가 없을 시 KMC 본인인증 팝업 오픈 - KMCIS_window = window.open('', 'KMCISWindow', 'width=425, height=550, resizable=0, scrollbars=no, status=0, titlebar=0, toolbar=0, left=435, top=250' ); - - document.reqHeaderKMCISForm.target = 'KMCISWindow'; - - document.reqHeaderKMCISForm.action = 'https://www.kmcert.com/kmcis/web/kmcisReq.jsp'; - document.reqHeaderKMCISForm.submit(); - - return false; - - }else{ - - actionLogin(); - - } - }else{ alert("로그인 정보가 올바르지 않습니다.");return false;} - }, - - error : function(request , status, error){ - alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error); - } - }); - - -} - -// Whois IP 국가코드 Check -var isKoreaIpAddress = true; -function whoisIpCountry() { - $.ajax({ - type:"POST", - url: "/web/whois/whoisIpCountryAjax.do", - data: {}, - dataType:'json', - async: true, - timeout: 300, - success: function (data) { - if(data.isSuccess == true) { - if (data.rspCode == "10000") { - if (data.countryCode.toUpperCase() != "KR" && data.countryCode.toUpperCase() != "NONE" && data.countryCode.toUpperCase() != "") { - isKoreaIpAddress = false; - //alert("해당 IP는 해외 IP로 확인되어, 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다."); - } - } - } - }, - error: function (e) { - } - }); -} - function actionLogin(){ - console.log('actionLogin : actionLogin') - - setTimeout(function() { - if (isKoreaIpAddress == false) { - alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다."); - location.href='/web/uat/uia/actionLogout.do'; - return false; - } // 로그인 START var rsa = new RSAKey(); rsa.setPublic($('#RSAModulus2').val(),$('#RSAExponent2').val()); - /* rsa.setPublic(document.loginForm2.RSAModulus.value, document.loginForm2.RSAExponent.value); */ var id = $("#id_text2"); var pw = $("#password_text2"); - /* var id = document.loginForm2.id_text; - var pw = document.loginForm2.password_text; */ - - /* $("#id").val(rsa.encrypt(id.val())); */ - /* $("#password").val(rsa.encrypt(pw.val())); */ document.loginForm2.id.value = rsa.encrypt(id.val().toLowerCase()); document.loginForm2.password.value = rsa.encrypt(pw.val()); - //document.loginForm2.action=""; - saveid(document.loginForm2); - //document.loginForm2.submit(); - - var checkForm = $("form[name=loginForm2]").serialize() ; $.ajax({ @@ -177,8 +71,6 @@ function actionLogin(){ data : checkForm, dataType:'json', success : function(data) { - //alert(data.status); - //alert(data.data.moblphonNo); if (data.status=="success"){ document.loginForm2.passFlag.value = data.passFlag; @@ -199,7 +91,6 @@ function actionLogin(){ $("#input_list_item_5").show(); $("#input_list_item_6").show(); - // $("#hp_text2").val(data.data.moblphonNo); var $select = $('#hp_text2'); data.mberCertPhoneList.forEach(function(item) { $select.append($('
    diff --git a/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr_back_250325.jsp b/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr_back_250325.jsp new file mode 100644 index 00000000..b66fd8e4 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr_back_250325.jsp @@ -0,0 +1,690 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + +
    +
    +
    +

    로그인

    +
    + + + +
    +
    + +
    +
    + + + + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp index dc479994..a0e21e02 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -18,8 +18,6 @@ $(document).ready(function(){ - - console.log("12111111111111"); // console.log(' + $(#tabDision).val() : ',$('#tabDision').val()) // if($('#tabDision').val() == 'tab02'){ @@ -1120,7 +1118,19 @@ $(document).ready(function (){ .filter(num => num !== "") .filter(num => isValidPhoneNumber(num)); // 유효한 번호만 필터링; - fn_phoneAddProcess(tableL, numbers); + console.log('numbers : ', numbers); + const addrData = processPhoneNumbers(numbers); + + + // 기존 tableL의 데이터를 가져옵니다. + var existingData = tableL.getData(); + + // 데이터 병합 및 중복 제거 + const result = mergeAndValidateData(existingData, addrData); + + + // 테이블 데이터 업데이트 + if (!updateTableData(tableL, result)) return false; // textarea 초기화 textarea.val(''); // jQuery 객체에서 값을 초기화할 때는 .val('') 사용 @@ -3397,7 +3407,7 @@ function fnTestSend(){ } //제목 사용한 경우 - if($("input[name=title_status]:checked").val() == 'Y') { + if($("input[name=subjectChkYn]:checked").val() == 'Y') { form.mmsSubject.value = msgForm.mmsSubject.value; } else { form.mmsSubject.value = ""; //초기화 @@ -3411,7 +3421,7 @@ function fnTestSend(){ form.eachPrice.value = ''; //제목 사용한 경우 - if($("input[name=title_status]:checked").val() == 'Y') { + if($("input[name=subjectChkYn]:checked").val() == 'Y') { form.mmsSubject.value = msgForm.mmsSubject.value; } else { form.mmsSubject.value = ""; //초기화 @@ -3964,6 +3974,8 @@ function getMjMsgSentListAll(pageNo) { + +
    @@ -4018,9 +4030,9 @@ function getMjMsgSentListAll(pageNo) {
    • - + - +
    • diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp index 7f41a177..1c3815e6 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp @@ -71,8 +71,6 @@ $(document).ready(function(){
    -
    @@ -123,18 +121,18 @@ $(document).ready(function(){
    -
    - -
    - -
      -
    • - -
    • -
    • - -
    • -
    +
    + +
    + +
      +
    • + +
    • +
    • + +
    • +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp index bed33ccc..8cfd15eb 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp @@ -3,19 +3,23 @@ <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ page import="itn.com.cmm.LoginVO" %>
    - -

    +

    +

    ※ 예약문자 발송취소는 예약 발송시간 기준 5분 전까지만 가능

    - @@ -84,134 +163,100 @@ $(document).ready(function(){
    - + - - - - + - - - - + + + + + - - - - - - - - - + - - - - - - + + + + + + + + + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + @@ -462,14 +337,14 @@ $(document).ready(function(){
    - - - - + + +<%-- --%> +<%-- --%>
    - - + +<%-- --%>
    @@ -477,3 +352,12 @@ $(document).ready(function(){ + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax_advc_backup_20250115.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax_advc_backup_20250115.jsp new file mode 100644 index 00000000..59faa545 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax_advc_backup_20250115.jsp @@ -0,0 +1,479 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="itn.com.cmm.LoginVO" %> + + + +
    + +

    +
    + + +
    +
    + +
    +
    + 발송일시 + 발송일시
    형태 + 형태
    발송방식 -
    - -
    -
    내용받는사람 -
    - -
    -
    발신번호 -
    - -
    -
    + 내용 발송건수
    결과건수금액결과금액(원)진행상황
    대기성공실패
    + - - + + - - - - - - - - + + - + - + <%-- 20240906 추가 발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다. 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> -

    +

    ${result.delayOrgTime}

    -

    +

    ${result.reqDate}

    -

    +

    ${result.reqDate}

    +
    +

    - + 장문 - + 그림 @@ -220,239 +265,69 @@ $(document).ready(function(){

    -

    - - - WEB - - - API - - - - - - -

    -
    - - - - - + + -

    +
    +

    -

    +
    +

    +

    +
    +

    +
    - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - + - - -

    정상수신

    + - -

    + + -

    +

    -
    -

    - - - - - - 0 - - -

    + +
    -

    정상수신

    -
    -

    - - - - - - 0 - - -

    -
    -

    수신오류

    -
    -

    - - - - - - 0 - - -

    -
    -

    결과대기

    -
    -

    - - - - - - 0 - - -

    -
    -

    실패/대기

    -
    - - -

    - / -

    -
    - -

    - / -

    -
    -
    -
    -

    - - - - - - 0 - - -

    -
    발송 내역이 없습니다.발송 내역이 없습니다.발송 내역이 없습니다.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + 발송일시 +
    + +
    +
    형태 +
    + +
    +
    발송방식 +
    + +
    +
    내용받는사람 +
    + +
    +
    발신번호 +
    + +
    +
    + 발송건수 +
    + +
    +
    결과건수금액
    + + + + + + + + + + + + + + + + + + + + + + + + <%-- + 20240906 추가 + 발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다. + 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 + --%> +

    +
    + +

    +
    +
    + +
    + +

    +
    +
    +
    +

    + + + 장문 + + + 그림 + + + 단문 + + +

    +
    +

    + + + WEB + + + API + + + - + + +

    +
    + + + + + + + +

    + + + + + + + + 명 +

    +
    + +

    +
    + +

    +
    +
    +
    + + + +

    +
    + +

    +
    +
    +
    +
    +
    +

    +
    +

    +
    +

    정상수신

    +
    + + +

    +
    + +

    +
    +
    +
    +

    + + + + + + 0 + + +

    +
    +

    정상수신

    +
    +

    + + + + + + 0 + + +

    +
    +

    수신오류

    +
    +

    + + + + + + 0 + + +

    +
    +

    결과대기

    +
    +

    + + + + + + 0 + + +

    +
    +

    실패/대기

    +
    + + +

    + / +

    +
    + +

    + / +

    +
    +
    +
    +

    + + + + + + 0 + + +

    +
    발송 내역이 없습니다.발송 내역이 없습니다.
    +
    +
    +
    + + + + + +
    +
    + + +
    +
    + +
      + +
    +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp new file mode 100644 index 00000000..bfdf9ff4 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp @@ -0,0 +1,1025 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> +<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ page import="itn.com.cmm.LoginVO" %> +<% pageContext.setAttribute("newLineChar", "\n"); %> + + + + + + +
    + + + + + +
    + +
    +
    +

    발송결과 상세

    + +
    + + +
    + +
    + +
    +
    +
    +

    발송정보

    +

    +
    +
    +
    +
    발송일시
    +
    + ${result.reqDate} +
    +
    + +
    +
    등록일시
    +
    ${result.regDate }
    +
    +
    + +
    +
    제목
    +
    ${result.subject }
    +
    +
    +
    +
    형태
    +
    + ${result.msgType == '4' + ? '단문' + : (result.fileCnt == '0' + ? '장문' + : '그림')} +
    +
    +
    +
    발송건수
    +
    +
    +
    +
    발신번호
    +<%--
    ${result.callFrom }
    --%> +
    ${fnc:formatPhone(result.callFrom) }
    +
    +
    +
    진행상황 + + +
    +
    예약
    + + +
    + +
    + ${result.divideText } + +
    +
    +
    +
    +
    + +
    +
    + + + + 예약취소() + + + + + +

    +
    +
    + + + +
    + +
    +
    +
    +
    +
    발송요금
    +
    + + + + 0 + + + + + + 원 +
    + +
    +
    +
    +
    + + +
    +
    +
    +

    상세결과

    +

    +
    +
    +
    +
    +
    전체건수
    +
    +
    +
    +
    +
    +
    성공건수
    +
    건(${result.successPct})
    +
    +
    +
    +
    +
    +
    +
    대기건수
    +
    건(${result.waitingPct})
    +
    +
    +
    +
    +
    실패건수
    +
    건(${result.failedPct})
    +
    +
    +
    +

    * 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.

    +
    +
    + + +
    + + + +
    +
    +
    +
    +

    문자내용

    + + +
    + + ${result.msgType == '4' + ? 'SMS' + : (result.fileCnt == '0' + ? 'LMS' + : 'MMS')} + + + + + +
    + +
    +
    + +
    + &fileSn=" alt="발송된 그림문자 미리보기" style="width: 100%"> +
    +
    +
    +
    + +

    (광고)

    +
    +

    + ${fn:replace(result.smsTxt, newLineChar, "
    ")} +

    +

    + +

    무료 거부 080-0000-0000

    +
    +
    +
    + +
    +
    +

    ※ 단말기 설정에 따라 다르게 보일 수 있습니다

    +

    +
    + +
    + + +
    + +
    + + +
    +
    + +
    + + + + +
    + +
    + + + +
    + +
    + + + +
    + " /> + + + + + + + + + +
    + + +
    + +
    + + +
    + + + + +
    + diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp index d1850d14..457aed8f 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp @@ -15,7 +15,12 @@ var thisfuledtlday = ""; //당원 마지막일 $(document).ready(function(){ //초기 전체 리스트 페이지 보여주기 - linkPage(1); + linkPage($('#searchForm #pageIndex').val()); + + + fn_activateTab($('#searchForm #searchCondition01').val()) + fn_setActiveTab($('#searchForm #searchCondition02').val()) + var date = new Date() ; //이전달 첫날/마지막날 조회 @@ -28,12 +33,14 @@ $(document).ready(function(){ lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ; lastfulstday += "/01" ; } + console.log('lastfulstday: ', lastfulstday); //당월 첫날/마지막날 조회 thisfulstlday = date.getFullYear() + "/" ; thisfulstlday += date.getMonth()+1 < 10 ? "0"+ (date.getMonth()+1) : date.getMonth()+1+"" ; thisfuledtlday = thisfulstlday + "/"+ new Date(date.getFullYear(), date.getMonth()+1, 0).getDate()+""; thisfulstlday += "/01" ; + console.log('thisfulstlday: ', thisfulstlday); //3개월 이전 날짜 구해오기 @@ -55,6 +62,19 @@ $(document).ready(function(){ $(document).on('click', '.sort', function (){ listSortOrd(this); }); + + + // 탭 :: 전체 , 즉시, 예약 + $(document).on('click', '.sendKindBtn', function (){ + + // 클릭된 버튼의 data-info 값을 전달하여 함수 호출 + fn_activateTab($(this).data('info')); + + linkPage(1); + }); + + + //목록 정렬 항목 클릭 function listSortOrd(obj){ @@ -87,7 +107,8 @@ $(document).ready(function(){ }); - $(document).on('change','#pageUnit', function(){ + $(document).on('change','#pageUnitS', function(){ + setPageUnit($(this).val()); linkPage(1); @@ -97,8 +118,23 @@ $(document).ready(function(){ }); +function setPageUnit(val){ + $('#pageUnit').val(val); +} - + +//탭 활성화 처리 함수 +function fn_activateTab(tabInfo) { + // 1. data-info 값을 가진 버튼 요소 찾기 + var $button = $('.sendKindBtn[data-info="' + tabInfo + '"]'); + + // 2. 해당 버튼이 속한 탭 활성화 처리 + $button.closest('ul').find('.tab').removeClass('active'); + $button.closest('.tab').addClass('active'); + + // 3. hidden input 요소에 값 설정 + $('#searchCondition01').val(tabInfo); +} //캘린더에 날짜 입력해 주기 @@ -107,13 +143,13 @@ function setCalVal(val,targetObj){ } -//검색 버튼 실행 +//페이지 이동 실행 function linkPage(pageNo){ var form = document.searchForm; - var stateType = form.stateType.value; form.pageIndex.value = pageNo; - + console.log('form : ', form); + var sendData = $(document.searchForm).serializeArray(); $(".msgSentAllLoad").html('
    LOADING...
    '); $(".msgSentAllLoad").load("/web/mjon/msgsent/selectMsgSentListViewAjax.do", sendData ,function(response, status, xhr){ @@ -137,120 +173,73 @@ function fnDelete(){ } }); - if(msgId.length > 0){ + console.log('msgId : ', msgId); + + if(msgId.length < 1){ + alert("삭제할 문자를 선택해 주세요."); + return false; + } //22.04.25 구글 독스 alert 기준으로 이지우가 수정 /* if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) */ - if(confirm("선택한 목록을 삭제하시겠습니까?")){ + if(confirm("선택한 목록을 삭제하시겠습니까?\n삭제한 목록은 복구가 불가합니다.")){ document.searchForm.msgGroupIdList.value = msgId; var sendData = $(document.searchForm).serializeArray(); $(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){ }); - -// var form = document.searchForm; -// form.action="/web/mjon/msgsent/selectMsgSentView.do"; -// form.submit(); + + alert("삭제되었습니다."); + var form = document.searchForm; + form.action="/web/mjon/msgsent/selectMsgSentView.do"; + form.submit(); } - - }else{ - - alert("삭제할 문자를 선택해 주세요."); - return false; - - } - -} - -//상세보기 버튼 실행 -function fnRevDetailPop(msgGroupId, msgId, fileCnt){ - document.resPopForm.msgGroupId.value = msgGroupId; - document.resPopForm.msgId.value = msgId; - var sendData = $(document.resPopForm).serializeArray(); - - var form = document.searchForm; - if (form.listType.value == "privateList") { - $("#msgSentDetailPopLoad").load("/web/mjon/msgsent/selectMsgSentDetailData2Ajax.do", sendData ,function(response, status, xhr){ - }); - } - else { - $("#msgSentDetailPopLoad").load("/web/mjon/msgsent/selectMsgSentDetailDataAjax.do", sendData ,function(response, status, xhr){ - }); - } - -} - -function fnListLoad(pageType, tabNum){ - - var form = document.searchForm; - var $tab = $(".table_tab_wrap li").eq(tabNum); // - $tab.addClass("active"); - $tab.find("button").attr("title", "선택됨"); - $tab.siblings("li.tab").removeClass("active"); - $tab.siblings("li.btn_tab").removeClass("active"); - $tab.siblings("li.tab").find("button").removeAttr("title"); - - if(pageType == 'all'){ - - form.stateType.value = "all"; - $(".tab_depth1").show(); - - }else if(pageType == 'ready'){ - - form.stateType.value = "ready"; - $(".tab_depth1").show(); - - }else if(pageType == 'complete'){ - - form.stateType.value = "complete"; - $(".tab_depth1").show(); - - }else if(pageType == 'fail'){ - form.listType.value = "privateList"; - form.stateType.value = "fail"; - $(".tab_depth1").hide(); - - } - - /* if(pageType == 'fail'){//발송실패의 경우 모두 개인별 건수를 보여준다. - - form.listType.value = 'privateList'; - - } */ - - linkPage(1); } // 전체/단문/장문/그림 탭 선택 처리 -function fnTabLoad(tabType, tabNum){ +function fnTabLoad(tabType){ + + //즉시, 예약 탭은 전체로 바꿔야함 + fn_activateTab(''); + setPageUnit('10'); var form = document.searchForm; - - form.tabType.value = tabType; - - //해당 탭의 전체 리스트 내역으로 불러오기 - fnListLoad('all', '0'); - var n=tabNum+1; - - //탭 선택 CSS 처리 - var $tab = $(".list_tab_wrap2 li:nth-child("+n+")"); - var $tabPrev = $(".list_tab_wrap2 li:nth-child("+n+")").prev("li") - $tab.addClass("active"); - $tab.find("button").attr("title", "선택됨"); - $tab.siblings("li.tab").removeClass("active"); - $tab.siblings("li.tab").find("button").removeAttr("title"); - $tab.siblings("li:not(li:last-child)").find("button").css("border-right","1px solid #e5e5e5"); - $tabPrev.find("button").css("border-right","0"); + // 탭 선택 CSS 처리 + fn_setActiveTab(tabType); + linkPage(1); } +//fnTabLoad 함수에 대한 탭 선택 CSS 처리 함수 +function fn_setActiveTab(tabType) { + var $tabs = $(".list_tab_wrap2 li"); // 전체 탭 리스트 + $tabs.removeClass("active").find("button").removeAttr("title"); // 모든 탭 초기화 + + // tabType에 해당하는 탭 찾기 + $tabs.each(function() { + var buttonText = $(this).find("button").text(); + if ((tabType === '' && buttonText === "전체") || + (tabType === 'S' && buttonText === "단문(SMS)") || + (tabType === 'L' && buttonText === "장문(LMS)") || + (tabType === 'M' && buttonText === "그림(MMS)")) { + $(this).addClass("active").find("button").attr("title", "선택됨"); + } + }); + + $('#searchCondition02').val(tabType); +} + + function fnSearch(pageNo){ - /* if(!fn_G_cmndataValueChk("startDate", "endDate", 3)){ + /* if(!fn_G_cmndataValueChk("searchStartDate", "searchEndDate", 3)){ return; }; */ + + fn_activateTab('') + fn_setActiveTab('') console.log('fnSearch') var form = document.searchForm; @@ -274,27 +263,8 @@ function prevMonth(month) { function fnExcelDownLoad(pageType, tabType){ var form = document.searchForm; - var loginVO = '${LoginVO}'; - - form.stateType.value = pageType; - form.tabType.value = tabType; - - if(loginVO == "" || loginVO == null){ - alert("로그인 후 이용이 가능합니다."); - return false; - } // 기간검색 유효성 검사 - if ($("#startDate").val() == "" || $("#endDate").val() == "") { - alert("기간 설정을 먼저해주세요. 최근 3개월까지만 다운로드 가능합니다.") - return false; - } - else { - if ($("#startDate").val() < prevMonth(3)) { - alert("최근 3개월까지만 다운로드 가능합니다.") - return false; - } - } if(confirm("엑셀 다운로드를 하시겠습니까?")){ @@ -305,21 +275,6 @@ function fnExcelDownLoad(pageType, tabType){ } -$(document).on('click', '.msgGgoupList', function(){ - - var form = document.searchForm; - form.listType.value = "groupList"; - linkPage(1); - -}); - -$(document).on('click', '.msgPrivateList', function(){ - - var form = document.searchForm; - form.listType.value = "privateList"; - linkPage(1); - -}); function fnDeleteAddrNo(listType){ @@ -537,7 +492,7 @@ function fnMsgSFDetailList(msgGroupId, resultType){ } -/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ +/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 function fnShowPrintPopup(tabType, type) { //만들려는 팝업의 크기 var popup_wid = '840'; @@ -553,7 +508,7 @@ function fnShowPrintPopup(tabType, type) { $("#searchForm").attr({"action":"/web/mjon/msgsent/printMsgSentDataAjax.do", "method":"post"}).submit(); } - +*/ function addrGroupDuplCnt() { document.searchForm.addrGrpNm.value = $('#grpNm').val(); @@ -744,9 +699,10 @@ function fnMjMsgReSendAll(msgGroupId, replaceCnt, electionCnt, advertisementCnt) } //발송결과 - 대기/성공/실패 -function subContent(p_content_no){ +function subContent(){ - var sendData = $(document.listForm).serializeArray(); + var sendData = $(document.searchForm).serializeArray(); + console.log('sendData :: ', sendData); var v_html_pre = '' + '' + '' @@ -891,60 +847,51 @@ function subContent(p_content_no){ --%> - + + " /> + " /> + " /> " /> - + + +
    - -
    + + +
    +

    - 최대 3개월간의 발송내역만 확인하실 수 있습니다.

    +

    - 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.

    +

    - 단문문자는 최대 24시간, 장문 및 그림문자는 최대 72시간까지 결과값이 수신되지 않은 경우 실패(비과금) 처리됩니다.

    +
    기간선택
    - + ~ - +
    - - - - - + + +
    - <%-- - --%> - - - - - - +
    + +
    +
      -
    • -
    • -
    • -
    • +
    • +
    • +
    • +
    -
    +
    -
      + -
      +
    // tab button --> + + + +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    + + + + + + +
    + +
    +
    +
    [대기]
    +
    + 발송은 성공하였으며, 수신자측 통신사로부터 수신여부를 확인중인 상태
    + ※ 예약문자의 경우 실발송 전까지는 “대기”로 표시 +
    +
    [성공]
    +
    발송 및 수신이 완료된 상태
    +
    [실패]
    +
    결번, 일시정지, 전화번호 오류 등의 사유로 발송이 + 불가한 상태
    +
    +
    +
    diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp index 73127188..45cbaccc 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp @@ -25,14 +25,14 @@ $(document).ready(function(){ -
    +

    전체

    - +

    -
    -

    WEB

    +
    +<%--

    WEB

    --%>
    대기
    @@ -46,32 +46,15 @@ $(document).ready(function(){
    - -
    -

    API

    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -

    단문(SMS)

    - +

    -
    -

    WEB

    +
    +<%--

    WEB

    --%>
    대기
    @@ -85,32 +68,15 @@ $(document).ready(function(){
    - -
    -

    API

    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -

    장문(LMS)

    - +

    -
    -

    WEB

    +
    +<%--

    WEB

    --%>
    대기
    @@ -124,32 +90,15 @@ $(document).ready(function(){
    - -
    -

    API

    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -

    그림(MMS)

    - +

    -
    -

    WEB

    +
    +<%--

    WEB

    --%>
    대기
    @@ -163,21 +112,4 @@ $(document).ready(function(){
    - -
    -

    API

    -
    -
    대기
    -
    -
    -
    -
    성공
    -
    -
    -
    -
    실패
    -
    -
    -
    -
    \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp index b20ca1fd..4db78d99 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp @@ -4,6 +4,8 @@ <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%> +
    구분, 충전금액, 사용금액, 잔액 등 정보를 제공하는 표