Merge branch 'advc'

This commit is contained in:
hehihoho3@gmail.com 2025-04-07 11:41:23 +09:00
commit e9a66e7bdf
102 changed files with 14645 additions and 6482 deletions

11
pom.xml
View File

@ -144,11 +144,12 @@
<version>1.1.2</version> <version>1.1.2</version>
</dependency> </dependency>
<dependency> <!-- https://mvnrepository.com/artifact/cglib/cglib -->
<groupId>cglib</groupId> <dependency>
<artifactId>cglib</artifactId> <groupId>cglib</groupId>
<version>3.1</version> <artifactId>cglib</artifactId>
</dependency> <version>3.3.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.antlr</groupId> <groupId>org.antlr</groupId>

View File

@ -3,6 +3,7 @@ package itn.com.cmm.util;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Date; import java.util.Date;
@ -185,4 +186,20 @@ public final class DateUtils {
return isValid; 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;
}
} }

View File

@ -25,45 +25,44 @@ import org.apache.commons.lang3.StringUtils;
*/ */
public final class FileUtil { public final class FileUtil {
/** /**
* @methodName : downLoad * @methodName : downLoad
* @author : 이호영 * @author : 이호영
* @date : 2023.04.06 * @date : 2023.04.06
* @description : 파일 다운로드 * @description : 파일 다운로드
* @param response * @param response
* @param fileInfo * @param fileInfo
* @param fileName * @param fileName
* @throws Exception * @throws Exception
*/ */
public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception { public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception {
try { try {
String path = fileInfo; // 경로에 접근할 역슬래시('\') 사용 String path = fileInfo; // 경로에 접근할 역슬래시('\') 사용
File file = new File(path); File file = new File(path);
String fileName = ""; String fileName = "";
if(StringUtils.isNotEmpty(fileNameP)) if(StringUtils.isNotEmpty(fileNameP))
fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20"); fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20");
else else
fileName = file.getName(); fileName = file.getName();
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더 response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기 FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기
OutputStream out = response.getOutputStream(); OutputStream out = response.getOutputStream();
int read = 0; int read = 0;
byte[] buffer = new byte[1024]; byte[] buffer = new byte[1024];
while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음 while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음
out.write(buffer, 0, read); out.write(buffer, 0, read);
} }
} catch (Exception e) {
} catch (Exception e) { throw new Exception("download error");
throw new Exception("download error"); }
}
} }
} }

View File

@ -23,6 +23,7 @@ import itn.com.cmm.MjonMsgSendVO;
import itn.com.cmm.OptimalMsgResultDTO; import itn.com.cmm.OptimalMsgResultDTO;
import itn.let.mail.service.StatusResponse; import itn.let.mail.service.StatusResponse;
import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO; import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO;
import itn.let.mjo.spammsg.web.ComGetSpamStringParser; 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; // 이벤트 최소 잔액 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 * @methodName : getMsgType
@ -96,7 +77,7 @@ public final class MsgSendUtils {
// msgType = "4"; // msgType = "4";
// } // }
int smsTxtByte = getSmsTxtBytes(p_smsTxt); int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt);
String msgType = SHORT_MSG_TYPE; String msgType = SHORT_MSG_TYPE;
// 1. 2000 Byte 초과는 에러 처리 // 1. 2000 Byte 초과는 에러 처리
@ -276,7 +257,6 @@ public final class MsgSendUtils {
for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) { for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
String placeholder = entry.getKey(); String placeholder = entry.getKey();
String value = entry.getValue().apply(sendVO); String value = entry.getValue().apply(sendVO);
System.out.println("");
// log.info(" + smsTxtTemp [{}]", smsTxtTemp); // log.info(" + smsTxtTemp [{}]", smsTxtTemp);
// log.info(" + placeholder [{}]", placeholder); // log.info(" + placeholder [{}]", placeholder);
// log.info(" + value [{}]", value); // log.info(" + value [{}]", value);
@ -649,7 +629,7 @@ public final class MsgSendUtils {
// 가격을 합산 // 가격을 합산
totalPrice += Float.parseFloat(eachPrice); totalPrice += Float.parseFloat(eachPrice);
} }
mjonMsgVO.setTotalPrice(totalPrice);
} }

View File

@ -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;
}
}

View File

@ -35,5 +35,6 @@ public class MainPopupLinkVO extends ComDefaultVO implements Serializable {
private String popId; // 메인존ID private String popId; // 메인존ID
private String mlink; // 링크 private String mlink; // 링크
private String coords; // 링크좌표 private String coords; // 링크좌표
private String popLinkId; // 링크좌표
} }

View File

@ -1,13 +1,8 @@
package itn.com.uss.ion.bnr.pop.service; package itn.com.uss.ion.bnr.pop.service;
import java.util.List; import java.util.List;
import java.util.Map;
import itn.com.uss.ion.pwm.service.MainzoneVO; import itn.com.cmm.RestResponse;
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;
/** /**
* 개요 * 개요
@ -34,4 +29,6 @@ public interface MainPopupManageService {
public void resetMainPopupSort(MainPopupVO mainPopupVO); public void resetMainPopupSort(MainPopupVO mainPopupVO);
public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO);
} }

View File

@ -4,6 +4,7 @@ import java.util.List;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import itn.com.cmm.service.impl.EgovComAbstractDAO; 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; import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
/** /**
@ -46,8 +47,8 @@ public class MainPopupManageDAO extends EgovComAbstractDAO {
} }
public void deleteMainPopup(String mazId) { public void deleteMainPopup(String popId) {
delete("mainPopup.deleteMainPopup", mazId); delete("mainPopup.deleteMainPopup", popId);
} }
@ -55,4 +56,7 @@ public class MainPopupManageDAO extends EgovComAbstractDAO {
update("mainPopup.resetMainPopupSort", mainPopupVO); update("mainPopup.resetMainPopupSort", mainPopupVO);
} }
public void deleteMainPopupLinkInfo(MainPopupLinkVO mainPopupLinkVO) {
delete("mainPopup.deleteMainPopupLinkInfo", mainPopupLinkVO);
}
} }

View File

@ -4,12 +4,16 @@ import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService; 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.MainPopupManageService;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO; 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") @Resource(name = "mainPopupManageDAO")
public MainPopupManageDAO dao; public MainPopupManageDAO dao;
@Resource(name = "popupManageDAO")
public PopupManageDAO popupDao;
@Resource(name = "egovPopupManageIdGnrService") @Resource(name = "egovPopupManageIdGnrService")
private EgovIdGnrService idgenService; private EgovIdGnrService idgenService;
@ -59,6 +65,7 @@ public class MainPopupManageServiceImpl extends EgovAbstractServiceImpl implemen
@Override @Override
public void deleteMainPopup(String id) { public void deleteMainPopup(String id) {
popupDao.deleteMainPopupLinkInfo(id);
dao.deleteMainPopup(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();
}
} }

View File

@ -12,11 +12,15 @@ import javax.servlet.http.HttpSession;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.ui.ModelMap; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springmodules.validation.commons.DefaultBeanValidator; 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.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource; import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO; import itn.com.cmm.LoginVO;
import itn.com.cmm.RestResponse;
import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO; import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker; 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.MainPopupManageService;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO; import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService; import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.EgovSiteManagerService;
/** /**
@ -243,11 +248,35 @@ public class MainPopupController {
RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do"); RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do");
return redirectUrlMaker.getRedirectUrl(); 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));
}

View File

@ -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; // 파일 순번
}

View File

@ -151,6 +151,8 @@ public class MjonKakaoATVO extends ComDefaultVO{
private String bizKakaoResendType; /* 대체 문자 길이 => MMS / LMS / SMS */ private String bizKakaoResendType; /* 대체 문자 길이 => MMS / LMS / SMS */
private String bizKakaoJsonFile; //카카오 친구톡 Json 파일 경로 private String bizKakaoJsonFile; //카카오 친구톡 Json 파일 경로
private String yellowId;
private String bizKakaoResendTypeCnt;
public String getMsgDiv() { public String getMsgDiv() {
return msgDiv; return msgDiv;
@ -1273,5 +1275,19 @@ public class MjonKakaoATVO extends ComDefaultVO{
public void setBizKakaoJsonFile(String bizKakaoJsonFile) { public void setBizKakaoJsonFile(String bizKakaoJsonFile) {
this.bizKakaoJsonFile = 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;
}
} }

View File

@ -1,5 +1,9 @@
package itn.let.kakao.kakaoComm; package itn.let.kakao.kakaoComm;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/** /**
* @FileName : KakaoButtonVO.java * @FileName : KakaoButtonVO.java
* @Project : mjon * @Project : mjon
@ -8,6 +12,9 @@ package itn.let.kakao.kakaoComm;
* @프로그램 설명 : button, quickReplies 변수 * @프로그램 설명 : button, quickReplies 변수
*/ */
@ToString
@Getter
@Setter
public class KakaoButtonVO { public class KakaoButtonVO {
private String name = ""; // 버튼명 - linkType AC 선택 버튼명은 채널추가 고정 private String name = ""; // 버튼명 - linkType AC 선택 버튼명은 채널추가 고정
@ -18,48 +25,4 @@ public class KakaoButtonVO {
private String linkPc = ""; // PC 링크 주소 (WL 사용시 선택) private String linkPc = ""; // PC 링크 주소 (WL 사용시 선택)
private String pluginId = ""; // 플러그인 ID (P1, P2, P3 사용시 필수) 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;
}
} }

View File

@ -3,6 +3,10 @@ package itn.let.kakao.kakaoComm;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/** /**
* @FileName : KakaoCommentVO.java * @FileName : KakaoCommentVO.java
* @Project : mjon * @Project : mjon
@ -11,6 +15,9 @@ import java.util.List;
* @프로그램 설명 : comment 변수 * @프로그램 설명 : comment 변수
*/ */
@ToString
@Getter
@Setter
public class KakaoCommentVO { public class KakaoCommentVO {
private String content = ""; // 댓글 본분 private String content = ""; // 댓글 본분
@ -26,60 +33,4 @@ public class KakaoCommentVO {
private String originalFileName = ""; private String originalFileName = "";
private String filePath = ""; 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<KakaoCommentVO> getAttachFileList() {
return attachFileList;
}
public void setAttachFileList(List<KakaoCommentVO> attachFileList) {
this.attachFileList = attachFileList;
}
} }

View File

@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import itn.com.cmm.ComDefaultVO; import itn.com.cmm.ComDefaultVO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/** /**
* @FileName : KakaoReturnVO.java * @FileName : KakaoReturnVO.java
@ -13,6 +16,9 @@ import itn.com.cmm.ComDefaultVO;
* @프로그램 설명 : 카카오톡 리턴 변수 목록 * @프로그램 설명 : 카카오톡 리턴 변수 목록
*/ */
@Getter
@Setter
@ToString
public class KakaoReturnVO extends ComDefaultVO{ public class KakaoReturnVO extends ComDefaultVO{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -130,415 +136,4 @@ public class KakaoReturnVO extends ComDefaultVO{
private String businessType = ""; //카카오톡 채널 비즈니스 인증 타입 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<KakaoReturnVO> getTemplatList() {
return templatList;
}
public void setTemplatList(List<KakaoReturnVO> 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<KakaoButtonVO> getButtonList() {
return buttonList;
}
public void setButtonList(List<KakaoButtonVO> buttonList) {
this.buttonList = buttonList;
}
public List<KakaoButtonVO> getQuickReplyList() {
return quickReplyList;
}
public void setQuickReplyList(List<KakaoButtonVO> quickReplyList) {
this.quickReplyList = quickReplyList;
}
public List<KakaoCommentVO> getCommentList() {
return commentList;
}
public void setCommentList(List<KakaoCommentVO> commentList) {
this.commentList = commentList;
}
public List<KakaoItemVO> getItemList() {
return itemList;
}
public void setItemList(List<KakaoItemVO> itemList) {
this.itemList = itemList;
}
} }

View File

@ -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<KakaoButtonVO> 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 ]";
}
}

View File

@ -1,21 +1,38 @@
package itn.let.kakao.kakaoComm; package itn.let.kakao.kakaoComm;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource; 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.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.com.cmm.util.StringUtil; import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; 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.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
import itn.let.module.base.PriceAndPoint;
import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.MberManageVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component @Component
public class KakaoSendUtil { public class KakaoSendUtil {
@ -25,6 +42,374 @@ public class KakaoSendUtil {
@Resource(name = "MjonMsgDataService") @Resource(name = "MjonMsgDataService")
private MjonMsgDataService 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<KakaoSendAdvcVO> populateSendLists(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception {
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
// String befCash = kakaoVO.getBefCash();
log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size());
List<KakaoSendAdvcVO> 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<String> 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<Map<String, String>> varList = kakaoVO.getVarListMap();
for (int i = 0; i < varList.size(); i++) {
// for(Map<String, String> variables : kakaoVO.getVarListMap()) {
// 치환 데이터
Map<String, String> 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<KakaoButtonVO> 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<KakaoButtonVO> replaceButtonLinks(List<KakaoButtonVO> buttonList,
Map<String, String> 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<KakaoButtonVO> 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 * @Method Name : kakaoSendPrice
@ -34,13 +419,11 @@ public class KakaoSendUtil {
*/ */
public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception { public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception {
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액) System.out.println(" :: kakaoSendPrice :: ");
String befCash = kakaoVO.getBefCash();
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
// String befCash = kakaoVO.getBefCash();
//VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
if("".equals(befCash) || befCash == null) {
}
MjonMsgVO mjonMsgVO = new MjonMsgVO(); MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setUserId(kakaoVO.getUserId()); mjonMsgVO.setUserId(kakaoVO.getUserId());
String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO); String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
@ -55,6 +438,7 @@ public class KakaoSendUtil {
/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
//대체문자 발송 여부 확인 //대체문자 발송 여부 확인
System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn());
if(kakaoVO.getSubMsgSendYn().equals("Y")) { if(kakaoVO.getSubMsgSendYn().equals("Y")) {
@ -401,6 +785,107 @@ public class KakaoSendUtil {
varValInfo = kakaoVO.getVarValList().get(count); varValInfo = kakaoVO.getVarValList().get(count);
} }
String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo); 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<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
//전체 받는사람 수량만큼 반복 확인
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)); // String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명 setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
} }
@ -509,6 +994,7 @@ public class KakaoSendUtil {
public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) { public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) {
System.out.println("tempSubMagTxt : "+ tempSubMagTxt);
// String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n"); // String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
// String tempSubMagTxt = msgTxt; // String tempSubMagTxt = msgTxt;
@ -551,6 +1037,7 @@ public class KakaoSendUtil {
return tempSubMagTxt; return tempSubMagTxt;
} }
public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{ public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{
List<String[]> varValList = kakaoVO.getVarValList(); List<String[]> varValList = kakaoVO.getVarValList();
@ -704,5 +1191,10 @@ public class KakaoSendUtil {
//} //}
return ""; return "";
} }
public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
statusResponse.setStatus(httpStatus);
statusResponse.setMessage(msg);
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@ import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
@ -18,6 +19,7 @@ import org.springframework.stereotype.Component;
import itn.com.cmm.util.StringUtil; import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.KakaoButtonVO; import itn.let.kakao.kakaoComm.KakaoButtonVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.KakaoVO;
@Component @Component
@ -32,7 +34,57 @@ public class KakaoApiJsonSave {
static String json; 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) { public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
// json파일 저장 // json파일 저장
@ -109,12 +161,12 @@ public class KakaoApiJsonSave {
for(int i=0; i < varNm.length; i++) { for(int i=0; i < varNm.length; i++) {
for(int j=0; j < varValInfo.length; j++) { for(int j=0; j < varValInfo.length; j++) {
if (templateTitle.indexOf(varNm[i]) > -1) { if (templateTitle.indexOf(varNm[i]) > -1) {
if(varValInfo[j] != null) { if(varValInfo[j] != null) {
templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j])); templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
}else { }else {
templateTitle = templateTitle.replaceAll(varNm[i] , ""); templateTitle = templateTitle.replaceAll(varNm[i] , "");
} }
} }
} }
} }
@ -140,8 +192,8 @@ public class KakaoApiJsonSave {
// 입력 json 데이터를 파일로 변경 // 입력 json 데이터를 파일로 변경
String jsonStr = jo.toString(); String jsonStr = jo.toString();
System.out.println("jsonFileName : "+jsonFileName); // System.out.println("jsonFileName : "+jsonFileName);
File outPut = new File(jsonFileName); File outPut = new File(jsonFileName);
outPut.createNewFile(); outPut.createNewFile();

View File

@ -2,7 +2,11 @@ package itn.let.kakao.user.kakaoAt.service;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletRequest;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
public interface KakaoAlimTalkService { public interface KakaoAlimTalkService {
@ -24,5 +28,7 @@ public interface KakaoAlimTalkService {
//카카오 친구톡 전송 실패 환불리스트 조회 //카카오 친구톡 전송 실패 환불리스트 조회
public void selectKakaoFtSentRefundList() throws Exception; public void selectKakaoFtSentRefundList() throws Exception;
StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
} }

View File

@ -6,6 +6,7 @@ import java.util.List;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.KakaoVO;
@Repository("kakaoAlimTalkDAO") @Repository("kakaoAlimTalkDAO")
@ -43,15 +44,6 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
return result; return result;
} }
public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
int result = 0;
result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
return result;
}
public void insertKakaoSendPrice(KakaoVO kakaoVO) throws Exception{ public void insertKakaoSendPrice(KakaoVO kakaoVO) throws Exception{
insert("kakaoAlimTalkDAO.insertKakaoSendPrice",kakaoVO); insert("kakaoAlimTalkDAO.insertKakaoSendPrice",kakaoVO);
} }
@ -94,4 +86,26 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
public void updateKakaoFtNotSend(KakaoVO kakaoVO) { public void updateKakaoFtNotSend(KakaoVO kakaoVO) {
select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO); select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO);
} }
public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
int result = 0;
result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
return result;
}
public int insertKakaoAtDataInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
return update("kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc", kakaoSendAdvcVOList);
}
public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList);
}
public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
}
} }

View File

@ -1,19 +1,40 @@
package itn.let.kakao.user.kakaoAt.service.impl; package itn.let.kakao.user.kakaoAt.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; 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.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 org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService; 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.kakaoComm.KakaoVO;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; 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.mjocommon.MjonHolidayApi;
import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msg.service.impl.MjonMsgDAO; 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.msgholiday.service.impl.MsgHolidayDAO;
import itn.let.mjo.pay.service.MjonPayService; import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO; 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.JoinSettingVO;
import itn.let.sym.site.service.impl.SiteManagerDAO; 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") @Service("kakaoAlimTalkService")
public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{
@ -47,12 +73,28 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Resource(name = "egovMjonMsgIdGnrService") @Resource(name = "egovMjonMsgIdGnrService")
private EgovIdGnrService idgenMsgId; private EgovIdGnrService idgenMsgId;
@Resource(name = "egovMjonMsgGroupIdGnrService")
private EgovIdGnrService idgenMjonMsgGroupId;
@Resource(name = "mjonPayService") @Resource(name = "mjonPayService")
private MjonPayService mjonPayService; private MjonPayService mjonPayService;
@Resource(name = "egovMjonCashIdGnrService") @Resource(name = "egovMjonCashIdGnrService")
private EgovIdGnrService idgenMjonCashId; private EgovIdGnrService idgenMjonCashId;
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@Autowired
KakaoSendUtil kakaoSendUtil;
@Autowired
private MjonCommon mjonCommon;
@Autowired
private PriceAndPoint priceAndPoint;
//발신프로필 상태값 변경(삭제/복구 기능) //발신프로필 상태값 변경(삭제/복구 기능)
@Override @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<String, Object> 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<KakaoSendAdvcVO> 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<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
// instTotalCnt : 화면에서 보여줄 발송건수
int instTotalCnt = 0;
// 임시
List<String> nextMsgGroupIdA = new ArrayList<>();
// 대안: entrySet() 직접 사용
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
// entry 사용
List<KakaoSendAdvcVO> 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<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
// TODO Auto-generated method stub
// 측정할 메소드 호출 시간 기록
List<KakaoSendAdvcVO> 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<KakaoSendAdvcVO> 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<Double> batchExecutionTimes = new ArrayList<>();
// 번째 배치에서만 삽입했는지 추적하는 플래그
for (int i = 0; i < totalSize; i += batchSize) {
// Batch 시작 시간 측정
long batchStartTime = System.currentTimeMillis();
// Batch 리스트 생성
List<KakaoSendAdvcVO> 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<KakaoSendAdvcVO> 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;
}
} }

View File

@ -35,9 +35,11 @@ import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; 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.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; 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.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil; import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil; import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; 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.KakaoApiTemplate;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService; import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService; 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.MjonCommon;
import itn.let.mjo.mjocommon.MjonHolidayApi; import itn.let.mjo.mjocommon.MjonHolidayApi;
import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataService;
@ -216,7 +222,29 @@ public class KakaoAlimTalkSendController {
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId)); model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
} }
if("Y".equals(kakaoVO.getMsgResendAllFlag())) {
List<MjonMsgDataVO> resendList = new ArrayList<MjonMsgDataVO>();
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";
// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310";
} }
@ -1057,6 +1085,16 @@ public class KakaoAlimTalkSendController {
return modelAndView; return modelAndView;
} }
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST)
public ResponseEntity<StatusResponse> 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) @RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST)
// @ResponseBody // @ResponseBody
public ModelAndView kakaoAlimTalkMsgSendAjax( public ModelAndView kakaoAlimTalkMsgSendAjax(
@ -1064,6 +1102,10 @@ public class KakaoAlimTalkSendController {
HttpServletRequest request, HttpServletRequest request,
@ModelAttribute("kakaoVO") KakaoVO kakaoVO @ModelAttribute("kakaoVO") KakaoVO kakaoVO
) throws Exception { ) throws Exception {
// 시작 시간
long startTime = System.currentTimeMillis();
System.out.println(" :: kakaoAlimTalkMsgSendAjax :: ");
ModelAndView modelAndView = new ModelAndView(); ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView"); modelAndView.setViewName("jsonView");
@ -1388,7 +1430,7 @@ public class KakaoAlimTalkSendController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
mjonCommon.getAdminKakaoAtSandSlack(kakaoVO); // mjonCommon.getAdminKakaoAtSendSlack(kakaoVO);
} }
@ -1400,7 +1442,94 @@ public class KakaoAlimTalkSendController {
} catch (Exception e) { } catch (Exception e) {
throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + 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; 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<KakaoVO> selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("kakaoProfileList", selectKakaoProfileList);
//발신번호 불러오기
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
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";
}
} }

View File

@ -663,7 +663,7 @@ public class KakaoFriendsTalkSendController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송 if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
MjonCommon comm = new MjonCommon(); MjonCommon comm = new MjonCommon();
comm.getAdminKakaoAtSandSlack(kakaoVO); // comm.getAdminKakaoAtSendSlack(kakaoVO);
} }

View File

@ -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<FileInfoVO> fileInfos;
}

View File

@ -1,6 +1,7 @@
package itn.let.kakao.user.sent.service; package itn.let.kakao.user.sent.service;
import java.util.List; import java.util.List;
import java.util.Map;
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
@ -31,5 +32,11 @@ public interface KakaoSentService {
//예약 결과 전체 발송 리스트 불러오기 //예약 결과 전체 발송 리스트 불러오기
public List<KakaoSentVO> selectReservKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception; public List<KakaoSentVO> selectReservKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception;
public Map<String, Object> selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception;
public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception;
//발송 관리 문자발송 내용 상세보기 팝업
public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception;
} }

View File

@ -4,7 +4,11 @@ import java.util.Date;
import java.util.List; import java.util.List;
import itn.let.uss.umt.service.UserDefaultVO; import itn.let.uss.umt.service.UserDefaultVO;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class KakaoSentVO extends UserDefaultVO{ public class KakaoSentVO extends UserDefaultVO{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -90,6 +94,7 @@ public class KakaoSentVO extends UserDefaultVO{
private int successCount; private int successCount;
private int waitCount; private int waitCount;
private int failCount; private int failCount;
private int allCount;
private String bizUmid; private String bizUmid;
private int kakaoResendSuccCount; private int kakaoResendSuccCount;
@ -103,471 +108,11 @@ public class KakaoSentVO extends UserDefaultVO{
private String atDelayCompleteYn; //알림톡 30분 지연 승인/취소 처리 여부 private String atDelayCompleteYn; //알림톡 30분 지연 승인/취소 처리 여부
private Date atDelayOrgTime; //알림톡 30분 지연에 대한 원래 시간 (-30분 처리된 시간) private Date atDelayOrgTime; //알림톡 30분 지연에 대한 원래 시간 (-30분 처리된 시간)
public String getCallToComma() { private String statusCd;
return callToComma;
}
public void setCallToComma(String callToComma) {
this.callToComma = callToComma;
}
public String getCallFromComma() {
return callFromComma;
}
public void setCallFromComma(String callFromComma) {
this.callFromComma = callFromComma;
}
public String getAtchFiles() { private int successPrice;
return atchFiles; private int kakaoResendSuccPrice;
}
public void setAtchFiles(String atchFiles) {
this.atchFiles = atchFiles;
}
public String getMsgId() { private String divideYn;
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;
}
} }

View File

@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
import itn.let.kakao.user.sent.service.KakaoSentVO; import itn.let.kakao.user.sent.service.KakaoSentVO;
@Repository("KakaoSentDAO") @Repository("KakaoSentDAO")
@ -45,6 +46,10 @@ public class KakaoSentDAO extends EgovAbstractDAO {
public List<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{ public List<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{
return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentList",kakaoSentVO); return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentList",kakaoSentVO);
} }
@SuppressWarnings("unchecked")
public List<KakaoSentVO> selectAllKakaoSentList_advc(KakaoSentVO kakaoSentVO) throws Exception{
return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentList_advc",kakaoSentVO);
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public List<KakaoSentVO> selectAllPrivateKakaoSentList(KakaoSentVO KakaoSentVO) throws Exception{ public List<KakaoSentVO> selectAllPrivateKakaoSentList(KakaoSentVO KakaoSentVO) throws Exception{
@ -90,4 +95,39 @@ public class KakaoSentDAO extends EgovAbstractDAO {
return (List<KakaoSentVO>) list("KakaoSentDAO.selectReservKakaoSentList",kakaoSentVO); return (List<KakaoSentVO>) list("KakaoSentDAO.selectReservKakaoSentList",kakaoSentVO);
} }
@SuppressWarnings("unchecked")
public List<KakaoSentVO> selectKakaoSentCntAll_advc(KakaoSentVO kakaoSentVO) throws Exception{
List<KakaoSentVO> result = new ArrayList<KakaoSentVO>();
try {
result = (List<KakaoSentVO>) 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<String> findByReqDateWhereMsgGroupId(String msgGroupId) {
return (List<String>) list("KakaoSentDAO.findByReqDateWhereMsgGroupId", msgGroupId);
}
//발송 관리 문자발송 내용 상세보기 팝업[그룹]
public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
}
} }

View File

@ -1,7 +1,15 @@
package itn.let.kakao.user.sent.service.impl; 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.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -10,6 +18,7 @@ import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO; 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.KakaoSentService;
import itn.let.kakao.user.sent.service.KakaoSentVO; import itn.let.kakao.user.sent.service.KakaoSentVO;
@ -29,7 +38,8 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
try { try {
result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO); // result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO);
} catch (Exception e) { } catch (Exception e) {
throw new Exception("++++++++++ ErrorService Impl :: " + e); throw new Exception("++++++++++ ErrorService Impl :: " + e);
@ -38,30 +48,83 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
return result; return result;
} }
public Map<String, Object> selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception{
List<KakaoSentVO> result = new ArrayList<KakaoSentVO>();
Map<String, Object> returnMap = new HashMap<String, Object>();
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<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{ public List<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{
List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>(); List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>();
String listType = kakaoSentVO.getListType(); resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
String stateType = kakaoSentVO.getStateType();
if(stateType.equals("fail")) { //totPrice 계산 상태코드 set
resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList());
listType = "privateList";
}
System.out.println("listType : "+ listType);
if(listType.equals("groupList")) {//전송건별 리스트 불러오기
resultList = kakaoSentDAO.selectAllKakaoSentList(kakaoSentVO);
}else {//개인별 리스트 불러오기
resultList = kakaoSentDAO.selectAllPrivateKakaoSentList(kakaoSentVO);
}
return resultList; return resultList;
} }
@ -149,5 +212,229 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
return kakaoSentDAO.selectReservKakaoSentList(kakaoSentVO); 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<String> requestTimes = kakaoSentDAO.findByReqDateWhereMsgGroupId(msgGroupId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
Map<LocalDateTime, Integer> timeCountMap = new LinkedHashMap<>();
// REQ_DATE 그룹화 (같은 시간대 건인지)
for (String timeStr : requestTimes) {
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1);
}
// 가장 번째 시간 & 간격 계산
List<LocalDateTime> 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);
}
} }

View File

@ -8,6 +8,7 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -26,6 +27,8 @@ import org.json.simple.parser.JSONParser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute; 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.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO; import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate; 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.KakaoSentService;
import itn.let.kakao.user.sent.service.KakaoSentVO; import itn.let.kakao.user.sent.service.KakaoSentVO;
@ -82,26 +86,26 @@ public class KakaoSentController {
//전체 발송 건수 통계 불러오기 //전체 발송 건수 통계 불러오기
kakaoSentVO.setMsgType(""); kakaoSentVO.setMsgType("");
List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO); // List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO);
model.addAttribute("totalMsgCnt", totalMsgCnt); // model.addAttribute("totalMsgCnt", totalMsgCnt);
//
List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>(); // List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>();
List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>(); // List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>();
//
//
totalMsgCnt.forEach(t->{ // totalMsgCnt.forEach(t->{
if (Integer.parseInt(t.getFilePath1())>0) { // if (Integer.parseInt(t.getFilePath1())>0) {
atCnt.add(t); // atCnt.add(t);
} else if (Integer.parseInt(t.getFilePath2())>0) { // } else if (Integer.parseInt(t.getFilePath2())>0) {
ftCnt.add(t); // ftCnt.add(t);
} // }
}); // });
//
//알림톡 성공건, 실패건 불러오기 // //알림톡 성공건, 실패건 불러오기
model.addAttribute("atCnt", atCnt); // model.addAttribute("atCnt", atCnt);
//
//친구톡 성공건, 실패건 불러오기 // //친구톡 성공건, 실패건 불러오기
model.addAttribute("ftCnt", ftCnt); // model.addAttribute("ftCnt", ftCnt);
// 검색 리스트 불러오기 // 검색 리스트 불러오기
if(kakaoSentVO.getPageUnit() != 10) kakaoSentVO.setPageUnit(kakaoSentVO.getPageUnit()); if(kakaoSentVO.getPageUnit() != 10) kakaoSentVO.setPageUnit(kakaoSentVO.getPageUnit());
@ -193,7 +197,7 @@ public class KakaoSentController {
List<KakaoSentVO> resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO); List<KakaoSentVO> resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO);
System.out.println("??"); System.out.println("??");
model.addAttribute("resultAllSentList", resultAllSentList); model.addAttribute("resultAllSentList", resultAllSentList);
model.addAttribute("resultAllSentCnt", resultAllSentList.size()); // model.addAttribute("resultAllSentCnt", resultAllSentList.size());
model.addAttribute("searchKeyword", kakaoSentVO.getSearchKeyword()); model.addAttribute("searchKeyword", kakaoSentVO.getSearchKeyword());
paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0); paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
@ -498,7 +502,6 @@ public class KakaoSentController {
* 발송관리 엑셀다운로드 기능 - 카카오톡 * 발송관리 엑셀다운로드 기능 - 카카오톡
* @param searchVO * @param searchVO
* @param model * @param model
* @return "/web/mjon/msgsent/msgSentExcelDownLoadAjax.do"
* @throws Exception * @throws Exception
*/ */
@RequestMapping(value= {"/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do"}) @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<String, Object> 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";
}
} }

View File

@ -109,4 +109,8 @@ public interface AddrService {
void deleteAddr_advc(AddrGroupVO addrGroupVO) throws Exception; void deleteAddr_advc(AddrGroupVO addrGroupVO) throws Exception;
int getAddrCount(AddrGroupVO addrGroupVO) throws Exception; int getAddrCount(AddrGroupVO addrGroupVO) throws Exception;
StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception;
StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception;
} }

View File

@ -292,5 +292,9 @@ public class AddrDAO extends EgovAbstractDAO {
return (Integer)select("AddrDAO.getAddrCount", addrVO); return (Integer)select("AddrDAO.getAddrCount", addrVO);
} }
public int deleteAddrPhoneNo(AddrVO addrVO) {
return update("AddrDAO.deleteAddrPhoneNo", addrVO);
}
} }

View File

@ -34,6 +34,8 @@ import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrService;
import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrTransHistVO;
import itn.let.mjo.addr.service.AddrVO; 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 최초 생성 * 2021.04.08 ITN 최초 생성
* </pre> * </pre>
*/ */
@Slf4j
@Service("AddrService") @Service("AddrService")
public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrService { public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrService {
@ -644,5 +647,81 @@ public class AddrServiceImpl extends EgovAbstractServiceImpl implements AddrSer
return aa; 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<AddrVO> addrDataInfo = new ArrayList<AddrVO>();
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);
}
} }

View File

@ -4,6 +4,7 @@ import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; 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.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 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.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; 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.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil; import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.fax.addr.service.FaxAddrVO; 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.AddrGroupService;
import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrService;
import itn.let.mjo.addr.service.AddrTransHistVO; import itn.let.mjo.addr.service.AddrTransHistVO;
import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.addr.service.AddrVO;
import itn.let.mjo.msgdata.service.PhoneVO; import itn.let.mjo.msgdata.service.PhoneVO;
import lombok.extern.slf4j.Slf4j;
/** /**
* 주소록 관한 controller 클래스를 정의한다. * 주소록 관한 controller 클래스를 정의한다.
@ -75,6 +81,7 @@ import itn.let.mjo.msgdata.service.PhoneVO;
* *
* </pre> * </pre>
*/ */
@Slf4j
@Controller @Controller
public class AddrController { public class AddrController {
@ -2223,6 +2230,47 @@ public class AddrController {
return modelAndView; return modelAndView;
} }
@RequestMapping(value = {"/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do"})
public ResponseEntity<StatusResponse> 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<StatusResponse> 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) { public boolean getNameRepLenChk(String type, String value) {

View File

@ -1,10 +1,12 @@
package itn.let.mjo.mjocommon; package itn.let.mjo.mjocommon;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -14,13 +16,18 @@ import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.PostMethod;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mysql.jdbc.StringUtils; 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.MjonMsgSendVO;
import itn.com.cmm.OptimalMsgResultDTO; import itn.com.cmm.OptimalMsgResultDTO;
import itn.com.cmm.util.MsgSendUtils; 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.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse; import itn.let.mail.service.StatusResponse;
import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventService;
@ -60,11 +67,14 @@ public class MjonCommon {
/** xpedite 솔루션 ID*/ /** xpedite 솔루션 ID*/
@Value("#{globalSettings['Globals.slack.channel.name']}") @Value("#{globalSettings['Globals.slack.channel.name']}")
private String SLACK_CHANNEL; private String SLACK_CHANNEL;
@Resource(name = "egovMjonMsgIdCGnrService")
private CustomIdGnrService idgenMsgCId;
/** /**
* @methodName : getAdminMsgSandSlack * @methodName : getAdminSandSlack
* @author : 이호영 * @author : 이호영
* @date : 2024.12.04 * @date : 2024.12.04
* @description : 기존 메소드 리펙토링 * @description : 기존 메소드 리펙토링
@ -120,8 +130,8 @@ public class MjonCommon {
try { try {
// 메시지 내용 설정 // 메시지 내용 설정
String smsTxt = formatSmsText(mjonMsgVO); String smsTxt = SlackMessageFormatUtil.formatSmsText(mjonMsgVO);
String sandName = formatSandName(mjonMsgVO); String sandName = SlackMessageFormatUtil.formatSandName(mjonMsgVO);
// Slack 메시지 생성 // Slack 메시지 생성
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
@ -150,94 +160,49 @@ public class MjonCommon {
} }
} }
/** public void getAdminKakaoAtSendSlack(KakaoSendAdvcVO kakaoVO) {
* @throws Exception
* @Method Name : getAdminSlackSand
* @작성일 : 2022. 12. 6.
* @작성자 : WYH
* @Method 설명 : slack 메시지 전송
*/
/*public void getAdminMsgSandSlack(MjonMsgVO mjonMsgVO) {
HttpClient client = new HttpClient(); HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url); PostMethod post = new PostMethod(SLACK_URL);
JSONObject json = new JSONObject();
try { try {
// 메시지 내용 설정
String reserveYn = mjonMsgVO.getReserveYn(); String smsTxt = SlackMessageFormatUtil.formatKakaoText(kakaoVO);
String delayYn = mjonMsgVO.getDelayYn(); String sandName = SlackMessageFormatUtil.formatKakaoSandName(kakaoVO);
String smsTxt = mjonMsgVO.getSmsTxt();
String smishingYn = mjonMsgVO.getSmishingYn();
String reservSmsTxt = "";
String smisingSmsTxt = "";
//예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리
if(reserveYn.equals("Y")) { // Slack 메시지 생성
JSONObject json = new JSONObject();
if(smishingYn.equals("Y") || delayYn.equals("Y")) { json.put("channel", SLACK_CHANNEL);
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메시지");
json.put("text", smsTxt); json.put("text", smsTxt);
json.put("username", sandName); json.put("username", sandName);
// Slack 요청
post.addParameter("payload", json.toString()); post.addParameter("payload", json.toString());
// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서 content-type넣어줌
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
// Slack 응답 처리
int responseCode = client.executeMethod(post); int responseCode = client.executeMethod(post);
String response = post.getResponseBodyAsString(); if (responseCode != HttpStatus.SC_OK) {
if (responseCode != HttpStatus.SC_OK) { log.warn("Slack 메시지 전송 실패. Response: {}", post.getResponseBodyAsString());
System.out.println("Response: " + response);
} }
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("IllegalArgumentException posting to Slack " + e); log.error("Slack 메시지 전송 중 IllegalArgumentException 발생", e);
} } catch (IOException e) {
catch (IOException e) { log.error("Slack 메시지 전송 중 IOException 발생", e);
System.out.println("IOException posting to Slack " + e); } catch (Exception e) {
} log.error("Slack 메시지 전송 중 Exception 발생", e);
catch (Exception e) {
System.out.println("Exception posting to Slack " + e);
e.printStackTrace();
} finally { } finally {
post.releaseConnection(); post.releaseConnection();
} }
}
}*/
private String formatKakaoSandName(KakaoVO kakaoVO) {
// TODO Auto-generated method stub
return null;
}
/** /**
* @Method Name : sendSimpleSlackMsg * @Method Name : sendSimpleSlackMsg
* @작성일 : 2022. 12. 9 * @작성일 : 2022. 12. 9
@ -384,7 +349,7 @@ public class MjonCommon {
return mjonMsgVO; return mjonMsgVO;
} }
/*
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) { public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) {
@ -448,7 +413,7 @@ public class MjonCommon {
} }
} }
*/
public String getCreateMsgUserIdgen(String subUserId, String lastId) throws Exception{ 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) { private String formatSandName(MjonMsgVO mjonMsgVO) {
String userId = mjonMsgVO.getUserId(); 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 { public boolean processUserAndCheckSms(MjonMsgVO mjonMsgVO, String userId) throws Exception {
UserManageVO userManageVO = getUserManageInfo(userId); UserManageVO userManageVO = getUserManageInfo(userId);
@ -556,11 +511,41 @@ private int parseIntOrDefault(String value, int defaultValue) {
mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정 mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정
// 스미싱 알림 처리 // 스미싱 알림 처리
return handleSmishingAlert(mjonMsgVO); // 알림 처리 결과 반환 return handleSmishingAlert(); // 알림 처리 결과 반환
} }
return false; // 알림 처리되지 않음 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 { 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(); JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
/** @시스템 설정에 야간스미싱 알림 || 슬랙알림이 N이면 false*/
if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) || if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) ||
!"Y".equals(joinSettingVO.getSlackNoti())) { !"Y".equals(joinSettingVO.getSlackNoti())) {
return false; // 알림 조건 미충족 return false; // 알림 조건 미충족
} }
// 알림 조건 충족 추가 작업 /** @MJ_SPAMPASS_ALARM : 현재 활성화된 알림 SELECT */
List<MsgAlarmSetVO> alarmList = getAlarmSettings(); List<MsgAlarmSetVO> alarmList = getAlarmSettings();
/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */
List<MsgHolidayVO> holidayList = getHolidayList(); List<MsgHolidayVO> holidayList = getHolidayList();
boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus(alarmList, holidayList); /** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */
boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus_advc(alarmList, holidayList);
return !isNotificationAllowed; // 알림 발송 조건 미충족 return !isNotificationAllowed; // 알림 발송 조건 미충족
} }
@ -699,9 +694,55 @@ private int parseIntOrDefault(String value, int defaultValue) {
public List<String> getNextCustomMsgCId (int cnt) throws FdlException {
List<String> 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<String, String> variables) {
String result = content;
for (Map.Entry<String, String> entry : variables.entrySet()) {
String placeholder = entry.getKey();
String value = entry.getValue();
result = result.replace(placeholder, value);
}
return result;
}

View File

@ -231,4 +231,71 @@ public class MjonHolidayApi {
return smishingAlarmPassSts; 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<MsgAlarmSetVO> alarmList, List<MsgHolidayVO> 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;
}
} }

View File

@ -7,12 +7,18 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import itn.com.cmm.ComDefaultVO; import itn.com.cmm.ComDefaultVO;
import itn.com.cmm.MjonMsgSendVO; import itn.com.cmm.MjonMsgSendVO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Getter @Getter
@Setter @Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MjonMsgVO extends ComDefaultVO{ public class MjonMsgVO extends ComDefaultVO{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -34,6 +40,7 @@ public class MjonMsgVO extends ComDefaultVO{
private String[] callToList; // '수신번호리스트', private String[] callToList; // '수신번호리스트',
private String callFrom; // '발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)', private String callFrom; // '발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)',
private String subject; // 'MMS용 메시지제목', private String subject; // 'MMS용 메시지제목',
private String subjectChkYn; // 'MMS용 메시지제목',
private String smsTxt; // 'SMS용 메시지본문', private String smsTxt; // 'SMS용 메시지본문',
private String smsTxtArea;//문자 작성 화면 본문 내용 private String smsTxtArea;//문자 작성 화면 본문 내용
private String msgType; // '메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)', private String msgType; // '메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)',

View File

@ -28,6 +28,7 @@ public class MjonMsgDataVO extends UserDefaultVO{
private List msgIdList; private List msgIdList;
private List msgSeqList; private List msgSeqList;
private String subject; private String subject;
private String subjectChkYn;
private String mmsSubject; private String mmsSubject;
private String smsTxt; private String smsTxt;
private String smsLen; private String smsLen;

View File

@ -4061,7 +4061,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
System.out.println("================================"); System.out.println("================================");
// 스팸 스미싱 의심이면 slack 알림 // 스팸 스미싱 의심이면 slack 알림
boolean isHolidayNotified = mjonCommon.handleSmishingAlert(mjonMsgVO); boolean isHolidayNotified = mjonCommon.handleSmishingAlert();
// 스팸관련 키워드 select // 스팸관련 키워드 select
@ -4095,7 +4095,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
MsgSendUtils.setPriceforVO(mjonMsgVO, mjonMsgSendVOList, sysJoinSetVO, mberManageVO); MsgSendUtils.setPriceforVO(mjonMsgVO, mjonMsgSendVOList, sysJoinSetVO, mberManageVO);
// msg_id 대량 생성 // msg_id 대량 생성
List<String> idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size());
// List<String> idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size());
List<String> idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size());
for (int i = 0; i < mjonMsgSendVOList.size(); i++) { for (int i = 0; i < mjonMsgSendVOList.size(); i++) {
mjonMsgSendVOList.get(i).setMsgId(idList.get(i)); mjonMsgSendVOList.get(i).setMsgId(idList.get(i));
} }
@ -4136,7 +4138,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
int instTotalCnt = 0; int instTotalCnt = 0;
// Step 2: 그룹화 데이터를 그룹별로 insert 처리 // Step 2: 그룹화 데이터를 그룹별로 insert 처리
for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) { for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) {
String price = entry.getKey(); // 가격 (String)
List<MjonMsgSendVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트 List<MjonMsgSendVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
// msgGroupId 생성 // msgGroupId 생성
@ -4150,6 +4151,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
instTotalCnt += instCnt; instTotalCnt += instCnt;
this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList); this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList);
log.info(" :: group data insert :: ");
// 금액 포인트 insert // 금액 포인트 insert
priceAndPoint.insertCashAndPoint( priceAndPoint.insertCashAndPoint(
@ -4171,7 +4173,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M
// 수신거부 목록 업데이트 // 수신거부 목록 업데이트
// returnMap.put("resultSts", instCnt); // returnMap.put("resultSts", instCnt);
log.debug("가격 [{}]의 총 갯수: [{}]", price, groupedMsgList.size()); log.debug("가격 [{}]의 총 갯수: [{}]", entry.getKey(), groupedMsgList.size());
} }

View File

@ -114,8 +114,9 @@ import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageVO; import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO; import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.sim.service.EgovClntInfo; import itn.let.utl.sim.service.EgovClntInfo;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller @Controller
public class MjonMsgDataController { public class MjonMsgDataController {
@ -816,6 +817,7 @@ public class MjonMsgDataController {
mjonMsgDataVO.setMsgSeqList(tempList); mjonMsgDataVO.setMsgSeqList(tempList);
log.info("===================================================");
List<MjonMsgVO> resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO); List<MjonMsgVO> resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO);
//문자발송 이미지 처리 - 사용하지 않아서 주석처리함. //문자발송 이미지 처리 - 사용하지 않아서 주석처리함.
@ -2088,16 +2090,8 @@ public class MjonMsgDataController {
} }
long startTime = System.currentTimeMillis(); // 시작 시간 측정
List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO); List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO);
long endTime = System.currentTimeMillis(); // 종료 시간 측정
long elapsedTime = endTime - startTime; // 소요 시간 계산
System.out.println("소요 시간: " + elapsedTime + " 밀리초");
modelAndView.addObject("resultAddrList", resultAddrList); modelAndView.addObject("resultAddrList", resultAddrList);
modelAndView.addObject("result", "success"); modelAndView.addObject("result", "success");
@ -5961,7 +5955,6 @@ public class MjonMsgDataController {
* 발송관리 엑셀다운로드 기능 * 발송관리 엑셀다운로드 기능
* @param searchVO * @param searchVO
* @param model * @param model
* @return "/web/mjon/msgsent/msgSentExcelDownLoadAjax.do"
* @throws Exception * @throws Exception
*/ */
@RequestMapping(value= {"/web/mjon/msgdata/recieveCallToListExcelDownAjax.do"}) @RequestMapping(value= {"/web/mjon/msgdata/recieveCallToListExcelDownAjax.do"})

View File

@ -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<FileInfoVO> fileInfos;
}

View File

@ -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; // 분할여부
}

View File

@ -1,6 +1,10 @@
package itn.let.mjo.msgsent.service; package itn.let.mjo.msgsent.service;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.fax.addr.service.FaxAddrGroupVO;
import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO;
@ -16,6 +20,8 @@ public interface MjonMsgSentService {
//발송 관리 전체 발송 리스트 불러오기 //발송 관리 전체 발송 리스트 불러오기
public List<MjonMsgSentVO> selectAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) throws Exception; public List<MjonMsgSentVO> selectAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) throws Exception;
public Map<String, Object> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception;
//발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전 //발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전
public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception; public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception;
@ -54,5 +60,14 @@ public interface MjonMsgSentService {
//첨부파일 정보 불러오기 //첨부파일 정보 불러오기
public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception; public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception;
public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO);
public Map<String, Object> selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception;
public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO);
public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws IOException, Exception;
} }

View File

@ -4,7 +4,17 @@ import java.util.Date;
import java.util.List; import java.util.List;
import itn.let.uss.umt.service.UserDefaultVO; 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{ public class MjonMsgSentVO extends UserDefaultVO{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -16,8 +26,9 @@ public class MjonMsgSentVO extends UserDefaultVO{
private List msgGroupIdList; //문자 그룹아이디 리스트 private List msgGroupIdList; //문자 그룹아이디 리스트
private String smsTxt; //문자 내용 private String smsTxt; //문자 내용
private String subject; //문자 제목 private String subject; //문자 제목
private Date regdate; //문자 등록일자 private String subjectChkYn; //문자 제목
private Date reqdate; //문자 예약 발송 일자 private String regDate; //문자 등록일자
private String reqDate; //문자 예약 발송 일자
private String callFrom; //발신번호 private String callFrom; //발신번호
private String callTo; //수신자 번호 private String callTo; //수신자 번호
private List callToList; //수신자 번호 리스트 private List callToList; //수신자 번호 리스트
@ -86,399 +97,16 @@ public class MjonMsgSentVO extends UserDefaultVO{
private String successCount; private String successCount;
private String resultSValue; private String resultSValue;
private String resultFValue;
private String resultWValue;
private String resultWFValue; private String resultWFValue;
public String getSuccessCount() { private String divideYN; // 분할여부
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;
}
public String getAtchFiles() { private String statusCd; // 진행상태 코드
return atchFiles;
}
public void setAtchFiles(String atchFiles) {
this.atchFiles = atchFiles;
}
public String getMsgId() { // 결과 리스트 select
return msgId; // TIMESTAMPDIFF(minute, DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
} private int diffMin;
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;
}
} }

View File

@ -9,6 +9,8 @@ import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.fax.addr.service.FaxAddrGroupVO; import itn.let.fax.addr.service.FaxAddrGroupVO;
import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.block.service.MjonBlockVO; 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; import itn.let.mjo.msgsent.service.MjonMsgSentVO;
@Repository("MjonMsgSentDAO") @Repository("MjonMsgSentDAO")
@ -56,6 +58,13 @@ public class MjonMsgSentDAO extends EgovAbstractDAO {
return (List<MjonMsgSentVO>) list("MjonMsgSentDAO.selectAllMsgSentList",mjonMsgSentVO); return (List<MjonMsgSentVO>) list("MjonMsgSentDAO.selectAllMsgSentList",mjonMsgSentVO);
} }
//발송 관리 전체 발송 리스트 불러오기
@SuppressWarnings("unchecked")
public List<MjonMsgSentVO> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{
return (List<MjonMsgSentVO>) list("MjonMsgSentDAO.selectAllMsgSentList_advc",mjonMsgSentVO);
}
//발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전 //발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{ public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{
@ -158,5 +167,28 @@ public class MjonMsgSentDAO extends EgovAbstractDAO {
public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception{ public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception{
return (MjonMsgSentVO) select("MjonMsgSentDAO.selectFileInfo", streFileId); 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<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
return (List<MjonMsgDetailSentVO>) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO);
}
public List<String> findByReqDateWhereMsgGroupId(String msgGroupId) {
return (List<String>) list("MjonMsgSentDAO.findByReqDateWhereMsgGroupId", msgGroupId);
}
} }

View File

@ -1,20 +1,51 @@
package itn.let.mjo.msgsent.service.impl; 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.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Resource; 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 org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService; 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.fax.addr.service.FaxAddrGroupVO;
import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.block.service.MjonBlockVO; 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.MjonMsgSentService;
import itn.let.mjo.msgsent.service.MjonMsgSentVO; import itn.let.mjo.msgsent.service.MjonMsgSentVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service("MjonMsgSentService") @Service("MjonMsgSentService")
public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements MjonMsgSentService{ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements MjonMsgSentService{
@ -84,6 +115,204 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements
return resultList; return resultList;
} }
/**
* advc
* 이호영 20250121
* 발송 관리 전체 발송 리스트 불러오기
*/
public Map<String, Object> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{
Map<String, Object> resultMap = new HashMap<String, Object>();
// 목록
List<MjonMsgSentVO> 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<String, Object> selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception{
Map<String, Object> resultMap = new HashMap<String, Object>();
// 목록
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<String, String> 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<FileInfoVO> 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<String> requestTimes = mjonMsgSentDAO.findByReqDateWhereMsgGroupId(msgGroupId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
Map<LocalDateTime, Integer> timeCountMap = new LinkedHashMap<>();
// REQ_DATE 그룹화 (같은 시간대 건인지)
for (String timeStr : requestTimes) {
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1);
}
// 가장 번째 시간 & 간격 계산
List<LocalDateTime> 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<FileInfoVO> getFileInfo(MjonMsgDetailSentVO result) throws Exception {
List<FileInfoVO> 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<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{ public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception{
List<MjonMsgSentVO> resultList = new ArrayList<MjonMsgSentVO>(); List<MjonMsgSentVO> resultList = new ArrayList<MjonMsgSentVO>();
@ -243,4 +472,384 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements
public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception { public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception {
return mjonMsgSentDAO.selectFileInfo(streFileId); return mjonMsgSentDAO.selectFileInfo(streFileId);
} }
@Override
public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
List<MjonMsgDetailSentVO> 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<MjonMsgSentVO> 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<MjonMsgSentVO> makeDetailFunction(List<MjonMsgSentVO> 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<String, String> 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<String, String> 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;
}
} }

View File

@ -5,14 +5,17 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font; 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.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute; 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.cmm.util.DateUtils;
import itn.com.utl.fcc.service.EgovStringUtil; import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.user.sent.service.KakaoSentService; 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.AddrGroupService;
import itn.let.mjo.addr.service.AddrGroupVO; import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.addr.service.AddrService; import itn.let.mjo.addr.service.AddrService;
import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.addr.service.AddrVO;
import itn.let.mjo.apikey.service.ApiKeyMngService; import itn.let.mjo.apikey.service.ApiKeyMngService;
import itn.let.mjo.apikey.service.ApiKeyVO; 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.MjonMsgSentCntVO;
import itn.let.mjo.msgsent.service.MjonMsgSentService; import itn.let.mjo.msgsent.service.MjonMsgSentService;
import itn.let.mjo.msgsent.service.MjonMsgSentVO; import itn.let.mjo.msgsent.service.MjonMsgSentVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller @Controller
public class MjonMsgSentController { public class MjonMsgSentController {
@ -99,115 +108,10 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
return "redirect:/web/user/login/login.do"; return "redirect:/web/user/login/login.do";
} }
mjonMsgSentVO.setUserId(userId); // mjonMsgSentVO.setUserId(userId);
// ApiKeyVO apiKeyVO = new ApiKeyVO();
/* // apiKeyVO.setMberId(userId);
//전체 발송 건수 통계 불러오기 // model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false);
mjonMsgSentVO.setMsgType("");
List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
model.addAttribute("totalMsgCnt", totalMsgCnt);
//단문 성공건, 실패건 불러오기
mjonMsgSentVO.setMsgType("4");
List<MjonMsgSentVO> smsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
model.addAttribute("smsMsgCnt", smsMsgCnt);
//장문 성공건, 실패건 불러오기
mjonMsgSentVO.setMsgType("6");
mjonMsgSentVO.setFileCnt("0");
List<MjonMsgSentVO> lmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
model.addAttribute("lmsMsgCnt", lmsMsgCnt);
//그림문자 성공건, 실패건 불러오기
mjonMsgSentVO.setMsgType("6");
mjonMsgSentVO.setFileCnt("1");
List<MjonMsgSentVO> mmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
model.addAttribute("mmsMsgCnt", mmsMsgCnt);
*/
/*
//전체 발송 건수 통계 불러오기
mjonMsgSentVO.setMsgType("");
List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO);
System.out.println("start");
// H:홈페이지, A:API sms, lms, mms 나누는 영역
List<MjonMsgSentVO> H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList());
List<MjonMsgSentVO> H_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> H_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> H_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
System.out.println("start");
List<MjonMsgSentVO> A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList());
List<MjonMsgSentVO> A_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> A_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> A_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
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));
*/
/*<isEqual prepend="AND" property="searchCondition" compareValue="2">
a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%')
</isEqual>
*/
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(); // log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
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());
String startDate = mjonMsgSentVO.getSearchStartDate();
String endDate = mjonMsgSentVO.getSearchEndDate();
if(startDate == null && endDate == null ) { if(StringUtils.isEmpty(startDate)
&& StringUtils.isEmpty(endDate))
{
mjonMsgSentVO.setSearchStartDate(DateUtils.getDateMonthsAgo(3));
// mjonMsgSentVO.setSearchEndDate(DateUtils.getCurrentDate());
// 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());
} }
log.info("pageIndex :: [{}]", mjonMsgSentVO.getPageIndex());
model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword()); model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
model.addAttribute("siteId", mjonMsgSentVO.getSiteId()); model.addAttribute("siteId", mjonMsgSentVO.getSiteId());
return "web/msgsent/MsgSentView"; 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<String, Object> resultMap = mjonMsgSentService.selectAllMsgSentDetailView(mjonMsgDetailSentVO);
model.addAttribute("result", resultMap.get("result"));
return "web/msgsent/MsgSentDetailView";
}
// 팩스 금일 발송통계 갱신
@RequestMapping(value= {"/web/mjon/msgsent/findByMsgDetailListAjax.do"})
public ResponseEntity<StatusResponse> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception {
List<MjonMsgDetailSentVO> resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO);
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", resultList));
}
/** /**
* 마이페이지 - 이용내역 - ajax * 마이페이지 - 이용내역 - ajax
@ -275,7 +209,6 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
HttpServletRequest request, HttpServletRequest request,
ModelMap model) throws Exception{ ModelMap model) throws Exception{
System.out.println("MsgSentView_HA_allSentAjax");
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
@ -283,29 +216,24 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
mjonMsgSentVO.setUserId(userId); mjonMsgSentVO.setUserId(userId);
log.info("+ mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
log.info("+ mjonMsgSentVO.getSearchEndDate() :: [{}]", mjonMsgSentVO.getSearchEndDate());
//전체 발송 건수 통계 불러오기 //전체 발송 건수 통계 불러오기
mjonMsgSentVO.setMsgType(""); mjonMsgSentVO.setMsgType("");
long startTime = System.nanoTime(); // 시작 시간 측정
List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO); List<MjonMsgSentVO> 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 나누는 영역 // H:홈페이지, A:API sms, lms, mms 나누는 영역
List<MjonMsgSentVO> H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList());
List<MjonMsgSentVO> H_smsMsgCnt = new ArrayList<MjonMsgSentVO>(); List<MjonMsgSentVO> H_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> H_lmsMsgCnt = new ArrayList<MjonMsgSentVO>(); List<MjonMsgSentVO> H_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> H_mmsMsgCnt = new ArrayList<MjonMsgSentVO>(); List<MjonMsgSentVO> H_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
System.out.println("start"); totalMsgCnt.forEach(t->{
List<MjonMsgSentVO> A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList());
List<MjonMsgSentVO> A_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> A_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
List<MjonMsgSentVO> A_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
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) { if (Integer.parseInt(t.getFilePath1())>0) {
H_smsMsgCnt.add(t); H_smsMsgCnt.add(t);
} else if (Integer.parseInt(t.getFilePath2())>0) { } 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 //* 홈페이지에서 보낸 데이터 LIST
//* SEND_KIND = "H" //* SEND_KIND = "H"
// 전체 영역 // 전체 영역
model.addAttribute("H_allSentCntVO", this.getResultCntProc(H_totalMsgCnt)); log.info("all");
model.addAttribute("H_allSentCntVO", this.getResultCntProc(totalMsgCnt));
// 전체 단문(SMS) // 전체 단문(SMS)
log.info("sms");
model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt)); model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt));
// 전체 장문(LMS) // 전체 장문(LMS)
log.info("lms");
model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt)); model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt));
// 전체 장문(LMS) // 전체 그림(MMS)
log.info("mms");
model.addAttribute("H_mmsSentCntVO", this.getResultCntProc(H_mmsMsgCnt)); 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));
/*<isEqual prepend="AND" property="searchCondition" compareValue="2">
a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%')
</isEqual>
*/
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"; return "/web/msgsent/subcontent/MsgSentView_HA_allSentAjax";
} }
@ -395,14 +287,17 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
cntVO.setWaitCnt(msgCnt.stream() cntVO.setWaitCnt(msgCnt.stream()
.filter(f->"W".equals(f.getMsgResultSts())) .filter(f->"W".equals(f.getMsgResultSts()))
.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
log.info(" :: cntVO.getWaitCnt() :: [{}]", cntVO.getWaitCnt());
// 전체 성공 갯수 // 전체 성공 갯수
cntVO.setSuccCnt(msgCnt.stream() cntVO.setSuccCnt(msgCnt.stream()
.filter(f->"S".equals(f.getMsgResultSts())) .filter(f->"S".equals(f.getMsgResultSts()))
.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
log.info(" :: cntVO.getSuccCnt() :: [{}]", cntVO.getSuccCnt());
// 전체 실패 갯수 // 전체 실패 갯수
cntVO.setFailCnt(msgCnt.stream() cntVO.setFailCnt(msgCnt.stream()
.filter(f->"F".equals(f.getMsgResultSts())) .filter(f->"F".equals(f.getMsgResultSts()))
.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum()); .mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
log.info(" :: cntVO.getFailCnt() :: [{}]", cntVO.getFailCnt());
// 전체 갯수 구하기 // 전체 갯수 구하기
cntVO.setTotCnt(cntVO.getWaitCnt() + cntVO.getSuccCnt() + 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"}) @RequestMapping(value= {"/web/mjon/msgsent/selectMsgSentListViewAjax.do"})
public String selectMsgSentListViewAjax(@ModelAttribute("searchVO") MjonMsgSentVO mjonMsgSentVO, ModelMap model) throws Exception{ 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<String, Object> 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; LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
mjonMsgSentVO.setUserId(userId); mjonMsgSentVO.setUserId(userId);
// 검색 리스트 불러오기 // 검색 리스트 불러오기
if(mjonMsgSentVO.getPageUnit() != 10) { if(mjonMsgSentVO.getPageUnit() != 10) {
mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit()); mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit());
} }
//기본 내림차순 정렬 //기본 내림차순 정렬
if(mjonMsgSentVO.getSearchSortOrd().equals("")) { if(mjonMsgSentVO.getSearchSortOrd().equals("")) {
mjonMsgSentVO.setSearchSortOrd("desc"); mjonMsgSentVO.setSearchSortOrd("desc");
mjonMsgSentVO.setSearchSortCnd("regdate"); mjonMsgSentVO.setSearchSortCnd("regdate");
} }
if(mjonMsgSentVO.getListType().equals("")) { if(mjonMsgSentVO.getListType().equals("")) {
mjonMsgSentVO.setListType("groupList"); mjonMsgSentVO.setListType("groupList");
} }
//선택 정보 저장 //선택 정보 저장
//mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType()); //mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType());
/** pageing */ /** pageing */
PaginationInfo paginationInfo = new PaginationInfo(); PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex()); paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex());
paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit()); paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit());
paginationInfo.setPageSize(mjonMsgSentVO.getPageSize()); paginationInfo.setPageSize(mjonMsgSentVO.getPageSize());
mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex()); mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex());
mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getStartDate(),mjonMsgSentVO.getEndDate(), 3 )) { if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getStartDate(),mjonMsgSentVO.getEndDate(), 3 )) {
mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3)); mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3));
mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate()); mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate());
}; };
model.addAttribute("startDate", mjonMsgSentVO.getStartDate());
model.addAttribute("endDate", mjonMsgSentVO.getEndDate());
//전체 발송 리스트 불러오기 model.addAttribute("startDate", mjonMsgSentVO.getStartDate());
List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO); model.addAttribute("endDate", mjonMsgSentVO.getEndDate());
model.addAttribute("resultAllSentList", resultAllSentList);
model.addAttribute("resultAllSentCnt", resultAllSentList.size()); //전체 발송 리스트 불러오기
List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO);
model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("resultAllSentList", resultAllSentList);
model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount()); model.addAttribute("resultAllSentCnt", resultAllSentList.size());
//발송 결과 성공 실패 건수 리스트 불러오기 model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
List<MjonMsgSentVO> resultMsgSucFailList = new ArrayList<MjonMsgSentVO>(); paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
model.addAttribute("paginationInfo", paginationInfo);
if(resultAllSentList.size() > 0) { model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount());
resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO);
} //발송 결과 성공 실패 건수 리스트 불러오기
model.addAttribute("resultMsgSucFailList", resultMsgSucFailList); List<MjonMsgSentVO> resultMsgSucFailList = new ArrayList<MjonMsgSentVO>();
model.addAttribute("mjonMsgSentVO", mjonMsgSentVO); if(resultAllSentList.size() > 0) {
System.out.println("=====resultMsgSucFailList=====");
String stateType = mjonMsgSentVO.getStateType(); resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO);
String pageUrl = "web/msgsent/MsgSentAllListAjax"; System.out.println("//=====resultMsgSucFailList=====");
}
if(stateType.equals("ready")) { model.addAttribute("resultMsgSucFailList", resultMsgSucFailList);
pageUrl = "web/msgsent/MsgSentReadyListAjax"; model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
}else if(stateType.equals("complete")) { String stateType = mjonMsgSentVO.getStateType();
// String pageUrl = "web/msgsent/MsgSentAllListAjax";
pageUrl = "web/msgsent/MsgSentCompleteListAjax"; String pageUrl = "web/msgsent/MsgSentAllListAjax";
}else if(stateType.equals("fail")) { if(stateType.equals("ready")) {
pageUrl = "web/msgsent/MsgSentFailListAjax"; 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; return pageUrl;
} }
@ -622,6 +601,9 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
return "web/msgsent/MsgSentDetailPopAjax"; return "web/msgsent/MsgSentDetailPopAjax";
} }
/** /**
* 발송관리 문자 상세보기 내용 * 발송관리 문자 상세보기 내용
* @param searchVO * @param searchVO
@ -1138,320 +1120,9 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll
} }
String stateType = mjonMsgSentVO.getStateType();
String tabType = mjonMsgSentVO.getTabType();
// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. mjonMsgSentService.msgSentExcelDownLoad(mjonMsgSentVO, response);
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<MjonMsgSentVO> 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) {}
}
} }

View File

@ -13,11 +13,9 @@ import java.nio.charset.Charset;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -41,18 +39,12 @@ import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 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.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; 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.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerMapping; 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.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource; import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO; import itn.com.cmm.LoginVO;
import itn.com.cmm.RestResponse;
import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.FileVO; import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.DateUtils; 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.RedirectUrlMaker;
import itn.com.cmm.util.StringUtil; import itn.com.cmm.util.StringUtil;
import itn.com.utl.fcc.service.EgovStringUtil; 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.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO; 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.MberManageVO;
import itn.let.uss.umt.service.UserManageVO; import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.fcc.service.EgovCryptoUtil; import itn.let.utl.fcc.service.EgovCryptoUtil;
import itn.let.utl.user.service.ExcelUtil;
import itn.let.utl.user.service.MjonNoticeSendUtil; import itn.let.utl.user.service.MjonNoticeSendUtil;
@Controller @Controller
@ -1952,7 +1942,6 @@ public class MjonPayController {
model.addAttribute("prePaymentYn", userManageVO.getPrePaymentYn()); model.addAttribute("prePaymentYn", userManageVO.getPrePaymentYn());
System.out.println("pattern :: "+ pattern); System.out.println("pattern :: "+ pattern);
if(pattern.equals("/web/member/pay/PayListAllAjax.do") if(pattern.equals("/web/member/pay/PayListAllAjax.do")
|| pattern.equals("/web/member/pay/PayListMobileAjax.do") || pattern.equals("/web/member/pay/PayListMobileAjax.do")
@ -2051,7 +2040,7 @@ public class MjonPayController {
return "/web/pay/PayListRefundAjax"; return "/web/pay/PayListRefundAjax";
} }
//일반 결제 페이지 처리 //일반 결제 페이지 처리
if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
mjonPayVO.setSearchSortCnd("moid"); mjonPayVO.setSearchSortCnd("moid");
@ -2073,7 +2062,7 @@ public class MjonPayController {
} }
} }
if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체 if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체
mjonPayVO.setPageType("all"); mjonPayVO.setPageType("all");
} }
@ -2121,7 +2110,7 @@ public class MjonPayController {
// mjonPayVO.setStartDate(mjonPayVO.getStartDate() == null ? DateUtil.getDateDaysAgo(365) : mjonPayVO.getStartDate()); // mjonPayVO.setStartDate(mjonPayVO.getStartDate() == null ? DateUtil.getDateDaysAgo(365) : mjonPayVO.getStartDate());
// mjonPayVO.setEndDate(mjonPayVO.getEndDate() == null ? DateUtil.getCurrentDate() : mjonPayVO.getEndDate()); // mjonPayVO.setEndDate(mjonPayVO.getEndDate() == null ? DateUtil.getCurrentDate() : mjonPayVO.getEndDate());
if(!DateUtils.dateChkAndValueChk(mjonPayVO.getStartDate(),mjonPayVO.getEndDate(), 12 )) { if(!DateUtils.dateChkAndValueChk(mjonPayVO.getStartDate(),mjonPayVO.getEndDate(), 12 )) {
mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12)); mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12));
mjonPayVO.setEndDate(DateUtils.getCurrentDate()); 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, public void PayExcelDownload( MjonPayVO mjonPayVO,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response , 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<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);
//필요 컬럼 추가
for (int i=0;i<resultList.size();i++) {
MjonPayVO tMjonPayVO = resultList.get(i);
tMjonPayVO.setSeqNo(resultList.size()-i);
}
//excel 만들기
List<Object> 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"}) @RequestMapping(value= {"/web/member/pay/PointExcelDownload.do"})
@ -6088,6 +6189,119 @@ public class MjonPayController {
model.addAttribute("paginationInfo", paginationInfo); model.addAttribute("paginationInfo", paginationInfo);
return "/uss/ion/pay/cashPointSendList"; 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;
}
} }

View File

@ -341,6 +341,7 @@ public class MjonReservMsgServiceImpl extends EgovAbstractServiceImpl implements
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
System.out.println("++++++++++++++++++++++ 예약문자 취소 deleteReservMsgCancelDataAjax Service Imple Error !!! " + e); System.out.println("++++++++++++++++++++++ 예약문자 취소 deleteReservMsgCancelDataAjax Service Imple Error !!! " + e);
} }

View File

@ -610,37 +610,43 @@ public class MjonReservMsgController {
ModelAndView modelAndView = new ModelAndView(); ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView"); modelAndView.setViewName("jsonView");
try {
//로그인 권한정보 불러오기 //로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(!userId.equals("")) { if(!userId.equals("")) {
mjonResvMsgVO.setUserId(userId); mjonResvMsgVO.setUserId(userId);
}else { }else {
modelAndView.addObject("message", "로그인 후 이용이 가능합니다."); modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
modelAndView.addObject("result", "fail"); modelAndView.addObject("result", "fail");
return modelAndView; return modelAndView;
} }
// 디비에 문자 내용을 저장해 준다. // 디비에 문자 내용을 저장해 준다.
int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO); int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO);
if(resultSts > 0) {
modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다."); if(resultSts > 0) {
modelAndView.addObject("result", "success");
modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다.");
}else { modelAndView.addObject("result", "success");
modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요."); }else {
modelAndView.addObject("result", "fail");
modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요.");
modelAndView.addObject("result", "fail");
}
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
} }
return modelAndView; return modelAndView;

View File

@ -117,6 +117,7 @@ public class PriceAndPoint {
MjonPayVO mjonPayVO = new MjonPayVO(); MjonPayVO mjonPayVO = new MjonPayVO();
mjonPayVO.setCashId(idgenMjonCashId.getNextStringId()); mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
mjonPayVO.setUserId(userId); mjonPayVO.setUserId(userId);
System.out.println(" + totPrice :: "+ totPrice);
mjonPayVO.setCash(totPrice); mjonPayVO.setCash(totPrice);
mjonPayVO.setFrstRegisterId(userId); mjonPayVO.setFrstRegisterId(userId);
mjonPayVO.setMemo(memo); mjonPayVO.setMemo(memo);

View File

@ -1074,12 +1074,21 @@ public class EgovLoginController {
String message = (String) commandMap.get("message"); String message = (String) commandMap.get("message");
String goEventPay = (String) commandMap.get("goEventPay"); String goEventPay = (String) commandMap.get("goEventPay");
// sns 회원가입 key 설정 /*
String naverClientId = itnNaverClientId; * 헤더에서 id/pw는 맞지만 보안로그인 설정 되어있을때 -> secure
String naverClientSecret = itnNaverClientSecret; *
*/
String kakaoRestApiKey = itnKakaoRestApiKey; String headerLoginResult = (String) commandMap.get("headerLoginResult");
String kakaoReturnUrl = itnKakaoReturnUrl; 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 정보 가져오기 // config 정보 가져오기
MberManageConfigVO mberConfigVO = new MberManageConfigVO(); MberManageConfigVO mberConfigVO = new MberManageConfigVO();
@ -1129,6 +1138,16 @@ public class EgovLoginController {
model.addAttribute("userIp", userIp); model.addAttribute("userIp", userIp);
model.addAttribute("goEventPay", goEventPay); 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"; return "web/login/EgovLoginGnrlUsr";
} }
@ -1833,6 +1852,8 @@ public class EgovLoginController {
HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model, HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
HttpSession session, RedirectAttributes redirectAttributes) throws Exception { HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
ModelAndView modelAndView = new ModelAndView(); ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView"); modelAndView.setViewName("jsonView");

View File

@ -4,6 +4,9 @@ import java.io.Serializable;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import lombok.Getter;
import lombok.Setter;
/** /**
* 사용자정보 VO클래스로서일반회원, 기업회원, 업무사용자의 비지니스로직 처리시 기타조건성 항을 구성한다. * 사용자정보 VO클래스로서일반회원, 기업회원, 업무사용자의 비지니스로직 처리시 기타조건성 항을 구성한다.
* @author 공통서비스 개발팀 조재영 * @author 공통서비스 개발팀 조재영
@ -21,6 +24,8 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
* *
* </pre> * </pre>
*/ */
@Getter
@Setter
public class UserDefaultVO implements Serializable { public class UserDefaultVO implements Serializable {
/** /**
@ -34,9 +39,19 @@ public class UserDefaultVO implements Serializable {
/** 검색조건-성별 (0, M, F)*/ /** 검색조건-성별 (0, M, F)*/
private String searchSexdstn = "0"; private String searchSexdstn = "0";
/** 검색조건 */ /**
* 검색조건
* 20250122 이호영
* 개선은 검색조건을 아래 세개만 사용하려고
* */
private String searchCondition ; private String searchCondition ;
private String searchCondition01 ;
private String searchCondition02 ;
/** 검색조건 - 기존 */
// private String searchCondition ;
private String searchCondition_01 ; private String searchCondition_01 ;
private String searchConditionSite ; private String searchConditionSite ;
@ -173,45 +188,6 @@ public class UserDefaultVO implements Serializable {
private String searchDeleteType; 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; private String searchAdminSmsNoticeYn;
@ -224,570 +200,5 @@ public class UserDefaultVO implements Serializable {
private String searchThrDptCategoryCode; //3뎁스(하위카테고리) 검색 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;
}
} }

View File

@ -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<Object> 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;
}
}

View File

@ -933,7 +933,7 @@
</select> </select>
<insert id="AddrDAO.insertAddrList" parameterClass="java.util.List"> <update id="AddrDAO.insertAddrList" parameterClass="java.util.List">
/* AddrDAO.insertAddrList */ /* AddrDAO.insertAddrList */
INSERT INTO MJ_ADDR INSERT INTO MJ_ADDR
( (
@ -967,7 +967,18 @@
) )
</iterate> </iterate>
</insert> </update>
<update id="AddrDAO.deleteAddrPhoneNo" parameterClass="addrVO">
DELETE FROM MJ_ADDR
WHERE MBER_ID = #mberId#
<iterate prepend="AND ADDR_PHONE_NO IN" open="(" close=")" conjunction="," property="addrPhones">
#addrPhones[]#
</iterate>
</update>
<!-- 주소록 그룹명 중복확인 --> <!-- 주소록 그룹명 중복확인 -->
<select id="AddrDAO.selectDuplAddrCnt" parameterClass="addrVO" resultClass="int"> <select id="AddrDAO.selectDuplAddrCnt" parameterClass="addrVO" resultClass="int">

View File

@ -4,11 +4,13 @@
========= ======= ================================================= ========= ======= =================================================
2023.02.17 안주영 2023.02.17 안주영
--> -->
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="KakaoSent"> <sqlMap namespace="KakaoSent">
<typeAlias alias="kakaoSentVO" type="itn.let.kakao.user.sent.service.KakaoSentVO"/> <typeAlias alias="kakaoSentVO" type="itn.let.kakao.user.sent.service.KakaoSentVO"/>
<typeAlias alias="mjonKakaoATVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO"/> <typeAlias alias="mjonKakaoATVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO"/>
<typeAlias alias="kakaoAtStatVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO"/> <typeAlias alias="kakaoAtStatVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO"/>
<typeAlias alias="kakaoSentDetailVO" type="itn.let.kakao.user.sent.service.KakaoSentDetailVO"/>
<!-- 공통 쿼리 부분 문자 발송 관련 --> <!-- 공통 쿼리 부분 문자 발송 관련 -->
<sql id="KakaoSentDAO.selectJoinQuery"> <sql id="KakaoSentDAO.selectJoinQuery">
@ -1350,4 +1352,559 @@
) M2 ) M2
</select> </select>
<!-- 전체 발송결과 조회 (그룹별)-->
<select id="KakaoSentDAO.selectAllKakaoSentList_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
/* KakaoSentDAO.selectAllKakaoSentList_advc */
SELECT t1.totMsgCnt,
t1.userId,
t1.msgGroupId,
t1.msgGroupCnt,
t1.smsTxt,
t1.subject,
t1.subjectChkYn,
t1.regDate,
t1.reqDate,
t1.delayOrgTime,
t1.callFrom,
t1.totPrice,
t1.eachPrice,
t1.msgType,
t1.fileCnt,
t1.agentCode,
t1.canceldate,
t1.delFlag,
t1.sendKind,
t1.msgKind,
t1.delayYn,
t1.delayCompleteYn,
t1.reserveYn,
t1.reserveCYn,
t1.diffMin,
t1.atDelayYn,
t1.atDelayCompleteYn,
t1.msgNoticetalkSenderKey,
t1.bizKakaoResendYn,
t1.atDelayOrgTime
FROM (
SELECT COUNT(B.USER_ID) OVER() AS totMsgCnt,
B.USER_ID AS userId ,
B.MSG_GROUP_ID AS msgGroupId ,
B.MSG_GROUP_CNT AS msgGroupCnt ,
B.SMS_TXT AS smsTxt ,
B.SUBJECT AS subject ,
B.SUBJECT_CHK_YN AS subjectChkYn ,
B.REGDATE AS regDate ,
B.REQ_DATE AS reqDate ,
( CASE
WHEN B.DELAY_YN = 'Y'
AND B.DELAY_COMPLETE_YN = 'N'
THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
ELSE B.REQ_DATE
END ) AS delayOrgTime ,
B.CALL_FROM AS callFrom ,
B.TOT_PRICE AS totPrice ,
B.EACH_PRICE AS eachPrice ,
B.MSG_TYPE AS msgType ,
B.FILE_CNT AS fileCnt ,
B.AGENT_CODE AS agentCode ,
B.RESERVE_C_YN AS reserveCYn ,
B.CANCELDATE AS canceldate ,
B.DEL_FLAG AS delFlag ,
B.SEND_KIND AS sendKind ,
B.MSG_KIND AS msgKind ,
B.DELAY_YN AS delayYn ,
B.DELAY_COMPLETE_YN AS delayCompleteYn ,
B.RESERVE_YN AS reserveYn ,
TIMESTAMPDIFF(minute, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR), DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')) AS diffMin,
B.AT_DELAY_YN AS atDelayYn,
B.AT_DELAY_COMPLETE_YN AS atDelayCompleteYn,
A.MSG_NOTICETALK_SENDER_KEY AS msgNoticetalkSenderKey,
A.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn,
IF(B.AT_DELAY_YN = 'Y' and B.AT_DELAY_COMPLETE_YN = 'N', DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE), B.REQ_DATE) AS atDelayOrgTime
FROM MJ_MSG_DATA A
JOIN MJ_MSG_GROUP_DATA B
ON A.MSG_GROUP_ID = B.MSG_GROUP_ID
WHERE (
B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL
)
AND A.DEL_FLAG = 'N'
<!-- AND B.REQ_DATE <![CDATA[ <= ]]> DATE_ADD(NOW(), INTERVAL 60 MINUTE) -->
AND B.USER_ID = #userId#
<isNotEmpty property="startDate">
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#startDate#, '%Y-%m-%d')
</isNotEmpty>
<isNotEmpty property="endDate">
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#endDate#, '%Y-%m-%d')
</isNotEmpty>
<isNotEmpty property="tabType">
<isEqual property="tabType" compareValue="at">
AND A.MSG_TYPE = '8'
</isEqual>
<isEqual property="tabType" compareValue="ft">
AND A.MSG_TYPE = '9'
</isEqual>
<isEqual property="tabType" compareValue="all">
AND A.MSG_TYPE IN ('8','9')
</isEqual>
</isNotEmpty>
<isEmpty property="tabType">
AND A.MSG_TYPE IN ('8','9')
</isEmpty>
<isNotEmpty property="stateType">
<isEqual property="stateType" compareValue="Y">
AND B.RESERVE_YN = 'Y'
</isEqual>
<isEqual property="stateType" compareValue="N">
AND B.RESERVE_YN = 'N'
</isEqual>
</isNotEmpty>
GROUP BY B.MSG_GROUP_ID
ORDER BY 1=1
<isNotEmpty property="searchSortCnd">
<isEqual property="searchSortCnd" compareValue="curState">
, A.CUR_STATE $searchSortOrd$
, IF((RSLT_CODE != '7000'),'1','0')
</isEqual>
<isNotEqual property="searchSortCnd" compareValue="curState">
,$searchSortCnd$
</isNotEqual>
</isNotEmpty>
<isNotEmpty property="searchSortOrd">
$searchSortOrd$
</isNotEmpty>
LIMIT #recordCountPerPage#
OFFSET #firstIndex#
) t1
</select>
<!-- 발송결과 상단 전광판 조회(전체, 알림톡, 친구톡) MIX 결과 수량 -->
<select id="KakaoSentDAO.selectKakaoSentCntAll_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
/* 발송결과 상단 전광판 조회(전체, 알림톡, 친구톡) MIX 결과 수량 */
SELECT
A0.MSG_GROUP_ID AS msgGroupId
, COUNT(A0.RESULT) AS msgResultCnt
, A0.RESULT AS msgResultSts
, A0.RSLT_CODE AS rsltCode
, A0.RSLT_CODE2 AS rsltCode2
, A0.AGENT_CODE AS agentCode
, A0.EACH_PRICE AS eachPrice
, sum(if(A0.tab1=0,0,1)) as filePath1 /* 알림톡 */
, sum(if(A0.tab2=0,0,1)) as filePath2 /* 친구톡 */
FROM(
SELECT
MD.MSG_ID
, MD.MSG_GROUP_ID
, MD.MSG_SEQ
, MD.CUR_STATE
, MD.SENT_DATE
, (CASE
WHEN
MD.RSLT_CODE = '7000'
THEN 'S'
WHEN
(
MD.RSLT_CODE IS NULL
AND MD.SENT_DATE IS NULL
AND MD.RSLT_DATE IS NULL
)
THEN 'W'
ELSE 'F'
END) AS RESULT
, MD.RSLT_CODE
, MD.RSLT_CODE2
, MD.AGENT_CODE
, MG.EACH_PRICE
, if (MD.MSG_TYPE= '8','01','00') AS tab1
, if (MD.MSG_TYPE= '9','01','00') AS tab2
FROM
MJ_MSG_DATA MD
INNER JOIN
MJ_MSG_GROUP_DATA MG
ON
MD.MSG_GROUP_ID = MG.MSG_GROUP_ID
INNER JOIN
BIZ_KAKAO_PRICE BZP
ON
MG.MSG_GROUP_ID = BZP.MSG_GROUP_ID
WHERE 1=1
AND IFNULL(MG.DEL_FLAG,'N') = 'N'
AND MD.USER_ID = #userId#
<isNotEmpty property="ntceBgnde">
AND DATE_FORMAT(MG.REQ_DATE, '%Y/%m/%d') BETWEEN #ntceBgnde# AND #ntceEndde#
</isNotEmpty>
AND MD.MSG_TYPE IN ('8','9')
AND MG.RESERVE_C_YN = 'N'
) A0
GROUP BY
A0.MSG_GROUP_ID
, A0.RESULT
, A0.RSLT_CODE
, A0.RSLT_CODE2
, A0.AGENT_CODE
ORDER BY
A0.MSG_GROUP_ID DESC
</select>
<select id="KakaoSentDAO.selectKakaoSentCntEachCnt_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
SELECT a.MSG_GROUP_ID AS msgGroupId,
a.successCount,
a.waitCount,
a.failCount,
a.kakaoResendSuccCount,
a.kakaoResendFailCount,
a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice,
(a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice,
a.divideYn
FROM (SELECT t1.MSG_GROUP_ID,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = t1.MSG_GROUP_ID
AND C.RSLT_CODE = '7000'
)
AS successCount ,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = t1.MSG_GROUP_ID
AND
(
C.RSLT_CODE IS NULL
AND C.SENT_DATE IS NULL
AND C.RSLT_DATE IS NULL
)
)
AS waitCount ,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = t1.MSG_GROUP_ID
AND
(
C.RSLT_CODE != '7000'
AND C.RSLT_CODE IS NOT NULL
)
)
AS failCount ,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE t1.BIZ_KAKAO_RESEND_YN = 'Y'
AND t1.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
)
kakaoResendSuccCount,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE t1.BIZ_KAKAO_RESEND_YN = 'Y'
AND t1.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'F'
)
kakaoResendFailCount,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE t1.BIZ_KAKAO_RESEND_YN = 'Y'
AND t1.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
AND MMD1.BIZ_KAKAO_RESEND_TYPE = 'SMS'
)
smsCnt,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE t1.BIZ_KAKAO_RESEND_YN = 'Y'
AND t1.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
AND MMD1.BIZ_KAKAO_RESEND_TYPE = 'MMS'
)
mmsCnt,
CASE
WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y'
ELSE 'N'
END AS divideYN
FROM mj_msg_data t1
WHERE t1.DEL_FLAG = 'N'
AND t1.MSG_TYPE IN ('8',
'9')
AND t1.CUR_STATE IN ('0',
'1',
'2',
'3')
AND t1.MSG_GROUP_ID = #msgGroupId#
GROUP BY t1.MSG_GROUP_ID
)
a
LEFT OUTER JOIN BIZ_KAKAO_PRICE bkp
ON bkp.MSG_GROUP_ID = a.MSG_GROUP_ID
</select>
<!-- 알림톡 발송결과 상세 데이터-->
<select id="KakaoSentDAO.selectKakaoSentDetailView" parameterClass="kakaoSentDetailVO" resultClass="kakaoSentDetailVO">
/* KakaoSentDAO.selectKakaoSentDetailView */
select
a.msgGroupId
, a.msgGroupCnt
, a.reserveYn
, a.reserveCYn
, a.canceldate
, a.callFrom
, a.userId
, a.smsTxt
, a.subject
, a.reqDate
, a.regDate
, a.msgType
, a.msgKind
, a.eachPrice
, a.sentDate
, a.diffMin
, a.subjectChkYn
, a.msgGroupId
, a.successCount
, a.waitCount
, a.failCount
, a.kakaoResendSuccCount
, a.kakaoResendFailCount
, a.successCount * bkp.BIZ_KAKAO_AT_PRICE AS successPrice
, (a.smsCnt * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE) AS kakaoResendSuccPrice
, a.divideYn
, a.bizKakaoResendYn
, MKPI.YELLOW_ID AS yellowId
, a.MSG_NOTICETALK_TMP_KEY as msgNoticetalkTmpKey
FROM (SELECT MD.MSG_GROUP_ID,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = MD.MSG_GROUP_ID
AND C.RSLT_CODE = '7000'
)
AS successCount ,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = MD.MSG_GROUP_ID
AND
(
C.RSLT_CODE IS NULL
AND C.SENT_DATE IS NULL
AND C.RSLT_DATE IS NULL
)
)
AS waitCount ,
( SELECT COUNT(0)
FROM MJ_MSG_DATA C
WHERE C.RESERVE_C_YN = 'N'
AND C.MSG_GROUP_ID = MD.MSG_GROUP_ID
AND
(
C.RSLT_CODE != '7000'
AND C.RSLT_CODE IS NOT NULL
)
)
AS failCount ,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE MD.BIZ_KAKAO_RESEND_YN = 'Y'
AND MD.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
)
kakaoResendSuccCount,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE MD.BIZ_KAKAO_RESEND_YN = 'Y'
AND MD.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'F'
)
kakaoResendFailCount,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE MD.BIZ_KAKAO_RESEND_YN = 'Y'
AND MD.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
AND MMD1.BIZ_KAKAO_RESEND_TYPE = 'SMS'
)
smsCnt,
( SELECT COUNT(0)
FROM BIZ_LOG BL1,
MJ_MSG_DATA MMD1
WHERE MD.BIZ_KAKAO_RESEND_YN = 'Y'
AND MD.MSG_GROUP_ID = MMD1.MSG_GROUP_ID
AND MMD1.BIZ_UMID = BL1.CMID
AND (
CASE
WHEN BL1.CALL_STATUS IN ('6600',
'4100')
THEN 'S'
ELSE 'F'
END ) = 'S'
AND MMD1.BIZ_KAKAO_RESEND_TYPE = 'MMS'
)
mmsCnt,
CASE
WHEN COUNT(DISTINCT MD.REQ_DATE) > 1 THEN 'Y'
ELSE 'N'
END AS divideYN,
MGD.MSG_GROUP_ID as msgGroupId
, MGD.MSG_GROUP_CNT as msgGroupCnt
, MGD.RESERVE_YN as reserveYn
, MGD.RESERVE_C_YN as reserveCYn
, DATE_FORMAT(MGD.CANCELDATE, '%Y-%m-%d %T') as canceldate
, MGD.CALL_FROM as callFrom
, MGD.USER_ID as userId
, MGD.SMS_TXT as smsTxt
, MGD.SUBJECT as subject
, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T') as reqDate
, DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %T') as regDate
, MGD.MSG_TYPE as msgType
, MGD.MSG_KIND as msgKind
, MGD.EACH_PRICE as eachPrice
, DATE_FORMAT(MD.SENT_DATE, '%Y-%m-%d %T') as sentDate
, MD.FILE_CNT as fileCnt
, MD.FILE_PATH1 as filePath1
, MD.FILE_PATH2 as filePath2
, MD.FILE_PATH3 as filePath3
, TIMESTAMPDIFF(minute, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
, SUBJECT_CHK_YN as subjectChkYn
, MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn
, MD.MSG_NOTICETALK_SENDER_KEY
, MD.MSG_NOTICETALK_TMP_KEY
FROM MJ_MSG_DATA MD
inner join MJ_MSG_GROUP_DATA MGD on
MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
and MGD.USER_ID = MD.USER_ID
AND MGD.MSG_GROUP_ID = #msgGroupId#
GROUP BY MGD.MSG_GROUP_ID
)
a
LEFT OUTER JOIN BIZ_KAKAO_PRICE bkp
ON bkp.MSG_GROUP_ID = a.MSG_GROUP_ID
LEFT OUTER JOIN
(SELECT a.SENDER_KEY,
a.YELLOW_ID
FROM mj_kakao_profile_info a
GROUP BY a.SENDER_KEY
)
MKPI
ON MKPI.SENDER_KEY = a.MSG_NOTICETALK_SENDER_KEY
</select>
<!-- REQ_DATE 조회-->
<select id="KakaoSentDAO.findByReqDateWhereMsgGroupId" parameterClass="String" resultClass="String">
/* MjonMsgSentDAO.findByReqDateWhereMsgGroupId*/
SELECT REQ_DATE FROM MJ_MSG_DATA WHERE MSG_GROUP_ID =#msgGroupId#
</select>
<!-- 발신 내용 상세보기 조회 (상세보기 버튼 클릭시)-->
<select id="KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax" parameterClass="mjonKakaoATVO" resultClass="mjonKakaoATVO">
SELECT
MGD.MSG_GROUP_ID as msgGroupId
, MGD.USER_ID as userId
, MD.MSG_TYPE as msgType
, MD.REQ_DATE as reqDate /* 발송 시간 */
, MD.MSG_NOTICETALK_SENDER_KEY as msgNoticetalkSenderKey /* api key */
, MD.MSG_NOTICETALK_TMP_KEY as msgNoticetalkTmpKey /* 특정 템플릿 key */
, MGD.SMS_TXT as smsTxt /* 알림톡 본문 내용 치환(X) */
, MD.SMS_TXT as smsTxtTrans /* 알림톡 본문 내용 치환(O)*/
, MD.BIZ_KAKAO_TITLE as bizKakaoTitle /* 강조형 타이틀 */
, MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn /* 대체 문자 사용 여부*/
, MD.BIZ_KAKAO_RESEND_TYPE as bizKakaoResendType /* MMS / LMS / SMS */
, MD.BIZ_KAKAO_RESEND_DATA as bizKakaoResendData /* 대체 문자 (치환O) */
, MGD.BIZ_KAKAO_RESEND_ORGNL_TXT as bizKakaoResendOrgnlTxt /* 대체 문자( 치환X ) */
, MD.BIZ_KAKAO_JSON_FILE as bizKakaoJsonFile /* Json 파일 경로 */
, MKPI.YELLOW_ID as yellowId
, COUNT_TYPE.cnt AS bizKakaoResendTypeCnt
, ifnull(MGD.BIZ_KAKAO_RESEND_TYPE, MD.BIZ_KAKAO_RESEND_TYPE) AS bizKakaoResendType
, MD.BIZ_KAKAO_RESEND_YN AS bizKakaoResendYn
FROM MJ_MSG_GROUP_DATA MGD
INNER JOIN MJ_MSG_DATA MD
ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
AND MGD.USER_ID = MD.USER_ID
LEFT OUTER JOIN (SELECT a.SENDER_KEY,
a.YELLOW_ID
FROM mj_kakao_profile_info a
GROUP BY a.SENDER_KEY
)
MKPI
ON MKPI.SENDER_KEY = MD.MSG_NOTICETALK_SENDER_KEY
LEFT OUTER JOIN
( SELECT MSG_GROUP_ID,
COUNT(*) AS cnt
FROM ( SELECT MSG_GROUP_ID,
BIZ_KAKAO_RESEND_TYPE
FROM MJ_MSG_DATA
WHERE MSG_GROUP_ID = 'MSGGID_0000000332753'
GROUP BY MSG_GROUP_ID,
BIZ_KAKAO_RESEND_TYPE
)
t
GROUP BY MSG_GROUP_ID
)
COUNT_TYPE
ON COUNT_TYPE.MSG_GROUP_ID = MGD.MSG_GROUP_ID
WHERE
MGD.USER_ID = #userId#
AND
MGD.MSG_GROUP_ID = #msgGroupId#
GROUP BY MGD.MSG_GROUP_ID
</select>
</sqlMap> </sqlMap>

View File

@ -4,9 +4,10 @@
========= ======= ================================================= ========= ======= =================================================
2023.02.02 우영두 2023.02.02 우영두
--> -->
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="kakaoAlimTalk"> <sqlMap namespace="kakaoAlimTalk">
<typeAlias alias="kakaoVO" type="itn.let.kakao.kakaoComm.KakaoVO"/> <typeAlias alias="kakaoVO" type="itn.let.kakao.kakaoComm.KakaoVO"/>
<typeAlias alias="kakaoSendAdvcVO" type="itn.let.kakao.kakaoComm.KakaoSendAdvcVO"/>
<insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo" parameterClass="java.util.List"> <insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo" parameterClass="java.util.List">
INSERT INTO MJ_MSG_DATA INSERT INTO MJ_MSG_DATA
@ -54,6 +55,119 @@
</iterate> </iterate>
</insert> </insert>
<insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc" parameterClass="java.util.List">
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
<iterate conjunction=",">
(
#[].msgId#
, #[].msgGroupId#
, #[].userId#
, #[].agentCode#
, 0
, #[].senderKey#
, #[].templateCode#
, #[].callTo#
, #[].callFrom#
, #[].msgType#
, #[].templateContent#
, #[].templateTitle#
, #[].subMsgSendYn#
, #[].subMsgTxt#
, #[].subMsgType#
, #[].bizJsonName#
, #[].reqDate#
)
</iterate>
</insert>
<insert id="kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc" parameterClass="java.util.List">
INSERT INTO BIZ_ATTACHMENTS
(
MSG_KEY
, TYPE
, CONTENTS
)VALUES
<iterate conjunction=",">
(
#[].msgId#
, 'JSON'
, #[].jsonStr#
)
</iterate>
</insert>
<insert id="kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc" parameterClass="kakaoSendAdvcVO">
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>
<insert id="kakaoAlimTalkDAO.insertKakaoSendPrice" parameterClass="kakaoVO"> <insert id="kakaoAlimTalkDAO.insertKakaoSendPrice" parameterClass="kakaoVO">
INSERT INTO BIZ_KAKAO_PRICE INSERT INTO BIZ_KAKAO_PRICE
( (

View File

@ -2319,7 +2319,8 @@
EVENT_YN, EVENT_YN,
DELAY_YN, DELAY_YN,
AT_DELAY_YN, AT_DELAY_YN,
BIZ_KAKAO_RESEND_ORGNL_TXT BIZ_KAKAO_RESEND_ORGNL_TXT,
SUBJECT_CHK_YN
) )
VALUES VALUES
@ -2345,7 +2346,8 @@
#eventYn#, #eventYn#,
#delayYn#, #delayYn#,
#atDelayYn#, #atDelayYn#,
#kakaoSubMagOrgnlTxt# #kakaoSubMagOrgnlTxt#,
#subjectChkYn#
) )
</insert> </insert>
@ -3307,10 +3309,16 @@
, ( , (
<include refid="MjonMsgSentDAO.selectAgentWithKakaoResultQuery_A"/> <include refid="MjonMsgSentDAO.selectAgentWithKakaoResultQuery_A"/>
) AS RESULT ) AS RESULT
<include refid="MjonMsgSentDAO.selectJoinQuery"/> 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 A.USER_ID = #userId#
AND B.USER_ID = #userId# AND B.USER_ID = #userId#
AND B.RESERVE_C_YN = 'N' /*AND B.RESERVE_C_YN = 'N'*/
ORDER BY 1=1 ORDER BY 1=1
, msgGroupId DESC , msgGroupId DESC
, sentDate DESC , sentDate DESC
@ -4021,6 +4029,8 @@
<select id="MjonMsgDataDAO.selectReSendMsgDataList" parameterClass="mjonMsgDataVO" resultClass="mjonMsgVO"> <select id="MjonMsgDataDAO.selectReSendMsgDataList" parameterClass="mjonMsgDataVO" resultClass="mjonMsgVO">
/* MjonMsgDataDAO.selectReSendMsgDataList */
SELECT MSG_ID AS msgId, SELECT MSG_ID AS msgId,
USER_ID AS userId, USER_ID AS userId,
USERDATA AS msgSeq, USERDATA AS msgSeq,
@ -7895,6 +7905,7 @@
SELECT SELECT
CALL_FROM AS callFrom CALL_FROM AS callFrom
, SUBJECT AS subject , SUBJECT AS subject
, SUBJECT_CHK_YN AS subjectChkYn
, SMS_TXT AS smsTxt , SMS_TXT AS smsTxt
,( ,(
SELECT SELECT
@ -7936,6 +7947,7 @@
</select> </select>
<select id="MjonMsgDataDAO.selectMjMsgListByResend" parameterClass="mjonMsgDataVO" resultClass="mjonMsgDataVO"> <select id="MjonMsgDataDAO.selectMjMsgListByResend" parameterClass="mjonMsgDataVO" resultClass="mjonMsgDataVO">
/* MjonMsgDataDAO.selectMjMsgListByResend */
SELECT SELECT
CALL_TO AS callTo CALL_TO AS callTo
FROM MJ_MSG_DATA FROM MJ_MSG_DATA

View File

@ -3,8 +3,10 @@
========= ======= ================================================= ========= ======= =================================================
2021.06.21 우영두 2021.06.21 우영두
--> -->
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Msg"> <sqlMap namespace="Msg">
<typeAlias alias="mjonMsgSWFDTO" type="itn.let.mjo.msgsent.service.MjonMsgSWFDTO"/>
<typeAlias alias="mjonMsgDetailSentVO" type="itn.let.mjo.msgsent.service.MjonMsgDetailSentVO"/>
<typeAlias alias="mjonMsgSentVO" type="itn.let.mjo.msgsent.service.MjonMsgSentVO"/> <typeAlias alias="mjonMsgSentVO" type="itn.let.mjo.msgsent.service.MjonMsgSentVO"/>
<typeAlias alias="mjonMsgVO" type="itn.let.mjo.msg.service.MjonMsgVO"/> <typeAlias alias="mjonMsgVO" type="itn.let.mjo.msg.service.MjonMsgVO"/>
<typeAlias alias="addrGroupVO" type="itn.let.mjo.addr.service.AddrGroupVO"/> <typeAlias alias="addrGroupVO" type="itn.let.mjo.addr.service.AddrGroupVO"/>
@ -46,8 +48,8 @@
,'01','00') AS tab2 ,'01','00') AS tab2
, if (A.MSG_TYPE= '6' AND B.MSG_TYPE= '6' AND B.FILE_CNT > '0' , if (A.MSG_TYPE= '6' AND B.MSG_TYPE= '6' AND B.FILE_CNT > '0'
,'01','00') AS tab3 ,'01','00') AS tab3
<include refid="MjonMsgSentDAO.selectJoinQuery"/> <include refid="MjonMsgSentDAO.selectJoinQuery"/>
AND A.USER_ID = #userId# AND A.USER_ID = #userId#
AND B.USER_ID = #userId# AND B.USER_ID = #userId#
<isNotEmpty property="ntceBgnde"> <isNotEmpty property="ntceBgnde">
@ -60,10 +62,6 @@
<isEmpty property="msgType"> <isEmpty property="msgType">
AND A.MSG_TYPE IN ('4','6') AND A.MSG_TYPE IN ('4','6')
</isEmpty> </isEmpty>
AND B.RESERVE_C_YN = 'N'
<![CDATA[
AND B.REQ_DATE <= DATE_ADD(NOW(), INTERVAL 60 MINUTE)
]]>
<isNotEmpty property="fileCnt"> <isNotEmpty property="fileCnt">
<isEqual property="fileCnt" compareValue="0"> <isEqual property="fileCnt" compareValue="0">
AND B.FILE_CNT = '0' AND B.FILE_CNT = '0'
@ -72,6 +70,16 @@
<![CDATA[ AND B.FILE_CNT > '0' ]]> <![CDATA[ AND B.FILE_CNT > '0' ]]>
</isNotEqual> </isNotEqual>
</isNotEmpty> </isNotEmpty>
<isNotEmpty property="searchStartDate">
<![CDATA[
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
<isNotEmpty property="searchEndDate">
<![CDATA[
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <= DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
) A0 ) A0
GROUP BY GROUP BY
A0.MSG_GROUP_ID A0.MSG_GROUP_ID
@ -222,6 +230,293 @@
</select> </select>
<!-- 전체 발송결과 조회 (전송사별) 카운트-->
<select id="MjonMsgSentDAO.countAllMsgSentList" parameterClass="mjonMsgSentVO" resultClass="int">
select
COUNT(DISTINCT B.MSG_GROUP_ID) as totalGroupCount
from
MJ_MSG_DATA A
join MJ_MSG_GROUP_DATA B on
A.MSG_GROUP_ID = B.MSG_GROUP_ID
WHERE (B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL)
AND A.DEL_FLAG = 'N'
AND B.USER_ID = #userId#
<isNotEmpty property="searchKeyword">
<isEqual property="searchCondition" compareValue="1" >
AND B.SUBJECT LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="2" >
AND B.CALL_FROM LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="3" >
AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
<isNotEmpty property="searchCondition01">
AND B.RESERVE_YN = #searchCondition01#
</isNotEmpty>
<isNotEmpty property="searchCondition02">
<isEqual property="searchCondition02" compareValue="S">
AND B.MSG_TYPE = '4'
</isEqual>
<isEqual property="searchCondition02" compareValue="L">
AND B.MSG_TYPE = '6'
AND B.FILE_CNT = '0'
</isEqual>
<isEqual property="searchCondition02" compareValue="M">
<![CDATA[
AND B.MSG_TYPE = '6'
AND B.FILE_CNT > '0'
]]>
</isEqual>
</isNotEmpty>
<isNotEmpty property="searchStartDate">
<![CDATA[
AND DATE_FORMAT(REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
<isNotEmpty property="searchEndDate">
<![CDATA[
AND DATE_FORMAT(REGDATE, '%Y-%m-%d') <= DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
</select>
<!-- 전체 발송결과 조회 (전송사별) 카운트-->
<select id="MjonMsgSentDAO.findBySWF" parameterClass="String" resultClass="mjonMsgSWFDTO">
/* MjonMsgSentDAO.findBySWF */
select
SUM(IF(aa.result = 'S', 1, 0)) AS resultSValue,
SUM(IF(aa.result = 'W', 1, 0)) AS resultWValue,
SUM(IF(aa.result = 'F', 1, 0)) AS resultFValue,
CASE
WHEN COUNT(DISTINCT REQ_DATE) > 1 THEN 'Y'
ELSE 'N'
END AS divideYN
from
(
select
case
when A.AGENT_CODE = '01'
and ( A.RSLT_CODE = '100'
and (A.RSLT_CODE2 = '0')) then 'S'
when A.AGENT_CODE = '02'
and (A.RSLT_CODE = '0') then 'S'
when A.AGENT_CODE = '03'
and (A.RSLT_CODE = '100'
or A.RSLT_CODE = '101'
or A.RSLT_CODE = '110'
or A.RSLT_CODE = '800') then 'S'
when
A.AGENT_CODE = '04'
and (A.RSLT_CODE = '4100'
or A.RSLT_CODE = '6600'
or A.RSLT_CODE = '7000') then 'S'
when
A.AGENT_CODE = '05'
and (A.RSLT_CODE = '1000'
or A.RSLT_CODE = '1001') then 'S'
when
A.AGENT_CODE = '07'
and (A.RSLT_CODE = '6'
or A.RSLT_CODE = '1000') then 'S'
when
A.AGENT_CODE = '08'
and (A.RSLT_CODE = '1000'
or A.RSLT_CODE = '1001') then 'S'
when
A.AGENT_CODE = '09'
and (A.RSLT_CODE = '1000'
or A.RSLT_CODE = '1001') then 'S'
when (
A.RSLT_CODE is null
and A.RSLT_CODE2 is null
and A.SENT_DATE is null
and A.RSLT_DATE is null ) then 'W'
else 'F'
end as result /* common query */
, A.REQ_DATE
from
MJ_MSG_DATA A
where
A.MSG_GROUP_ID = #msgGroupId#
) aa
</select>
<!-- 발송결과 상세 데이터-->
<select id="MjonMsgSentDAO.selectAllMsgSentDetailView" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentVO">
/* MjonMsgSentDAO.selectAllMsgSentDetailView */
select
MGD.MSG_GROUP_ID as msgGroupId
, MGD.MSG_GROUP_CNT as msgGroupCnt
, MGD.RESERVE_YN as reserveYn
, MGD.RESERVE_C_YN as reserveCYn
, DATE_FORMAT(MGD.CANCELDATE, '%Y-%m-%d %H:%i') as canceldate
, MGD.CALL_FROM as callFrom
, MGD.USER_ID as userId
, MGD.SMS_TXT as smsTxt
, MGD.SUBJECT as subject
, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %H:%i') as reqDate
, DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %H:%i') as regDate
, MGD.MSG_TYPE as msgType
, MGD.MSG_KIND as msgKind
, MGD.EACH_PRICE as eachPrice
, DATE_FORMAT(MD.SENT_DATE, '%Y-%m-%d %H:%i') as sentDate
, MD.FILE_CNT as fileCnt
, MD.FILE_PATH1 as filePath1
, MD.FILE_PATH2 as filePath2
, MD.FILE_PATH3 as filePath3
, TIMESTAMPDIFF(minute, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
, SUBJECT_CHK_YN as subjectChkYn
from
MJ_MSG_GROUP_DATA MGD
inner join MJ_MSG_DATA MD on
MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
and MGD.USER_ID = MD.USER_ID
where
MGD.MSG_GROUP_ID = #msgGroupId#
limit 1
</select>
<!-- 전체 발송결과 조회 (전송사별)-->
<select id="MjonMsgSentDAO.findByMsgDetailListAjax" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentVO">
/* MjonMsgSentDAO.findByMsgDetailListAjax*/
SELECT
A.USER_ID as userId,
A.CALL_TO as callTo,
case
WHEN A.AGENT_CODE = '01' AND (A.RSLT_CODE = '100' and (A.RSLT_CODE2 = '0')) then '성공'
WHEN A.AGENT_CODE = '02' AND (A.RSLT_CODE = '0') then '성공'
WHEN A.AGENT_CODE = '03' AND (A.RSLT_CODE in ('100', '101', '110', '800')) then '성공'
WHEN A.AGENT_CODE = '04' AND (A.RSLT_CODE in ('4100', '6600', '7000')) then '성공'
WHEN A.AGENT_CODE = '05' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
WHEN A.AGENT_CODE = '07' AND (A.RSLT_CODE in ('6', '1000')) then '성공'
WHEN A.AGENT_CODE = '08' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
WHEN A.AGENT_CODE = '09' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
WHEN (A.RSLT_CODE is null AND A.RSLT_CODE2 IS NULL AND A.SENT_DATE IS NULL AND A.RSLT_DATE IS NULL) then '대기'
ELSE '실패'
END as statusTxt
from
MJ_MSG_DATA A
where
A.MSG_GROUP_ID = #msgGroupId#
</select>
<!-- REQ_DATE 조회-->
<select id="MjonMsgSentDAO.findByReqDateWhereMsgGroupId" parameterClass="String" resultClass="String">
/* MjonMsgSentDAO.findByReqDateWhereMsgGroupId*/
SELECT REQ_DATE FROM MJ_MSG_DATA WHERE MSG_GROUP_ID =#msgGroupId#
</select>
<!-- 전체 발송결과 조회 (전송사별)-->
<select id="MjonMsgSentDAO.selectAllMsgSentList_advc" parameterClass="mjonMsgSentVO" resultClass="mjonMsgSentVO">
/* MjonMsgSentDAO.selectAllMsgSentList_advc */
SELECT
B.USER_ID as userId
, B.MSG_GROUP_ID as msgGroupId
, B.MSG_GROUP_CNT as msgGroupCnt
, B.SMS_TXT as smsTxt
, B.SUBJECT as subject
, B.SUBJECT_CHK_YN as subjectChkYn
, CAST(DATE_FORMAT(B.REGDATE, '%Y-%m-%d %H:%i') AS CHAR) AS regDate
, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR) AS reqDate
, (
CASE
WHEN B.DELAY_YN = 'Y' AND B.DELAY_COMPLETE_YN = 'N' THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
ELSE B.REQ_DATE
END
) AS delayOrgTime
, B.CALL_FROM as callFrom
, B.TOT_PRICE as totPrice
, B.EACH_PRICE as eachPrice
, B.MSG_TYPE as msgType
, B.FILE_CNT as fileCnt
, B.AGENT_CODE as agentCode
, B.RESERVE_C_YN as reserveCYn
, B.CANCELDATE as canceldate
, B.DEL_FLAG as delFlag
, B.SEND_KIND as sendKind
, B.MSG_KIND as msgKind
, B.DELAY_YN as delayYn
, B.DELAY_COMPLETE_YN as delayCompleteYn
, B.RESERVE_YN as reserveYn
, B.RESERVE_C_YN as reserveCYn
, TIMESTAMPDIFF(minute, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR), DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')) as diffMin
FROM MJ_MSG_DATA A
JOIN MJ_MSG_GROUP_DATA B ON A.MSG_GROUP_ID = B.MSG_GROUP_ID
WHERE (B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL)
AND A.DEL_FLAG = 'N'
AND B.USER_ID = #userId#
<isNotEmpty property="searchKeyword">
<isEqual property="searchCondition" compareValue="2" >
AND B.CALL_FROM LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
<isEqual property="searchCondition" compareValue="3" >
AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
</isEqual>
</isNotEmpty>
<isNotEmpty property="searchCondition01">
AND B.RESERVE_YN = #searchCondition01#
</isNotEmpty>
<isNotEmpty property="searchCondition02">
<isEqual property="searchCondition02" compareValue="S">
AND B.MSG_TYPE = '4'
</isEqual>
<isEqual property="searchCondition02" compareValue="L">
AND B.MSG_TYPE = '6'
AND B.FILE_CNT = '0'
</isEqual>
<isEqual property="searchCondition02" compareValue="M">
<![CDATA[
AND B.MSG_TYPE = '6'
AND B.FILE_CNT > '0'
]]>
</isEqual>
</isNotEmpty>
<isEmpty property="searchCondition02">
AND B.MSG_TYPE in ('4', '6')
</isEmpty>
<isNotEmpty property="searchStartDate">
<![CDATA[
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
<isNotEmpty property="searchEndDate">
<![CDATA[
AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <= DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
]]>
</isNotEmpty>
GROUP BY B.MSG_GROUP_ID
ORDER BY 1=1
<isNotEmpty property="searchSortCnd">
<isEqual property="searchSortCnd" compareValue="curState">
, curState $searchSortOrd$
, orderByrsltCode
</isEqual>
<isNotEqual property="searchSortCnd" compareValue="curState">
,$searchSortCnd$
</isNotEqual>
</isNotEmpty>
<isNotEmpty property="searchSortOrd">
$searchSortOrd$
</isNotEmpty>
LIMIT #recordCountPerPage# OFFSET #firstIndex#
</select>
<!-- 전체 발송결과 조회 (전송사별)--> <!-- 전체 발송결과 조회 (전송사별)-->
<select id="MjonMsgSentDAO.selectAllMsgSentList" parameterClass="mjonMsgSentVO" resultClass="mjonMsgSentVO"> <select id="MjonMsgSentDAO.selectAllMsgSentList" parameterClass="mjonMsgSentVO" resultClass="mjonMsgSentVO">
SELECT SELECT

View File

@ -12,6 +12,7 @@
<typeAlias alias="PopupManageVO" type="itn.com.uss.ion.pwm.service.PopupManageVO" /> <typeAlias alias="PopupManageVO" type="itn.com.uss.ion.pwm.service.PopupManageVO" />
<typeAlias alias="popupzoneVO" type="itn.com.uss.ion.pwm.service.PopupzoneVO"/> <typeAlias alias="popupzoneVO" type="itn.com.uss.ion.pwm.service.PopupzoneVO"/>
<typeAlias alias="mainPopupVO" type="itn.com.uss.ion.bnr.pop.service.MainPopupVO"/> <typeAlias alias="mainPopupVO" type="itn.com.uss.ion.bnr.pop.service.MainPopupVO"/>
<typeAlias alias="mainPopupLinkVO" type="itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO"/>
@ -19,7 +20,7 @@
<result property="popId" column="POP_ID"></result> <result property="popId" column="POP_ID"></result>
<result property="mlink" column="MLINK"></result> <result property="mlink" column="MLINK"></result>
<result property="coords" column="COORDS"></result> <result property="coords" column="COORDS"></result>
<result property="sort" column="SORT"></result> <result property="popLinkId" column="POP_LINK_ID"></result>
</resultMap> </resultMap>
@ -146,17 +147,17 @@
WHERE MP.POP_ID = #popId# WHERE MP.POP_ID = #popId#
</select> </select>
<select id="mainPopup.selectMainPopupVOLink" parameterClass="String" resultMap="MainPopupLinkResultMap"> <select id="mainPopup.selectMainPopupVOLink" parameterClass="String" resultMap="MainPopupLinkResultMap">
/* mainPopup.selectMainPopupVO */ /* mainPopup.selectMainPopupVOLink */
SELECT SELECT
POP_LINK_ID,
POP_ID, POP_ID,
MLINK, MLINK,
COORDS, COORDS
SORT
FROM MAIN_POPUP_LINK FROM MAIN_POPUP_LINK
WHERE POP_ID = #popId# WHERE POP_ID = #popId#
order by SORT asc
</select> </select>
@ -196,6 +197,16 @@
DELETE FROM MAIN_POPUP WHERE POP_ID=#popId# DELETE FROM MAIN_POPUP WHERE POP_ID=#popId#
</delete> </delete>
<delete id="mainPopup.deleteMainPopupLinkInfo" parameterClass="mainPopupLinkVO">
/* mainPopup.deleteMainPopupLinkInfo */
DELETE FROM MAIN_POPUP_LINK
WHERE
POP_ID=#popId#
AND
POP_LINK_ID = #popLinkId#
</delete>
<update id="mainPopup.resetMainPopupSort" parameterClass="mainPopupVO"> <update id="mainPopup.resetMainPopupSort" parameterClass="mainPopupVO">
/*mainPopup.resetMainPopupSort*/ /*mainPopup.resetMainPopupSort*/

View File

@ -1083,7 +1083,6 @@
POP_ID POP_ID
, MLINK , MLINK
, COORDS , COORDS
, SORT
) )
VALUES VALUES
<iterate conjunction=","> <iterate conjunction=",">
@ -1091,7 +1090,6 @@
#[].popId# #[].popId#
, #[].mlink# , #[].mlink#
, #[].coords# , #[].coords#
, #[].sort#
) )
</iterate> </iterate>
@ -1123,7 +1121,6 @@
SET SET
MLINK = #mlink# MLINK = #mlink#
, COORDS = #coords# , COORDS = #coords#
, SORT = #sort#
WHERE POP_ID = #popId# WHERE POP_ID = #popId#
</update> </update>

View File

@ -1315,6 +1315,7 @@
ADMIN_SMS_NOTICE_YN AS adminSmsNoticeYn ADMIN_SMS_NOTICE_YN AS adminSmsNoticeYn
,PRE_PAYMENT_YN AS prePaymentYn ,PRE_PAYMENT_YN AS prePaymentYn
,SMISHING_YN AS smishingYn ,SMISHING_YN AS smishingYn
,AT_SMISHING_YN AS atSmishingYn
,AUTO_CASH AS autoCash ,AUTO_CASH AS autoCash
,IFNULL(BLINE_CODE, 'N') AS blineCode ,IFNULL(BLINE_CODE, 'N') AS blineCode
,IFNULL(RECOMMEND_ID, '') AS recommendId ,IFNULL(RECOMMEND_ID, '') AS recommendId

View File

@ -553,6 +553,9 @@ function fn_save_menuInfo(menuNo) {
<div id="kopost_organization" class="orgCont"></div> <div id="kopost_organization" class="orgCont"></div>
</div> </div>
<div class="tbWrap"> <div class="tbWrap">
<div class="btnWrap">
<input type="button" class="btnType1 bg_456ded main1_save_btn" value="저 장" onClick="fn_save_menuInfo(); return false;">
</div>
<span class="tbTit" id="menuTopNm" >코드를 선택하세요</span> <span class="tbTit" id="menuTopNm" >코드를 선택하세요</span>
<table class="tbType2"> <table class="tbType2">
<colgroup> <colgroup>

View File

@ -22,6 +22,7 @@
<%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %> <%@ 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="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ 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("newLineChar", "\r\n"); %>
<% pageContext.setAttribute("newLineChar2", "\n"); %> <% pageContext.setAttribute("newLineChar2", "\n"); %>
<% String serverName = request.getServerName(); %> <% String serverName = request.getServerName(); %>
@ -4157,8 +4158,10 @@ function fnInputSmsTxt(){
</td> </td>
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty mjonMsgSentList.regdate}"> <c:when test="${not empty mjonMsgSentList.regDate}">
<fmt:formatDate value="${mjonMsgSentList.regdate}" pattern="MM-dd HH:mm"/> <%-- <fmt:formatDate value="${mjonMsgSentList.regDate}" pattern="MM-dd HH:mm"/> --%>
${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
<%-- <c:out value="${mjonMsgSentList.regDate}" /> --%>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4190,7 +4193,8 @@ function fnInputSmsTxt(){
</c:when> </c:when>
<c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}"> <c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}">
[예약]<br /> [예약]<br />
<fmt:formatDate value="${mjonMsgSentList.reqdate}" pattern="MM-dd HH:mm"/> <%-- <fmt:formatDate value="${mjonMsgSentList.reqDate}" pattern="MM-dd HH:mm"/> --%>
${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4367,8 +4371,11 @@ function fnInputSmsTxt(){
</td> </td>
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty mjonMsgSentList.regdate}"> <c:when test="${not empty mjonMsgSentList.regDate}">
<fmt:formatDate value="${mjonMsgSentList.regdate}" pattern="MM-dd HH:mm"/> <%-- <fmt:formatDate value="${mjonMsgSentList.regDate}" pattern="MM-dd HH:mm"/> --%>
<%-- <c:out value="${mjonMsgSentList.regDate}" /> --%>
${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4400,7 +4407,8 @@ function fnInputSmsTxt(){
</c:when> </c:when>
<c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}"> <c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}">
[예약]<br /> [예약]<br />
<fmt:formatDate value="${mjonMsgSentList.reqdate}" pattern="yyyy-MM-dd HH:mm"/> ${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'yyyy-MM-dd HH:mm') }
<%-- <fmt:formatDate value="${mjonMsgSentList.reqDate}" pattern="yyyy-MM-dd HH:mm"/> --%>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4586,8 +4594,8 @@ function fnInputSmsTxt(){
</td> </td>
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty mjonMsgDelaySentList.regdate}"> <c:when test="${not empty mjonMsgDelaySentList.regDate}">
<fmt:formatDate value="${mjonMsgDelaySentList.regdate}" pattern="yyyy-MM-dd HH:mm"/> <fmt:formatDate value="${mjonMsgDelaySentList.regDate}" pattern="yyyy-MM-dd HH:mm"/>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4605,7 +4613,7 @@ function fnInputSmsTxt(){
<c:otherwise> <c:otherwise>
<c:choose> <c:choose>
<c:when test="${mjonMsgDelaySentList.delayYn eq 'Y'}"> <c:when test="${mjonMsgDelaySentList.delayYn eq 'Y'}">
[스미싱의심] <fmt:formatDate value="${mjonMsgDelaySentList.reqdate}" pattern="yyyy-MM-dd HH:mm"/> [스미싱의심] <fmt:formatDate value="${mjonMsgDelaySentList.reqDate}" pattern="yyyy-MM-dd HH:mm"/>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -
@ -4785,6 +4793,10 @@ function fnInputSmsTxt(){
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty kakaoResultList.regDate}"> <c:when test="${not empty kakaoResultList.regDate}">
<c:out value="${kakaoResultList.regDate}" />
<%-- ${fnc:setStrToDataFormatter(kakaoResultList.regDate, 'MM-dd HH:mm') } --%>
<fmt:parseDate value="${kakaoResultList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <fmt:parseDate value="${kakaoResultList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
</c:when> </c:when>
@ -4925,8 +4937,10 @@ function fnInputSmsTxt(){
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty kakaoReserveList.regDate}"> <c:when test="${not empty kakaoReserveList.regDate}">
<fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> <c:out value="${kakaoReserveList.regDate}" />
<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> ${fnc:setStrToDataFormatter(kakaoReserveList.regDate, 'MM-dd HH:mm') }
<%-- <fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
<%-- <fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> --%>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
@ -5073,8 +5087,11 @@ function fnInputSmsTxt(){
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty kakaoDelayInfo.regDate}"> <c:when test="${not empty kakaoDelayInfo.regDate}">
<fmt:parseDate value="${kakaoDelayInfo.regDate}" var="kakaoDelayRegdate" pattern="yyyy-MM-dd HH:mm:ss"/> <%-- <c:out value="${kakaoDelayInfo.regDate}" /> --%>
<fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/> ${fnc:setStrToDataFormatter(kakaoDelayInfo.regDate, 'MM-dd HH:mm') }
<%-- <fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/> --%>
<%-- <fmt:parseDate value="${kakaoDelayInfo.regDate}" var="kakaoDelayRegdate" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
<%-- <fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/> --%>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -

View File

@ -31,8 +31,18 @@ $( document ).ready(function(){
makeDate('ntceBgndeYYYMMDD'); makeDate('ntceBgndeYYYMMDD');
makeTomorrow('ntceEnddeYYYMMDD'); 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 문자열 * @param {string} url 원본 URL 문자열
* @returns {string} 불필요한 파라미터가 제거된 URL * @returns {string} 불필요한 파라미터가 제거된 URL
*/ */
function cleanUrlParameters(url) { function cleanUrlParameters(url) {
try { try {
// URL이 절대경로 (/web/... 형태)인지 확인 // URL이 절대경로 (/web/... 형태)인지 확인
let hasFullDomain = url.startsWith("http://") || url.startsWith("https://"); let hasFullDomain = url.startsWith("http://") || url.startsWith("https://");
let urlObj; let urlObj;
if (hasFullDomain) { if (hasFullDomain) {
// 도메인이 포함된 URL 처리 // 도메인이 포함된 URL 처리
urlObj = new URL(url); urlObj = new URL(url);
} else { } else {
// 절대경로 URL 처리 (가상의 도메인 추가 후 파싱) // 절대경로 URL 처리 (가상의 도메인 추가 후 파싱)
urlObj = new URL("https://www.munjaon.co.kr" + 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 파싱 실패 시 원본 유지
} }
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){ function makeDate(id){
@ -141,17 +149,6 @@ function validate(method_parm) {
for (let i = 0; i < linkRows.length; i++) { for (let i = 0; i < linkRows.length; i++) {
let linkInput = document.querySelector('input[name="mainPopupLinkList['+i+'].mlink"]'); let linkInput = document.querySelector('input[name="mainPopupLinkList['+i+'].mlink"]');
let coordInput = document.querySelector('input[name="mainPopupLinkList['+i+'].coords"]'); 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() === "") { if (linkInput.value.trim() === "") {
alert('['+(i + 1)+']번째 링크주소를 입력해 주십시오'); alert('['+(i + 1)+']번째 링크주소를 입력해 주십시오');
@ -165,11 +162,6 @@ function validate(method_parm) {
return false; return false;
} }
if (sortInput.value.trim() === "") {
alert('['+(i + 1)+']번째 순서를 입력해 주십시오');
sortInput.focus();
return false;
}
} }
console.log('isTbodyEmpty("tbody_fiielist") : ', isTbodyEmpty("tbody_fiielist")); console.log('isTbodyEmpty("tbody_fiielist") : ', isTbodyEmpty("tbody_fiielist"));
@ -286,30 +278,77 @@ function addLinkRow() {
coordTd.innerHTML = '<input type="text" name="mainPopupLinkList['+rowCount+'].coords" maxlength="200" />'; coordTd.innerHTML = '<input type="text" name="mainPopupLinkList['+rowCount+'].coords" maxlength="200" />';
// 세 번째 컬럼 (링크 좌표) // 세 번째 컬럼 (링크 좌표)
let sortTh = document.createElement("th");
sortTh.innerHTML = '<span>순서</span>';
let sortTd = document.createElement("td"); let sortTd = document.createElement("td");
sortTd.innerHTML = '<input type="text" name="mainPopupLinkList['+rowCount+'].sort" maxlength="200" value="'+rowCountP+'" />'; sortTd.setAttribute("colspan", "2");
sortTd.innerHTML = '<input type="button" class="btnType2" value="삭제" onclick="fn_linkDel(\'\')" />';
// tr에 추가 // tr에 추가
newRow.appendChild(linkTh); newRow.appendChild(linkTh);
newRow.appendChild(linkTd); newRow.appendChild(linkTd);
newRow.appendChild(coordTh); newRow.appendChild(coordTh);
newRow.appendChild(coordTd); newRow.appendChild(coordTd);
newRow.appendChild(sortTh);
newRow.appendChild(sortTd); newRow.appendChild(sortTd);
// tbody에 추가 // tbody에 추가
tbody.appendChild(newRow); 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: '<c:url value="/uss/ion/bnr/pop/mainPopupLinkDeleteAjax.do" />',
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);
}
});
}
}
</script> </script>
<style> <style>
.date_format{width:91px !important;} .date_format{width:91px !important;}
.del_file_btn{border: none;background-color: transparent;background-image: url(/direct/img/upload_delect_img.png);background-repeat: no-repeat;background-position: center center;vertical-align: middle;margin-top: -4px;margin-right: 15px;} .del_file_btn{border: none;background-color: transparent;background-image: url(/direct/img/upload_delect_img.png);background-repeat: no-repeat;background-position: center center;vertical-align: middle;margin-top: -4px;margin-right: 15px;}
.file_size{color: #0388d2;font-weight: bold;} .file_size{color: #0388d2;font-weight: bold;}
.uploaded_obj{width: 100%;} .uploaded_obj{width: 100%;}
.btnType2 {
border: 1px solid #456ded;
color: #456ded;
}
</style> </style>
</head> </head>
<body> <body>
@ -441,30 +480,12 @@ function addLinkRow() {
<td> <td>
<form:input path="mainPopupLinkList[${status.index}].coords" class="mlink" maxlength="200" /> <form:input path="mainPopupLinkList[${status.index}].coords" class="mlink" maxlength="200" />
</td> </td>
<th><span>순서</span></th> <td colspan="2">
<td> <input type="button" class="btnType2" value="삭제" onclick="fn_linkDel('${link.popLinkId }'); return false;">
<form:input path="mainPopupLinkList[${status.index}].sort" class="mlink" maxlength="200" oninput="this.value = this.value.replace(/[^0-9]/g, '');" />
</td> </td>
</tr> </tr>
</c:forEach> </c:forEach>
</c:when> </c:when>
<c:otherwise>
<!-- 값이 없을 때 빈 input 생성 -->
<tr>
<th><span>[1]링크주소</span></th>
<td>
<form:input path="mainPopupLinkList[0].mlink" class="mlink" maxlength="200" />
</td>
<th><span>링크좌표</span></th>
<td>
<form:input path="mainPopupLinkList[0].coords" maxlength="200" />
</td>
<th><span>순서</span></th>
<td>
<form:input path="mainPopupLinkList[0].sort" maxlength="200" value="1" oninput="this.value = this.value.replace(/[^0-9]/g, '');" />
</td>
</tr>
</c:otherwise>
</c:choose> </c:choose>
</tbody> </tbody>
<tr> <tr>

View File

@ -341,8 +341,8 @@ function whoisIpCountry() {
} }
function actionLogin() { function actionLogin() {
location.href="<c:url value='/web/user/login/login.do'/>"; // location.href="<c:url value='/web/user/login/login.do'/>";
/*
// 아이디 공백 제거 // 아이디 공백 제거
document.loginForm.id_text.value = $.trim(document.loginForm.id_text.value); document.loginForm.id_text.value = $.trim(document.loginForm.id_text.value);
@ -353,16 +353,6 @@ function actionLogin() {
alert("비밀번호를 입력하세요"); alert("비밀번호를 입력하세요");
return; return;
} else { } else {
// Whois IP 국가코드
//whoisIpCountry();
setTimeout(function() {
if (isKoreaIpAddress == false) {
alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다.");
location.href='/web/uat/uia/actionLogout.do';
return false;
}
// 로그인 START // 로그인 START
var rsa = new RSAKey(); var rsa = new RSAKey();
rsa.setPublic($('#RSAModulus').val(),$('#RSAExponent').val()); rsa.setPublic($('#RSAModulus').val(),$('#RSAExponent').val());
@ -373,13 +363,84 @@ function actionLogin() {
$("#id").val(rsa.encrypt(id.val().toLowerCase())); $("#id").val(rsa.encrypt(id.val().toLowerCase()));
$("#password").val(rsa.encrypt(pw.val())); $("#password").val(rsa.encrypt(pw.val()));
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
saveid(document.loginForm); 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="<c:url value='/web/user/humanPage.do'/>";
document.loginForm.submit();
}else if (data.returnType == "B"){
//기업회원 기업정보 기입
document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/membershipAttachDocBefore.do'/>";
document.cmpChangeForm.submit();
}else if (data.returnType == "C"){
document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/loginRestrictionUse.do'/>";
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 = "<c:url value='/web/user/login/login.do'/>";
document.loginForm.submit();
}
//아이디/휴대폰 번호 체크
function actionLogin_end(){
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLoginAfterHp.do'/>";
saveid(document.loginForm);
document.loginForm.submit();
} }
function saveid(form) { function saveid(form) {
@ -1636,14 +1697,19 @@ function actionLogin() {
<input type="hidden" id="id" name="id"> <input type="hidden" id="id" name="id">
<input type="hidden" id="password" name="password"> <input type="hidden" id="password" name="password">
<input type="hidden" id="ip" name="ip" value="${userIp}"> <input type="hidden" id="ip" name="ip" value="${userIp}">
<input type="hidden" id="passFlag" name="passFlag">
<input type="hidden" id="headerLoginResult" name="headerLoginResult">
<div id="login" class="login"> <div id="login" class="login">
<div class="inner"> <div class="inner">
<div class="login_left"> <div class="login_left">
<div class="login_put"> <div class="login_put">
<label for="id_text" class="label"></label> <label for="id_text" class="label"></label>
<input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18" onclick="actionLogin();"> <!-- <input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18" onclick="actionLogin();"> -->
<input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18">
<label for="password_text" class="label"></label> <label for="password_text" class="label"></label>
<input type="password" placeholder="비밀번호를 입력해주세요" id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}" onclick="actionLogin();"> <!-- <input type="password" placeholder="비밀번호를 입력해주세요" id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}" onclick="actionLogin();"> -->
<input type="password" placeholder="비밀번호를 입력해주세요" id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}">
<label for="login_button" class="label"></label> <label for="login_button" class="label"></label>
<button type="button" id="login_button" class="btnType btnType1" class="login_button" onclick="actionLogin();">로그인</button> <button type="button" id="login_button" class="btnType btnType1" class="login_button" onclick="actionLogin();">로그인</button>
</div> </div>
@ -1758,5 +1824,9 @@ function actionLogin() {
<input type="hidden" name="tr_url" id="tr_urlHeader" value = ""> <input type="hidden" name="tr_url" id="tr_urlHeader" value = "">
<input type="hidden" name="tr_add" id="tr_addHeader" value = ""> <input type="hidden" name="tr_add" id="tr_addHeader" value = "">
</form> </form>
<form name="cmpChangeForm" id="cmpChangeForm" method="post" action="#">
<input type="hidden" name="mberId" value=""/>
</form>
</header><!--// header 영역 --> </header><!--// header 영역 -->

View File

@ -142,10 +142,10 @@ function cntntBtnInfo(stepInfo){
<ul class="tabType4"> <ul class="tabType4">
<li id="tabAt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlim');">알림톡</button></li> <li id="tabAt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlim');">알림톡</button></li>
<%-- <c:if test="${fn:contains(pageContext.request.requestURL , 'localhost') --%> <c:if test="${pageContext.request.serverName == 'localhost'
<%-- || fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%> || pageContext.request.serverName == '119.193.215.98'}">
<!-- <li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li> --> <li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li>
<%-- </c:if> --%> </c:if>
<li id="tabConf" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabConf');">카카오톡 설정</button></li> <li id="tabConf" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabConf');">카카오톡 설정</button></li>
<li id="tabIntro" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlimtalkIntrd');">알림톡 소개</button></li> <li id="tabIntro" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlimtalkIntrd');">알림톡 소개</button></li>
</ul> </ul>

View File

@ -25,16 +25,23 @@ function initMenuTab(){
console.log('uri:', uri); console.log('uri:', uri);
if(uri.includes('selectMsgSentView')){ // URI 키워드와 해당 탭 ID를 매핑
$('.topTab').removeClass("active"); const tabMapping = [
$("#smsTab").addClass("active"); { keyword: 'selectMsgSentView', tabId: '#smsTab' }, // 'selectMsgSentView' 키워드를 '#smsTab'으로 매핑
}else if(uri.includes('selectKakaoSentView')){ { keyword: 'selectKakaoSentView', tabId: '#kakaoTab' }, // 'selectKakaoSentView' 키워드를 '#kakaoTab'으로 매핑
$('.topTab').removeClass("active"); { keyword: 'faxSendList', tabId: '#faxTab' } // 'faxSendList' 키워드를 '#faxTab'으로 매핑
$("#kakaoTab").addClass("active"); ];
}else if(uri.includes('faxSendList')){
$('.topTab').removeClass("active"); // URI에 특정 키워드가 포함되어 있는지 확인하여 활성 탭 정보를 찾음
$("#faxTab").addClass("active"); const activeTab = tabMapping.find(mapping => uri.includes(mapping.keyword)); // 'uri'에 키워드가 포함된 첫 번째 매핑을 검색
// 매칭된 탭이 있으면 UI를 업데이트하여 해당 탭을 활성화
if (activeTab) {
$('.topTab').removeClass("active"); // 모든 탭에서 "active" 클래스 제거
$(activeTab.tabId).addClass("active"); // 매핑된 탭 ID에 "active" 클래스 추가
} }
} }
function fnLinkPageTab(tabInfo){ function fnLinkPageTab(tabInfo){

View File

@ -7,15 +7,18 @@
<!-- <script src="/publish/js/content.js"></script> --> <!-- <script src="/publish/js/content.js"></script> -->
<!-- 주소록관련 js --> <!-- 주소록관련 js -->
<script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script> <script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script> <script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script> <script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script> <script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script> <script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script> <script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
<!-- 주소록 유효성 체크 공통유틸로 인해 추가 -->
<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script>
<script type="text/javascript"> <script type="text/javascript">
var loginVO = '${loginVO}'; var loginVO = '${loginVO}';
// 체크박스 동적 바인딩 // 체크박스 동적 바인딩
$(document).on('click','.wrap01C', function(){ $(document).on('click','.wrap01C', function(){
var total = $(".wrap01C").length; var total = $(".wrap01C").length;
@ -87,28 +90,52 @@ $(document).ready(function(){
//선택삭제 버튼 클릭 이벤트 //선택삭제 버튼 클릭 이벤트
$("#select_del").on('click', function(){ $("#select_del").on('click', function(){
if($('.wrap01C:checkbox:checked').length < 1)
{ if(tableL == null || tableL == ""){
alert("삭제할 연락처를 선택해주세요.!!");
alert("받는사람을 추가해 주세요.");
return false; return false;
}
var selectedData = tableL.getSelectedRows();
if(selectedData == "" || selectedData == null){
alert("삭제할 연락처를 선택해주세요.");
return false;
// 선택한 Row 데이터 삭제하기
}else if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
// 선택 데이터 삭제
selectedData.forEach(row => row.delete());
totRows = tableL.getRows().length;
updateTotCnt(totRows);
var smsTxtArea = $('#smsTxtArea').val();
//일괄변환 문구 결제금액 처리
} }
$('.wrap01C').each(function(index, item){
if($(item).is(':checked'))
$(item).parent().parent().remove();
});
updateTotCnt();
}); });
//선택삭제 버튼 클릭 이벤트 //선택삭제 버튼 클릭 이벤트
$("#all_del").on('click', function(){ $("#all_del").on('click', function(){
if(!confirm("받는사람 목록을 모두 삭제하시겠습니까?")) if(!confirm("받는사람 목록을 모두 삭제하시겠습니까?"))
return false; return false;
$('#wrap01_body .list_body').remove(); $('#wrap01_body .list_body').remove();
tableL.clearData();
$('#rowTotCnt').text(0); $('#rowTotCnt').text(0);
$('#rowDupCnt').text(0); $('#rowDupCnt').text(0);
}); });
@ -509,19 +536,13 @@ function sendTemplateInfo(){
return false; return false;
} }
//수신자 목록 체크
if($('.phoneArea').length < 1)
{
alert('받는 사람 입력 후 발송해 주세요');
return false;
}
//수신자 목록 체크 //수신자 목록 체크
if($('.phoneArea').length > 500) /* if($('.phoneArea').length > 500)
{ {
alert("최대 발송 건수는 500건 입니다."); alert("최대 발송 건수는 500건 입니다.");
return false; return false;
} } */
if($('#errorChk').val() === 'N' if($('#errorChk').val() === 'N'
@ -550,7 +571,7 @@ function sendTemplateInfo(){
// 초기화 // 초기화
$('.varValList').remove(); $('.varValList').remove();
$('#bizForm #varNmList').val(''); // $('#bizForm #varNmList').val('');
// 대체문자 전송 확인 // 대체문자 전송 확인
@ -613,133 +634,225 @@ function sendTemplateInfo(){
}else{ }else{
$('#bizForm #reqDate').val(""); $('#bizForm #reqDate').val("");
} }
var dataList = [];
// 치환문자 있는 데이터 파씽 // 치환문자 있는 데이터 파씽
if($('#bizForm #txtReplYn').val() === 'Y'){ if($('#bizForm #txtReplYn').val() === 'Y'){
fn_excelDataTransParsing(); // fn_excelDataTransParsing();
// 치환문자 있는 수신자 리스트 // 치환문자 있는 수신자 리스트
fn_transCallToListParsing(); dataList = fn_transCallToListParsing();
}else{ }else{
// 치환문자 없는 수신자 리스트 // 치환문자 없는 수신자 리스트
fn_callToListParsing(); dataList = fn_callToListParsing();
} }
$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
$('#bizForm #templateCode').val($('#selectTemplateList').val());
//수신자 목록 체크
if(dataList.length < 1)
{
alert('받는 사람 입력 후 발송해 주세요');
return false;
}
// 채널 ID
$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
// 채널 > 템플릿
$('#bizForm #templateCode').val($('#selectTemplateList').val());
// 발신번호 // 발신번호
$('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val())); $('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val()));
if(confirm("알림톡을 발송하시겠습니까?")){ // 폼 데이터를 배열로 직렬화
var spamChk = true; var form = $('#bizForm');
//2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리 var formDataArray = form.serializeArray();
/*var spamChk = false;
var spmData = new FormData(document.bizForm); // 배열을 객체로 변환
$.ajax({ var formData = {};
type: "POST" $.each(formDataArray, function(index, field) {
, url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do" formData[field.name] = field.value;
, data: spmData });
, dataType:'json'
, async: false // 빈 값 제거 (참고 코드 기반)
, processData: false for (var key in formData) {
, contentType: false if (formData[key] === '' || formData[key] === null || formData[key] === undefined) {
, cache: false delete formData[key];
, 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("spams" == returnData.result){
alert("전송 내용에 스팸문구가 포함되어 있습니다.")
return false;
}else{
spamChk = true;
return false;
}
} else if(status== 'fail'){
alert(returnData.message);
return false;
}
}
, error: function (e) {
alert("문자 발송에 실패하였습니다.");
console.log("ERROR : ", e);
return false;
}
}); */
if(spamChk){
var data = new FormData(document.bizForm);
$.ajax({
type: "POST"
, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
, data: data
, dataType: 'json'
, async: true
, processData: false
, contentType: false
, cache: false
, success: function (returnData, status) {
if(status == 'success'){
if("loginFail" == returnData.result){
alert(returnData.message);
return false;
}else if('fail' == returnData.result){
alert(returnData.message);
return false;
}else if('authFail' == returnData.result){
alert(returnData.message);
location.reload();
} else if(status == 'success'){
var kakaoSendCnt = returnData.resultSts;
$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
//예약발송 건의 경우 결과 팝업 문구 변경
if(reserYn == 'Y'){
$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
}else{
$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
}
$('.mask').addClass('on');
}
}
}
,beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
}
,complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
,error: function (e) {
console.log("ERROR : ", e);
alert("카카오 알림톡 전송에 실패하였습니다.");
}
});
} }
} }
// delete formData['varNmList'];
// 선택된 데이터 추가 (varListMap)
formData["varListMap"] = dataList;
console.log('formData : ', formData);
if(confirm("알림톡을 발송하시겠습니까?")){
// 프로그래스파 시간을 위한 계산
var estimtedTime = calculateEstimatedTime(dataList.length);
$.ajax({
type: "POST",
url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do",
data: JSON.stringify(formData),
contentType: 'application/json',
dataType: 'json',
success: function (data) {
console.log('data : ', data);
var status = data.status;
if("OK" == status){
var resultSts = data.object.resultSts;
var reserYn = data.object.reserYn;
var resText = (reserYn === 'Y') ? '예약' : '발송';
$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
$('.pop_msg_success .msg_text').html(resText+" 성공 : <strong>"+ resultSts + "</strong>건의<br>알림톡이 " + resText + " 되었습니다.");
}else if("UNAUTHORIZED" == status){
alert(data.message);
location.reload();
}else{
alert(data.message);
return false;
}
// if(data == 'success'){
/* if("loginFail" == returnData.result){
alert(returnData.message);
return false;
}else if('fail' == returnData.result){
alert(returnData.message);
return false;
}else if('authFail' == returnData.result){
alert(returnData.message);
location.reload();
} else if(status == 'success'){
var kakaoSendCnt = returnData.resultSts;
$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
//예약발송 건의 경우 결과 팝업 문구 변경
if(reserYn == 'Y'){
$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
}else{
$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
}
$('.mask').addClass('on');
} */
// }
}
,beforeSend : function(xmlHttpRequest) {
//로딩창 show
// $('.loading_layer').addClass('active');
// 프로그래스 바 실행
progressStart(estimtedTime);
}
,complete : function(xhr, textStatus) {
//로딩창 hide
// $('.loading_layer').removeClass('active');
// 프로그래스 바 종료
progressComplete();;
}
,error: function (e) {
console.log("ERROR : ", e);
alert("카카오 알림톡 전송에 실패하였습니다.");
}
});
}
}
//선택된 데이터의 길이에 따라 예상 시간 계산 함수
function calculateEstimatedTime(selectedCount) {
//기준값
// const processTimePerBatch = 130; // 130초
// 30만건 기준 10분으로 기준을 잡아서
// 시간계산함
const processTimePerBatch = 600;
const batchSize = 300000;
// 1건당 처리 시간
const timePerRecord = processTimePerBatch / batchSize;
// 예상 시간 계산
const estimatedTimeInSeconds = selectedCount * timePerRecord;
return estimatedTimeInSeconds.toFixed(2);
}
//프로그레스바
var start, change;
var progressInterval = null; // 전역 변수로 타이머 ID 관리
function progressStart(time) {
// 기존 타이머 정지 및 초기화
if (progressInterval !== null) {
clearInterval(progressInterval); // 이전 타이머 정지
progressInterval = null; // 타이머 ID 초기화
}
resetProgressBar(); // 프로그레스바 초기화
// 프로그레스바 보이기
$(".progress_bar_wrap").css("display", "flex");
// 프로그레스바 요소 가져오기
var timeText = document.querySelector(".time_text");
var bar = document.querySelector(".change_bar");
// 초기 상태 설정
var width = 1;
var totalTime = time * 1000; // 총 실행 시간 (밀리초)
var cmpWid = totalTime / 100; // width 증가 간격 (밀리초)
// 새 타이머 시작
progressInterval = setInterval(changeWidth, cmpWid);
function changeWidth() {
if (width >= 100) {
// 프로그레스바 100% 도달
clearInterval(progressInterval); // 타이머 종료
progressInterval = null; // 타이머 ID 초기화
timeText.innerHTML = "100%";
setTimeout(function () {
// 100% 표시 후 "잠시만 기다려주세요" 변경
timeText.innerHTML = "잠시만 기다려주세요...";
$(".time_text").addClass("animation");
}, 1000);
} else {
// 프로그레스바 진행
width++;
bar.style.width = width + "%";
timeText.innerHTML = width + "%";
}
}
}
//프로그레스바 완료
function progressComplete() {
// var width = parseInt($(".time_text").text().replace('%', '')) || 0; // 현재 width 가져오기
$(".progress_bar_wrap").hide();
} }
/* /*
* 치환문자 있는 수신자 목록 파씽 * 치환문자 있는 수신자 목록 파씽
*/ */
function fn_transCallToListParsing(){ function fn_transCallToListParsing(){
var callToList = []; /* var callToList = [];
// excel body // excel body
$('.excelBody').each(function(indexBody, itemBody){ $('.excelBody').each(function(indexBody, itemBody){
$(itemBody).find('.list_table_name').each(function(indexRow, itemRow){ $(itemBody).find('.list_table_name').each(function(indexRow, itemRow){
@ -750,7 +863,31 @@ function fn_transCallToListParsing(){
}); });
}); });
$('#bizForm #callToList').val(callToList); $('#bizForm #callToList').val(callToList);
*/
var dataList = [];
var headers = [];
$('#excelHead .list_table_name').each(function() {
headers.push($(this).text().trim());
});
$('.excelBody').each(function() {
var row = {};
$(this).find('.list_table_name').each(function(index) {
var key = headers[index];
var value = $(this).text().trim();
if (index === 0) {
row["callToList"] = value; // 수신번호는 별도로 처리
} else {
row[key] = value; //
}
});
console.log(row)
dataList.push(row);
});
return dataList;
} }
/* /*
@ -758,13 +895,28 @@ function fn_transCallToListParsing(){
*/ */
function fn_callToListParsing(){ function fn_callToListParsing(){
var callToList = []; var dataList = [];
// excel body
$('.phoneArea').each(function(index, item){ /* $('.phoneArea').each(function(index, item){
callToList.push($(item).text().replaceAll('\\t', '')); var row = {};
var value = $(item).text().replaceAll('\\t', '')
row["callToList"] = value; // 수신번호는 별도로 처리
dataList.push(row);
});
*/
// Tabulator 테이블의 데이터 가져오기
var tableData = tableL.getData();
tableData.forEach(function(row){
var dataRow = {};
dataRow["callToList"] = row.phone; // phone 필드 값을 callToList로 저장
dataList.push(dataRow);
}); });
$('#bizForm #callToList').val(callToList); return dataList;
} }
@ -777,9 +929,8 @@ function fn_excelDataTransParsing(){
// title 배열 // title 배열
var varHead = []; var varHead = [];
// 값 배열 // 값 배열
var varVal = []; // var varVal = [];
var inputTag = '<input type="hidden" class="varValList" name="varValList[$INDEX$]" value="$VAL$">';
// excel title // excel title
$('#excelHead').find('div').each(function(index, item){ $('#excelHead').find('div').each(function(index, item){
@ -803,7 +954,7 @@ function fn_excelDataTransParsing(){
$("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index )); $("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index ));
}); */ }); */
$('.excelBody').each(function(index, item){ /* $('.excelBody').each(function(index, item){
var valLeng = $('#excelHead').find('.list_table_name').length-1; var valLeng = $('#excelHead').find('.list_table_name').length-1;
varValTemp = ''; varValTemp = '';
@ -821,7 +972,7 @@ function fn_excelDataTransParsing(){
console.log('varValTemp : ',varValTemp); console.log('varValTemp : ',varValTemp);
varVal.push(varValTemp); varVal.push(varValTemp);
}); });
$('#bizForm #varValList').val(varVal); $('#bizForm #varValList').val(varVal); */
} }
@ -881,9 +1032,9 @@ function thisFnByteString(contents){
$('#smsLen').val(conLeng); $('#smsLen').val(conLeng);
$('#msgLeng').html(conLeng + " / ");
if(conLeng > 90){ if(conLeng > 90){
$('#msgLeng').html(conLeng + " / ");
$('#limitLeng').html("2000"); $('#limitLeng').html("2000");
$('.msg_com').html("장문"); $('.msg_com').html("장문");
$('#msgType').val("6"); // 메세지 타입 설정 $('#msgType').val("6"); // 메세지 타입 설정
@ -897,7 +1048,6 @@ function thisFnByteString(contents){
}else{ }else{
$('#msgLeng').html(conLeng + " / ");
$('#limitLeng').html("90"); $('#limitLeng').html("90");
$('.msg_com').html("단문"); $('.msg_com').html("단문");
$('#msgType').val("4"); // 메세지 타입 설정 $('#msgType').val("4"); // 메세지 타입 설정
@ -910,7 +1060,7 @@ function thisFnByteString(contents){
} }
//수신목록 전체 데이터 갯수 구하기 //수신목록 전체 데이터 갯수 구하기
updateTotCnt(totRows); //updateTotCnt(totRows);
} }
/** /**
@ -1076,6 +1226,62 @@ function checkNumber(event) {
return true; return true;
} }
//재전송 스크립트 수정
$(window).on('load', function() {
if(${msgResendAllFlag eq 'Y'}) {
// 채널 ID 및 템플릿 선택 코드는 유지
$("#selectKakaoProfileList option").filter(function() {
return $(this).text() === '${kakaoVO.msgResendAllYellowId}';
}).prop('selected', true).parent().trigger("click");
// 템플릿 선택
$("#selectTemplateList option").remove();
selectTemplateList();
$("#selectTemplateList").val("${kakaoVO.msgResendAllTmpKey}");
selectTemplateInfo("${kakaoVO.msgResendAllTmpKey}");
fn_viewDataInit02();
priceInit();
try {
// JSON 파싱
var resendListObj = JSON.parse('${resendListJson}');
var listCnt = resendListObj.length;
// 중복 제거 - Set 사용
var uniquePhones = new Set();
var uniqueResendList = [];
// 중복 제거 로직
for(var i = 0; i < resendListObj.length; i++) {
var phone = removeDash(resendListObj[i].callTo);
if(!uniquePhones.has(phone)) {
uniquePhones.add(phone);
uniqueResendList.push(resendListObj[i]);
}
}
// 중복 제거된 데이터로 처리
for(var i = 0; i < uniqueResendList.length; i++) {
var phoneNumber = removeDash(uniqueResendList[i].callTo);
// callTo 입력 필드에 값 설정 후 번호추가 버튼 클릭
$("#callTo").val(phoneNumber);
$(".addCallToF").trigger("click");
}
// 총 건수 확인
setTimeout(function() {
updateTotCnt();
}, 500);
} catch(e) {
console.error("재전송 데이터 처리 오류:", e);
}
}
});
</script> </script>
<div class="loading_layer"> <div class="loading_layer">
@ -1085,6 +1291,17 @@ function checkNumber(event) {
</div> </div>
</div> </div>
<div class="progress_bar_wrap">
<div class="progress_box">
<p class="time_text">0%</p>
<div class="bar">
<span class="change_bar"></span>
</div>
</div>
<div class="btn_wrap">
</div>
</div>
<!-- 기업회원 이동 팝업 --> <!-- 기업회원 이동 팝업 -->
<div class="tooltip-wrap cvt_member_popup_wrap"> <div class="tooltip-wrap cvt_member_popup_wrap">
<div class="popup-com cvt_member_layer" tabindex="0" data-tooltip-con="cvt_member_layer" data-focus="cvt_member_layer" data-focus-prev="cvt_member_layer-close"> <div class="popup-com cvt_member_layer" tabindex="0" data-tooltip-con="cvt_member_layer" data-focus="cvt_member_layer" data-focus-prev="cvt_member_layer-close">
@ -1136,8 +1353,8 @@ function checkNumber(event) {
<input type="hidden" id="divideTime" name="divideTime" value=""> <!--전송일자--> <input type="hidden" id="divideTime" name="divideTime" value=""> <!--전송일자-->
<input type="hidden" id="callFrom" name="callFrom" value=""> <!--완 보내는사람 --> <input type="hidden" id="callFrom" name="callFrom" value=""> <!--완 보내는사람 -->
<input type="hidden" id="callToList" name="callToList" value=""> <!--완 받는사람 리스트--> <!-- <input type="hidden" id="callToList" name="callToList" value=""> 완 받는사람 리스트 -->
<input type="hidden" id="varNmList" name="varNmList" value=""> <!--완 변수 이름 리스트--> <!-- <input type="hidden" id="varNmList" name="varNmList" value=""> 완 변수 이름 리스트 -->
<input type="hidden" id="varValList" name="varValList" value=""> <!--완 변수 리스트--> <input type="hidden" id="varValList" name="varValList" value=""> <!--완 변수 리스트-->
<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}"> <!--알림톡 스미싱 여부--> <input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}"> <!--알림톡 스미싱 여부-->
@ -1298,32 +1515,32 @@ function checkNumber(event) {
</span> </span>
</div> </div>
<div class="receipt_num_midde"> <div class="receipt_num_midde">
<div class="listType list01" > <div class="listType list01 callList_box_P">
<div class="list_table list_head"> <!-- <div class="list_table list_head">
<div class="cb_wrap"> <div class="cb_wrap">
<label for="select_all" class="label"></label> <label for="select_all" class="label"></label>
<input type="checkbox" id="select_all"> <input type="checkbox" id="select_all">
</div> </div>
<div class="list_table_num"> <div class="list_table_num">
<p>휴대폰</p> <p>휴대폰</p>
<!-- <img src="/publish/images/sortUp.png"> --> <img src="/publish/images/sortUp.png">
<!-- <img src="/publish/images/sortDown.png"> --> <img src="/publish/images/sortDown.png">
</div>
<div class="list_table_name">
<p>이름</p>
<img src="/publish/images/sortUp.png">
<img src="/publish/images/sortDown.png">
</div> </div>
<!-- <div class="list_table_name"> -->
<!-- <p>이름</p> -->
<!-- <img src="/publish/images/sortUp.png"> -->
<!-- <img src="/publish/images/sortDown.png"> -->
<!-- </div> -->
</div> </div>
<div class="list_body_wrap" id="wrap01_body"> <div class="list_body_wrap" id="wrap01_body">
</div> </div> -->
</div> </div>
<div class="put_right"> <div class="put_right">
<div class="btn_popup_wrap spc_wrap"> <div class="btn_popup_wrap spc_wrap">
<button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button> <button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button>
</div> </div>
<div class="btn_popup_wrap"> <div class="btn_popup_wrap">
<button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button> <button type="button" data-tooltip="popup07" class="btnType btnType7">엑셀 불러오기</button>
</div> </div>
<div class="btn_popup_wrap"> <div class="btn_popup_wrap">
<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button> <button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button>
@ -1331,13 +1548,13 @@ function checkNumber(event) {
<div class="btn_popup_wrap"> <div class="btn_popup_wrap">
<button type="button" data-tooltip="popup03" class="btnType btnType7 tab2">자주보내는 번호</button> <button type="button" data-tooltip="popup03" class="btnType btnType7 tab2">자주보내는 번호</button>
</div> </div>
<div class="btn_popup_wrap check_validity_wrap"> <!-- <div class="btn_popup_wrap check_validity_wrap">
<button type="button" class="btnType btnType7" id="check_validity">오류검사 <i class="qmMark"></i></button> <button type="button" class="btnType btnType7" id="check_validity">오류검사 <i class="qmMark"></i></button>
<div class="error_hover_cont send_hover_cont"> <div class="error_hover_cont send_hover_cont">
<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p> <p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span> <span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>
<div class="list_bottom clearfix"> <div class="list_bottom clearfix">
@ -1577,7 +1794,7 @@ function checkNumber(event) {
<!-- 주소록 불러오기 --> <!-- 주소록 불러오기 -->
<div class="tooltip-wrap"> <div class="tooltip-wrap">
<div class="popup-com import_layer popup06" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px"> <div class="popup-com import_layer popup06 adr_call_popup" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px">
<div class="popup_heading"> <div class="popup_heading">
<p><span>주소록 불러오기</p> <p><span>주소록 불러오기</p>
<button type="button" onClick="javascript:addrClose(); return false;"> <button type="button" onClick="javascript:addrClose(); return false;">
@ -1628,7 +1845,9 @@ function checkNumber(event) {
<!--// table --> <!--// table -->
</div> </div>
<div class="popup_btn_wrap2"> <div class="popup_btn_wrap2">
<button type="button" onClick="javascript:addrToList(); return false;">추가</button> <button type="button" onClick="javascript:addrToList_advc('all'); return false;">전체추가</button>
<button type="button" onClick="javascript:addrToList_advc('select'); return false;">선택추가</button>
<!-- <button type="button" onClick="javascript:addrToList(); return false;">추가</button> -->
<button type="button" onClick="javascript:addrClose(); return false;">닫기</button> <button type="button" onClick="javascript:addrClose(); return false;">닫기</button>
</div> </div>
<%-- 주소록 레이어 팝업 닫기 실행 코드 --%> <%-- 주소록 레이어 팝업 닫기 실행 코드 --%>
@ -1717,44 +1936,58 @@ function checkNumber(event) {
<!-- <div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close"> -->
<%-- <%@include file="/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp" %> --%>
<!-- </div> -->
<!-- 엑셀 불러오기 --> <!-- 엑셀 불러오기 -->
<form id="excelToolTipForm" name="excelToolTipForm" method="post"> <form id="excelToolTipForm" name="excelToolTipForm" method="post">
<div class="tooltip-wrap"> <div class="tooltip-wrap">
<div class="popup-com import_layer popup02" tabindex="0" data-tooltip-con="popup02" data-focus="popup02" data-focus-prev="popup02-close"> <div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close">
<div class="popup_heading">
<p><span>엑셀</span> 불러오기</p> <%@include file="/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp" %>
<button type="button" class="tooltip-close" data-focus="popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button> </div>
</div> </div>
<div class="layer_in">
<!-- 엑셀파일 불러오기 -->
<div class="hascont">
<div class="titBox">
<p>- 최대 2만 건까지 등록할 수 있습니다.</p>
<p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
<p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
</p>
<!-- <button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button> -->
<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
</div>
<div class="attachedFile">
<label for="excelNm01" class="attachedFile_label">첨부파일</label>
<input type="text" id="excelNm01" value="" readonly>
<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
<!-- <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExport01(event); return false;" style="display:none"/> -->
<button type="button" class="btnType btnType6 c1">찾아보기</button>
<!-- <p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p> -->
<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
</div>
</div><!--// 엑셀파일 불러오기 -->
<div class="popup_btn_wrap2">
<button type="button" class="tooltip-close" data-focus="popup02-close" data-focus-next="popup02" onclick="excelAddAjax()">추가</button>
<!-- <button type="button" class="tooltip-close" data-focus="popup02-close" data-focus-next="popup02" onclick="excelAdd()">추가</button> -->
<button type="button" class="tooltip-close" data-focus="popup02-close" data-focus-next="popup02">닫기</button>
</div>
</div>
</div>
</div><!--// 엑셀 불러오기 -->
</form> </form>
<!-- 엑셀 불러오기 -->
<!-- <form id="excelToolTipForm" name="excelToolTipForm" method="post">
<div class="tooltip-wrap">
<div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close">
<div class="popup_heading">
<p><span>엑셀</span> 불러오기</p>
<button type="button" class="tooltip-close" data-focus="popup07-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
엑셀파일 불러오기
<div class="hascont">
<div class="titBox">
<p>- 최대 2만 건까지 등록할 수 있습니다.</p>
<p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
<p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
</p>
<button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button>
<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
</div>
<div class="attachedFile">
<label for="excelNm01" class="attachedFile_label">첨부파일</label>
<input type="text" id="excelNm01" value="" readonly>
<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
<button type="button" class="btnType btnType6 c1">찾아보기</button>
<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
</div>
</div>// 엑셀파일 불러오기
<div class="popup_btn_wrap2">
<button type="button" class="tooltip-close" data-focus="popup07-close" data-focus-next="popup07" onclick="excelAddAjax()">추가</button>
<button type="button" class="tooltip-close" data-focus="popup07-close" data-focus-next="popup07" onclick="excelAdd()">추가</button>
<button type="button" class="tooltip-close" data-focus="popup07-close" data-focus-next="popup07">닫기</button>
</div>
</div>
</div>
</div>// 엑셀 불러오기
</form> -->
<form id="excelVarFileForm" name="excelVarFileForm" method="post"> <form id="excelVarFileForm" name="excelVarFileForm" method="post">
<input type="hidden" id="excelVarCnt" name="excelVarCnt" value="0"/> <input type="hidden" id="excelVarCnt" name="excelVarCnt" value="0"/>
<input type="hidden" id="excelVarList" name="excelVarList" value=""/> <input type="hidden" id="excelVarList" name="excelVarList" value=""/>

View File

@ -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" %>
<!-- <script src="/publish/js/content.js"></script> -->
<!-- 주소록관련 js -->
<script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
<script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
<script type="text/javascript">
/*
* 등록된 발신 탬플릿 카카오톡 전송
*/
function send_many(cnt){
for(var i = 0 ; i < cnt ; i ++){
sendTemplateInfo();
}
}
function sendTemplateInfo(){
var data = new FormData(document.bizForm);
$.ajax({
type: "POST"
, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
, data: data
, dataType: 'json'
, async: true
, processData: false
, contentType: false
, cache: false
, success: function (returnData, status) {
if(status == 'success'){
if("loginFail" == returnData.result){
alert(returnData.message);
return false;
}else if('fail' == returnData.result){
alert(returnData.message);
return false;
}else if('authFail' == returnData.result){
alert(returnData.message);
location.reload();
} else if(status == 'success'){
var kakaoSendCnt = returnData.resultSts;
$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
//예약발송 건의 경우 결과 팝업 문구 변경
if(reserYn == 'Y'){
$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
}else{
$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
}
$('.mask').addClass('on');
}
}
}
,beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
}
,complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
,error: function (e) {
console.log("ERROR : ", e);
alert("카카오 알림톡 전송에 실패하였습니다.");
}
});
}
</script>
<div class="loading_layer">
<div class="loading_container">
<div class="bar"></div>
<div class="text">Loading</div>
</div>
</div>
<form id="bizForm" name="bizForm" method="post">
<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabAlim">
<input type="hidden" id="senderKey" name="senderKey" value="669143473b1af459628b8bdf2f48da090c8895de"> <!-- 카카오 보내는 사람 Key -->
<input type="hidden" id="templateCode" name="templateCode" value="bizp_2023040511022617802391882"> <!-- 카카오 전송 templat Code -->
<input type="hidden" id="templateEmphasizeType" name="templateEmphasizeType" value="TEXT"> <!-- 카카오 전송 templateEmphasizeType 타입 -->
<input type="hidden" id="templateContent" name="templateContent" value="test"> <!-- 카카오 전송 templat내용 -->
<input type="hidden" id="templateTitle" name="templateTitle" value="test"> <!-- 카카오 전송 templat 타이틀 -->
<input type="hidden" id="templateSubtitle" name="templateSubtitle" value="test"> <!-- 카카오 전송 templat 서브 타이틀 -->
<input type="hidden" id="subMsgTxtReplYn" name="subMsgTxtReplYn" value=""> <!-- 대체문자 전송내용에 변환문자가 있는지-->
<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="N"> <!-- 대체문자 전송여부 - 알림톡 전송 실패 시 문자 전송-->
<input type="hidden" id="subMsgTxt" name="subMsgTxt" value=""> <!-- 대체문자 전송내용 -->
<input type="hidden" id="txtReplYn" name="txtReplYn" value="N"> <!-- 완 치환문자 여부 - -->
<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="N"> <!-- JSON 생성 여부 -->
<input type="hidden" id="reserveYn" name="reserveYn" value="N"> <!-- 예약문자 여부 - 예약 선택 여부 // 아래 하단 화면 노출 여부도 같이-->
<input type="hidden" id="reqDate" name="reqDate" value=""> <!--전송일자-->
<input type="hidden" id="divideChk" name="divideChk" value=""> <!--전송일자-->
<input type="hidden" id="divideCnt" name="divideCnt" value=""> <!--전송일자-->
<input type="hidden" id="divideTime" name="divideTime" value=""> <!--전송일자-->
<input type="hidden" id="callFrom" name="callFrom" value="01093414986"> <!--완 보내는사람 -->
<input type="hidden" id="callToList" name="callToList" value="01012345678,01012345679,01012345680,01012345681,01012345682,01012345683,01012345684,01012345685,01012345686,01012345687,01012345688,01012345689,01012345690,01012345691,01012345692,01012345693,01012345694,01012345695,01012345696,01012345697,01012345698,01012345699,01012345700,01012345701,01012345702,01012345703,01012345704,01012345705,01012345706,01012345707,01012345708,01012345709,01012345710,01012345711,01012345712,01012345713,01012345714,01012345715,01012345716,01012345717,01012345718,01012345719,01012345720,01012345721,01012345722,01012345723,01012345724,01012345725,01012345726,01012345727,01012345728,01012345729,01012345730,01012345731,01012345732,01012345733,01012345734,01012345735,01012345736,01012345737,01012345738,01012345739,01012345740,01012345741,01012345742,01012345743,01012345744,01012345745,01012345746,01012345747,01012345748,01012345749,01012345750,01012345751,01012345752,01012345753,01012345754,01012345755,01012345756,01012345757,01012345758,01012345759,01012345760,01012345761,01012345762,01012345763,01012345764,01012345765,01012345766,01012345767,01012345768,01012345769,01012345770,01012345771,01012345772,01012345773,01012345774,01012345775,01012345776,01012345777,01012345778,01012345779,01012345780,01012345781,01012345782,01012345783,01012345784,01012345785,01012345786,01012345787,01012345788,01012345789,01012345790,01012345791,01012345792,01012345793,01012345794,01012345795,01012345796,01012345797,01012345798,01012345799,01012345800,01012345801,01012345802,01012345803,01012345804,01012345805,01012345806,01012345807,01012345808,01012345809,01012345810,01012345811,01012345812,01012345813,01012345814,01012345815,01012345816,01012345817,01012345818,01012345819,01012345820,01012345821,01012345822,01012345823,01012345824,01012345825,01012345826,01012345827,01012345828,01012345829,01012345830,01012345831,01012345832,01012345833,01012345834,01012345835,01012345836,01012345837,01012345838,01012345839,01012345840,01012345841,01012345842,01012345843,01012345844,01012345845,01012345846,01012345847,01012345848,01012345849,01012345850,01012345851,01012345852,01012345853,01012345854,01012345855,01012345856,01012345857,01012345858,01012345859,01012345860,01012345861,01012345862,01012345863,01012345864,01012345865,01012345866,01012345867,01012345868,01012345869,01012345870,01012345871,01012345872,01012345873,01012345874,01012345875,01012345876,01012345877"> <!--완 받는사람 리스트-->
<input type="hidden" id="varNmList" name="varNmList" value=""> <!--완 변수 이름 리스트-->
<input type="hidden" id="varValList" name="varValList" value=""> <!--완 변수 리스트-->
<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="N"> <!--알림톡 스미싱 여부-->
</form>
<div class="inner">
<!-- send top -->
<div class="send_top">
<!-- tab button -->
<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
<!--// tab button -->
<!-- 카카오톡 설정 - 알림톡 템플릿 등록/관리 - 내템플릿 -->
<div class="top_content kakaotalksend_cont current pay_tab_wrap">
<div class="send_general kakao_wrap">
<div class="send_right">
<div class="phone_bottom">
<div class="send_rev">
<div class="send_content" style="padding-bottom: 0;">
<div class="rev_radio">
<ul>
<li>
<input type="radio" id="reserYnN" name="reserYn" value="N" checked="checked"><label for="reserYnN">즉시</label>
</li>
<li>
<input type="radio" id="reserYnY" name="reserYn" value="Y"><label for="reserYnY">예약</label>
</li>
</ul>
</div>
<div class="send_btn">
<button type="button" class="btnType btnType11" onclick="javascript:sendTemplateInfo(); return false;">발송하기</button>
<button type="button" class="btnType btnType11" onclick="javascript:send_many(2000); return false;">여러번발송하기</button>
<button type="button" class="btnType btnType10" onclick="javascript:goToKakaoTestPopUp(); return false;">테스트발송</button>
</div>
</div>
<div class="rev_selected">
<div class="rev_top">
<span>날짜 :</span>
<div class="calendar_wrap">
<input type="text" class="startDate2 inp resDate calendar picker__input picker__input--active" title="검색 시작일" id="startDate2" name="startDate2" value="" data-datecontrol="true" readonly="" aria-haspopup="true" aria-expanded="true" aria-readonly="false" aria-owns="startDate2_root">
</div>
<label for="msgResHour" class="label">시 선택</label>
<div class="selBox">
<select class="selType1" id="msgResHour" name="msgResHour">
<c:forEach var="hour" begin="0" end="23" step="1" varStatus="status">
<c:choose>
<c:when test="${hour < 10}">
<option value="0${hour}">0${hour}시</option>
</c:when>
<c:otherwise>
<option value="${hour}">${hour}시</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
<label for="msgResMin" class="label">분 선택</label>
<select class="selType1" id="msgResMin" name="msgResMin">
<c:forEach var="min" begin="0" end="55" step="5">
<c:choose>
<c:when test="${min < 10}">
<option value="0${min}">0${min}분</option>
</c:when>
<c:otherwise>
<option value="${min}">${min}분</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
</div>
</div>
<div class="rev_bottom">
<input type="checkbox" id="inputDivideChk" name="inputDivideChk">
<label for="inputDivideChk">분할전송</label>
<input type="text" class="dividType1" id="frmDivideCnt" name="frmDivideCnt" value="20" onkeypress='return checkNumber(event)' maxlength="4"/>
<label for="frmDivideCnt">건씩</label>
<select class="selType1" id="divideTime" name="divideTime">
<option value="5">05분</option>
<option value="10">10분</option>
<option value="15">15분</option>
<option value="20">20분</option>
<option value="30">30분</option>
</select>
<label for="divideTime">간격</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--// send top -->

View File

@ -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" %>
<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
<script type="text/javascript">
var $tableExcel = null; //엑셀입력 탭
var $tableError = null; //엑셀입력 탭
$(document).ready(function(){
//Tabulator AJAX Data Loading
$tableError = new Tabulator("#tabulator_error", {
height:"255px",
width:"100%",
layout:"fitColumns",
autoColumns:false,
headerHozAlign:"center",
validationMode:"highlight",
clipboard:false,
clipboardCopySelector:"table",
clipboardPasteAction:"insert", // insert, update, replace
placeholder:"등록 팝업에서 휴대폰을 선택 후 확인해주세요.", //fit columns to width of table (optional)
columns:[ //Define Table Columns
// {title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
{title:"휴대폰", field:"phone", hozAlign:"center", headerHozAlign: "center"},
{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center"}
]
});
//Tabulator AJAX Data Loading
$tableExcel = new Tabulator("#tabulator_excel", {
height:"255px",
width:"100%",
layout:"fitColumns",
autoColumns:false,
headerHozAlign:"center",
validationMode:"highlight",
clipboard:false,
clipboardCopySelector:"table",
clipboardPasteAction:"insert", // insert, update, replace
placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
columns:[ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
cell.getRow().toggleSelect();
}
},
{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:50},
{title:"휴대폰", field:"addrPhoneNo", hozAlign:"center", headerHozAlign: "center", width:600, validator:["maxLength:100", "string"]}
],
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수
var valid = cell.isValid();
if(!valid){
alert("양식에 맞지 않는 정보가 입력되었습니다.");
//해당 셀 데이터 삭제
cell.setValue("");
}
return value % parameters.phone;
},
});
// 타뷸레이터 width값 변경 시 위에 select width 값 변경
var titleArray = ["No","A","B","C","D","E","F"];
$tableExcel.on("columnWidth",function(column){
var titleIndex = titleArray.indexOf(column._column.definition.title);
titleIndex += 1;
if(titleIndex != 0){
$('.select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
}else{
$('.select_adr_hd>div').eq(0).css('width', column._column.width);
}
});
$tableExcel.on("scrollHorizontal",function(left){
$(".adr_excel").scrollLeft(left);
})
$(".adr_excel").on("scroll",function(){
$(".tabulator-tableholder").scrollLeft($(this).scrollLeft());
});
$("#excelFileC4").on("change", function(event) {
var fileInfo = event.target.files;
if(fileInfo.length > 0){
excelFileChange(fileInfo[0]);
} else {
fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거
setTimeout(() => { $(this).val(''); }, 0); // 파일 선택 초기화
}
});
$(document).on('click', '#btnAddrMassClose', function() {
$('.field-selector').each(function() { $(this).val(''); });
setAddrMassClose();
});
$(document).on('click', '#closeBtn', function() {
// 대량등록 닫기
setAddrMassClose();
});
// 엑셀등록 닫기
function setAddrMassClose() {
$tableExcel.clearData();
$("#excelRowTotCnt").text(0); //총건수 수정
$("#excelRowDupCnt").text(0); //중복건수 수정
$("#excelRowErrorCnt").text(0); //중복건수 수정
// dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
// 중복 카운트
$("#errorPopDupCnt").text(0);
// 에러 카운트
$("#errorPopErrorCnt").text(0);
//
$("#errorPopTotCnt").text(0);
// popup 영역
$tableError.clearData();
}
//#############################################################################################
//파일업로드 드래그앤 드롭
//#############################################################################################
var objDragAndDrop = $(".upload_area");
$(document).on("dragenter",".upload_area",function(e){
e.stopPropagation();
e.preventDefault();
//$(this).css('border', '2px solid #0B85A1');
});
$(document).on("dragover",".upload_area",function(e){
e.stopPropagation();
e.preventDefault();
});
$(document).on("drop",".upload_area",function(e){
fn_loadAddActive();
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
excelFileChange(files[0]);
});
$(document).on('dragenter', function (e){
e.stopPropagation();
e.preventDefault();
});
$(document).on('dragover', function (e){
e.stopPropagation();
e.preventDefault();
//objDragAndDrop.css('border', '2px dotted #0B85A1');
});
$(document).on('drop', function (e){
e.stopPropagation();
e.preventDefault();
});
//파일 드래그앤드롭 종료
// 받는사람 선택삭제 버튼 처리해주기
$('#in_select_del').click(function(){
if($tableExcel == null || $tableExcel == ""){
alert("받는사람을 추가해 주세요.");
return false;
}
var selectedData = $tableExcel.getSelectedRows();
if(selectedData == "" || selectedData == null){
alert("삭제할 연락처를 선택해주세요.");
return false;
}else{ // 선택한 Row 데이터 삭제하기
if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
// 선택 데이터 삭제
selectedData.forEach(row => row.delete());
totRows = $tableExcel.getRows().length;
$("#excelRowTotCnt").text(totRows);
}
}
});
// 추가버튼
$('#btnAddrMassReg').click(function(){
if($tableExcel.getData().length < 1){
alert("한 개 이상의 연락처를 입력하세요");
return false;
}
// else if (selectedData.length > 20000) {
// alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
// return false;
// }
// tableExcel 그룹의 select 요소들을 확인
var columns = $tableExcel.getColumns();
var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
if (!isAddrPhoneNoSelected) {
alert('휴대폰이 선택되지 않았습니다.');
return false;
}
var addrData = $tableExcel.getData().map((row, index) => ({
name: row.addrNm,
phone: removeDash(row.addrPhoneNo),
rep1: row.addrInfo1,
rep2: row.addrInfo2,
rep3: row.addrInfo3,
rep4: row.addrInfo4,
}));
// 기존 tableL의 데이터를 가져옵니다.
var existingData = tableL.getData();
// 기존 데이터와 새로운 데이터를 합칩니다.
var combinedData = existingData.concat(addrData);
/**
* @ phone을 기준으로 중복 제거 및 갯수 계산
* @ 결과 반환
* return {
* uniqueArray, // 중복 제거된 배열
* uniqueCount, // 중복 제거된 데이터 개수
* duplicateArray, // 중복된 데이터 배열
* duplicateCount: duplicateArray.length // 중복된 데이터 개수
* };
*/
const result = removeDuplicatesAndCount(combinedData, 'phone');
// 총 30만건이 넘으면 false
if (!validateRowLimit(result.uniqueCount)) {
return false;
}
// 6. 수량/가격 계산
setAllCntData(result);
fn_priceClclt();
$('#closeBtn').click();
});
//받는사람 전체삭제 버튼 처리
$('#allDel').click(function(){
var data = $tableExcel.getRows();
$tableExcel.clearData();
$("#excelRowTotCnt").text(0); //총건수 수정
$("#excelRowDupCnt").text(0); //중복건수 수정
$("#excelRowErrorCnt").text(0); //중복건수 수정
dupliPhoneDataRealList.length = 0; // 중복 휴대폰번호 초기화
$tableError.clearData();
// select box 초기화
$('.field-selector').each(function() { $(this).val(''); });
});
//치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행
$('.c3').click(function(){ // 엑셀파일 불러오기 선택 시
$("#excelFileC4").click();
});
});
function excelFileChange(file) {
if (file) {
// 파일 크기 체크 (20MB)
const maxSize = 20 * 1024 * 1024; // 20MB in bytes
if (file.size > maxSize) {
alert('파일 크기는 20MB를 초과할 수 없습니다.');
return;
}
fn_loadAddActive();
var reader = new FileReader();
var extension = file.name.split('.').pop().toLowerCase();
reader.onload = function(e) {
setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함
if (extension === 'xlsx') {
var data = new Uint8Array(e.target.result);
var workbook = XLSX.read(data, {type: 'array'});
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
// 문제 데이터를 확인하는 함수 호출
findInvalidDBCharacters(jsonData);
processExcelData(jsonData);
} else if (extension === 'xls') {
var data = e.target.result;
var workbook = XLSX.read(data, { type: 'binary' });
var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
var jsonData = XLSX.utils.sheet_to_json(firstSheet, { header: 1 });
// 문제 데이터를 확인하는 함수 호출
findInvalidDBCharacters(jsonData);
processExcelData(jsonData);
} else if (extension === 'txt') {
var textData = e.target.result;
processTextData(textData);
} else {
alert('지원되지 않는 파일 형식입니다.');
}
fn_loadRemoveActive();
}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
};
if (extension === 'xlsx') {
reader.readAsArrayBuffer(file);
} else if (extension === 'xls') {
reader.readAsBinaryString(file); // xls 파일에 적절한 read 메서드 호출
} else if (extension === 'txt') {
reader.readAsText(file);
}
}
}
//문제 데이터를 확인하는 함수
function findInvalidDBCharacters(jsonData) {
console.log('DB 입력 값 검사 중...');
const invalidCharPattern = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; // 4바이트 유니코드 문자 (이모지 등)
for (let rowIndex = 0; rowIndex < jsonData.length; rowIndex++) {
const row = jsonData[rowIndex];
if (Array.isArray(row)) {
for (let colIndex = 0; colIndex < row.length; colIndex++) {
const cell = row[colIndex];
if (typeof cell === 'string' && invalidCharPattern.test(cell)) {
console.warn('허용되지 않는 문자: row', rowIndex + 1,', col ', colIndex + 1, ', value:', cell);
// 허용되지 않는 문자를 제거 (선택 사항)
row[colIndex] = cell.replace(invalidCharPattern, '');
console.log('수정된 값:', row[colIndex]);
}
}
}
}
}
// 엑셀 데이터 처리 함수
function processExcelData(data) {
console.log('data : ', data);
let tableData = data.slice(1).map(row => {
return {
addrPhoneNo: row[0], // 필드명을 fn_phoneDupl()에서 사용하는 이름으로!
addrNm: "", // 이름 필드가 없어도 오류 방지용으로 추가
};
});
console.log("변환된 데이터: ", tableData);
// Tabulator에 데이터 설정
$tableExcel.setData(tableData);
// 중복/오류 처리 함수 호출
fn_phoneDupl($tableExcel);
}
/* function processExcelData(data) {
console.log('data : ', data);
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var tableData = [];
var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
console.log('data: ', data);
// 3번째 행부터 입력
data.slice(0).forEach((row, index) => {
var rowData = {};
keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
// console.log('row[idx] : ', row[idx]);
rowData[key] = row[idx] ? row[idx].trim() : ""; // 각 컬럼에 대해 기본값을 설정
rowData[key] = (typeof row[idx] === 'string') ? row[idx].trim() : row[idx];
});
tableData.push(rowData);
});
console.log('tableData :: ', tableData);
updateTable(tableData);
} */
// 텍스트 데이터 처리 함수
function processTextData(text) {
var lines = text.split('\n'); // 각 줄을 배열로 분리
var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var tableData = [];
lines.forEach(line => {
var rowData = {};
var row = line.split(','); // 쉼표로 분리
keys.forEach((key, index) => {
rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
});
tableData.push(rowData);
});
updateTable(tableData);
}
//공통 테이블 업데이트 함수
function updateTable(tableData) {
$tableExcel.setColumns([ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
cell.getRow().toggleSelect();
}
},
{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:60},
{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]}
]);
$tableExcel.setData(tableData).then(() => {
// excelRowTotCnt 업데이트
document.getElementById("excelRowTotCnt").innerText = tableData.length;
});
fn_loadRemoveActive();
}
/*
* 타이틀 select 선택할때마다 실행해서
* 데이터테이블 필드값 수정
*/
function updateTableFields($objTabul) {
var currentData = $objTabul.getData();
var columns = [
{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
cell.getRow().toggleSelect();
}}
,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:60}
];
var fieldMapping = [];
$('.field-selector').each(function(index) {
var selectedField = $(this).val();
// ASCII 문자 코드 사용 - 65=A, 66=B ...
var field = String.fromCharCode(65 + index);
if (selectedField) {
columns.push({
title: field
, field: selectedField
, hozAlign: "center"
, headerHozAlign: "center"
// , editor: "input"
, editor: false
, width: 140
, validator: ["maxLength:100", "string"]
});
fieldMapping.push(selectedField);
} else {
columns.push({
title: field
, field: field
, hozAlign: "center"
, headerHozAlign: "center"
, editor: false
// , editor: "input"
, width: 140
, validator: ["maxLength:100", "string"]
});
fieldMapping.push(field);
}
});
var updatedData = currentData.map(row => {
console.log('row : ', row);
var newRow = {};
fieldMapping.forEach((field, index) => {
newRow[field] = row[Object.keys(row)[index]] ?? "";
});
return newRow;
});
$objTabul.setColumns(columns);
$objTabul.setData(updatedData);
}
/**
* @ 핸드폰 중복 데이터
* */
function fn_phoneDupl($objTabul) {
$tableError.clearData();
var data = $objTabul.getData();
var phoneNumberChk = false;
var existingNumbers = new Set(); // 배열에서 Set으로 변경
let errorCount = 0; // 중복 번호 개수를 저장할 변수
let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
const errors = []; // 오류 데이터를 저장할 배열
const newData = []; // 유효한 데이터만 저장할 새로운 배열
data.forEach((row, index) => {
const number = row.addrPhoneNo;
// number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리
if (!number || (typeof number === 'string' && !number.trim())){
console.log("number : ", number);
return;
}
const formattedNumber = formatPhoneNumber(number); // 번호 표준화
const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
row.addrPhoneNo = formattedNumber;
existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
newData.push(row); // 유효한 데이터만 새로운 배열에 추가
} else {
// 오류: 유효성 통과 못함
errorCount++;
errors.push({
name: row.addrNm, // 이름
phone: row.addrPhoneNo, // 폰번호
result: "오류" // 결과 메시지 추가
});
}
} else {
// 중복
duplicateCount++;
errors.push({
name: row.addrNm, // 이름
phone: row.addrPhoneNo, // 폰번호
result: "중복" // 결과 메시지 추가
});
}
});
// data 배열을 newData 배열로 대체
data = newData;
console.log('data : ', data);
// 수정된 데이터로 테이블 업데이트
$objTabul.setData(data);
// 오류 총 카운트
$("#excelRowTotCnt").text($objTabul.getDataCount());
// 중복 카운트
$("#excelRowDupCnt").text(duplicateCount);
// 에러 카운트
$("#excelRowErrorCnt").text(errorCount);
// popup 영역
$("#errorPopTotCnt").text($objTabul.getDataCount());
// 중복 카운트
$("#errorPopDupCnt").text(duplicateCount);
// 에러 카운트
$("#errorPopErrorCnt").text(errorCount);
$tableError.setData(errors);
if(errorCount > 0){
alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
}
}
function fn_dupliPopupShow(){
$("#tableExcelDupliBtn").show();
}
// 상단 설명 더보기
function popMore(e){
$(e).closest(".pop_more_cont").toggleClass("pop_more_click");
if($(e).closest(".pop_more_cont").is(".pop_more_click")){
$(e).html('숨기기');
$(e).append('<i></i>');
}else {
$(e).html('더보기');
$(e).append('<i></i>');
}
}
// excel 오류정보 테스트
$(document).on('click', '#errorExcelBtn', function() {
if($tableError.getDataCount()<1){
alert('오류 정보가 없습니다.');
return false;
}
$tableError.download("xlsx", "error_data.xlsx");
});
</script>
<!-- 중복전화번호 data-tooltip:addrMassDupli_layer -->
<div class="tooltip-wrap">
<div class="popup-com addrMassDupli_layer" tabindex="0" data-tooltip-con="addrMassDupli_layer" data-focus="addrMassDupli_layer" data-focus-prev="addrMassDupli_layer-close" style="width: 270px; height: 500px;">
<div class="popup_heading">
<p>중복 휴대폰번호</p>
<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" onclick="setAddrDupliClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in" style="padding:20px 0px;" id="addrMassDupli_layer">
</div>
<div class="popup_btn_wrap2" style="margin-top: 0px;">
<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" data-focus-next="addrMassDupli_layer">닫기</button>
</div>
</div>
</div>
<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer adr_detail_result adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 525px;z-index:125;">
<div class="popup_heading">
<p>주소록 상세 결과</p>
<button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in" style="padding:30px 20px;">
<div class="table_top">
<p>
총 <span class="c_e40000" id="errorPopTotCnt">0</span>건
/ 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건
/ 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p>
<button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button>
</div>
<div class="tb_wrap adr_list" id="tabulator_error">
<!-- $tableError 참고 -->
</div>
<ul class="cf_text_ul">
<li>*중복번호는 하나의 번호만 등록됩니다.</li>
<li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li>
<li>ex) 발송불가 특수문자, 자릿수 오류 등</li>
</ul>
<div class="popup_btn_wrap2">
<!-- <button type="button">저장</button> -->
<button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button>
</div>
</div>
</div>
</div>
<!--// 중복전화번호 팝업 -->
<div class="popup_heading">
<p>엑셀 불러오기</p>
<button type="button" class="tooltip-close" id="closeBtn" data-focus="popup07-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in execl_upload_layer" style="padding: 25px 30px;">
<!-- <div class="list_tab_wrap2"> -->
<!-- tab button -->
<!-- <ul class="list_tab" id="tbTabl"> -->
<!-- <li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li> -->
<!-- <li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li> -->
<!-- <li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li> -->
<!-- </ul>// tab button -->
<!-- </div> -->
<!-- 엑셀입력 -->
<div class="popCont current pop_more_cont" id="popCont_1">
<div class="titBox">
<p>- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다. </p>
<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
<p>- 구분선(|), 역슬래시(, ₩), 큰따옴표("), 이모지(이모티콘) 등 발송불가 특수문자는 저장되지 않습니다.</p>
<p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p>
<p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p>
</div>
<div class="pop_more_wrap">
<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
</div>
</div><!--// 엑셀입력 -->
<!-- 공통 -->
<div>
<table class="layer_tType1">
<caption>엑셀입력 표</caption>
<colgroup>
<col style="width: 95px">
<col style="width: auto">
</colgroup>
<tbody>
<tr>
<!-- <th>그룹 선택</th>
<td>
<label for="" class="label">그룹 선택</label>
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
</select>
<label for="" class="label">그룹명 입력</label>
<input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
<input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
</td> -->
<td colspan="2" style="padding:10px 0;">
<div class="file_upload_wrap" style="width:100%;display:flex;">
<div class="file_add upload_area">
<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀파일을 여기에 끌어다 놓으세요</p>
</div>
<input type="file" id="excelFileC4" accept=".xls, .xlsx, .txt" style="display:none"/>
<button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀파일 업로드</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="excel_middle2">
<p>
총 <span class="c_e40000 fwBold" id="excelRowTotCnt">0</span>건
/ 중복 <span class="c_002c9a fwBold" id="excelRowDupCnt">0</span>건
/ 오류 <span class="c_002c9a fwBold" id="excelRowErrorCnt">0</span>건
<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
</p>
<!-- &nbsp; -->
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button> -->
<!-- &nbsp; -->
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
</p>
<!-- <button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
</div>
<!--
<div class="adr_excel" style="margin-top: 13px; overflow-x:auto;">
<div class="adr_excel" style="margin-top: 13px;">
thead
<div class="adr_hd select_adr_hd msg" data-group="tableExcel">
<div style="width: 100px;"></div>
<div style="width: 100px;"></div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 140px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
<div style="width: 125px;">
<label for="" class="label"></label>
<select class="field-selector">
<option value="">선택하기</option>
<option value="addrNm">이름</option>
<option value="addrPhoneNo">휴대폰</option>
<option value="addrInfo1">[*1*]</option>
<option value="addrInfo2">[*2*]</option>
<option value="addrInfo3">[*3*]</option>
<option value="addrInfo4">[*4*]</option>
<option value="addrComment">메모</option>
</select>
</div>
</div>
</div> -->
<div class="drag_drop_wrap callList_includ_box" id="tabulator_excel">
<!-- <img src="/publish/images/content/excel.jpg" style="width: 100%;"> -->
</div>
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div>
<button type="button" id="allDel"><i class="remove_img"></i>전체삭제</button>
<button type="button" id="in_select_del"><i class="remove_img"></i>선택삭제</button>
</div>
</div>
</div><!--// 공통 -->
<!-- 붙여놓기 설명 -->
<!-- <div class="req_area"> -->
<!-- <div class="text_box"> -->
<!-- - 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> -->
<!-- - 휴대폰 번호는 필수입력 항목입니다.<br> -->
<!-- - 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> -->
<!-- - 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> -->
<!-- - '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. -->
<!-- </div> -->
<!-- </div> -->
<div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
<button type="button" id="btnAddrMassReg">추가</button>
<button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup07-close" data-focus-next="popup07">닫기</button>
</div>
</div>

View File

@ -3,6 +3,7 @@
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ 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" %> <%@ page import="itn.com.cmm.LoginVO" %>
<script src="/publish/js/content.js"></script> <script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script> <script src="/publish/js/popupLayer.js"></script>
@ -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();
}
</script> </script>
<input type="button" id="tooltopClick" data-tooltip="rev_popup01" style="display:none;"/>
<div class="list_info"> <div class="list_info">
<input type="hidden" id="tdType" value="${kakaoSentVO.listType}"> <p>총 발송건수 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p> <div>
<div> <p class="cf_text c_e40000">※ 예약 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
<label for="pageUnit" class="label">줄보기 선택</label> <label for="pageUnit" class="label">줄보기 선택</label>
<select id="pageUnit" name="pageUnit" class="selType2"> <select id="pageUnit" name="pageUnit" class="selType2">
<option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option> <option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
<option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option> <option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option>
<option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option> <option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option>
</select> </select>
</div> </div>
</div> </div>
<!-- 전송건별 - groupList - --> <!-- 발송화면 개선 : 카카오톡 테이블 수정 -->
<div class="tb_wrap" id="groupListTable"> <div class="tb_wrap">
<table class="tType4"> <table class="tType4">
<colgroup> <colgroup>
<col style="width: 40px;"> <col style="width: 45px;">
<col style="width: 14%;">
<col style="width: 7%;">
<col style="width: 10%;">
<col style="width: 18%;">
<col style="width: 12%;">
<col style="width: 10%;">
<col style="width: 12%;"> <col style="width: 12%;">
<col style="width: 7%;"> <col style="width: 7%;">
<col style="width: 12%;"> <col style="width: auto;">
<col style="width: 7%;"> <col style="width: 7%;">
<%-- <col style="width: 10%;"> --%> <col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 8%;">
<col style="width: 8%;">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th> <th rowspan="2">
<label for="" class="label">전체 선택</label> <label for="" class="label">전체 선택</label>
<input type="checkbox"> <input type="checkbox">
</th> </th>
<th> <th rowspan="2">발송일시
발송일시
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate"> <input type="button" class="sort sortBtn" id="sort_reqdate">
</div> </div>
</th> </th>
<th> <th rowspan="2">형태
형태
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgType"> <input type="button" class="sort sortBtn" id="sort_orderByCode">
</div> </div>
</th> </th>
<th>내용</th> <th rowspan="2">내용</th>
<th> <th rowspan="2">발송건수
받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>
발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<th>
발송건수
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt"> <input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div> </div>
</th> </th>
<th>카카오톡 결과</th> <th rowspan="2">대기</th>
<th>건수</th> <th colspan="2">카카오톡결과</th>
<th>대체문자 결과</th> <th colspan="2">대체문자결과</th>
<th>건수</th> <th rowspan="2">금액(원)</th>
<!-- <th>금액</th> --> <th rowspan="2">진행상황</th>
</tr> </tr>
<tr>
<th>성공</th>
<th>실패</th>
<th>성공</th>
<th>실패</th>
</tr>
</thead> </thead>
<tbody> <tbody>
<c:if test="${not empty resultAllSentList}"> <c:if test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status"> <c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<tr> <tr>
<td rowspan="2"> <td>
<label for="msgSentDel${status.count}" class="label">선택</label> <label for="msgSentDel${status.count}" class="label">선택</label>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" <input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>>
value="${resultAllSentList.msgGroupId}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>>
</td> </td>
<td rowspan="2"> <td>
<c:choose> <c:choose>
<c:when test="${resultAllSentList.atDelayYn eq 'Y' && resultAllSentList.atDelayCompleteYn eq 'N'}"> <c:when test="${resultAllSentList.atDelayYn eq 'Y' && resultAllSentList.atDelayCompleteYn eq 'N'}">
<c:choose> <c:choose>
@ -165,240 +209,89 @@ $(document).ready(function(){
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</td> </td>
<td rowspan="2"> <td>
<p class="c_222 fwRg"> <c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if> <c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
</p>
</td> </td>
<td rowspan="2"> <td class="result_cont">
<%-- <button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%> <div class="icon_wrap">
<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button> <c:if test="${resultAllSentList.reserveYn eq 'Y'}">
<span class="re">예약</span>
<!-- 예약일때만 분할이 있음 -->
<c:if test="${resultAllSentList.divideYn eq 'Y'}">
<span class="di">분할</span>
</c:if>
</c:if>
<a href="#none" onclick="fn_sentDetailView('${resultAllSentList.msgGroupId}');">
<c:out value="${resultAllSentList.smsTxt}"/>
</a>
</div>
</td>
<td>
<c:out value="${resultAllSentList.msgGroupCnt}"/>
</td> </td>
<td rowspan="2"> <td>
<fmt:formatNumber value="${resultAllSentList.waitCount}" type="number" groupingUsed="true" />
</td>
<td>
<p class="c_002c9a"><fmt:formatNumber value="${resultAllSentList.successCount}" type="number" groupingUsed="true" /></p>
</td>
<td>
<p class="c_e40000"><fmt:formatNumber value="${resultAllSentList.failCount}" type="number" groupingUsed="true" /></p>
</td>
<td>
<p class="c_002c9a"><fmt:formatNumber value="${resultAllSentList.kakaoResendSuccCount}" type="number" groupingUsed="true" /></p>
</td>
<td>
<p class="c_e40000"><fmt:formatNumber value="${resultAllSentList.kakaoResendFailCount}" type="number" groupingUsed="true" /></p>
</td>
<td>
<c:if test="${resultAllSentList.totPrice ne '-'}">
<fmt:formatNumber value="${resultAllSentList.totPrice}" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
</c:if>
<c:if test="${resultAllSentList.totPrice eq '-'}">
-
</c:if>
</td>
<td>
<c:choose> <c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}"> <c:when test="${resultAllSentList.statusCd ne '03' }">
<p> <ec:code codeId="ITN057" code="${resultAllSentList.statusCd }" />
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p> <p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${resultAllSentList.msgGroupId}'); return false;">예약취소</button></p>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</td> </td>
<td rowspan="2"><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
<td rowspan="2"><p><c:out value="${resultAllSentList.msgGroupCnt}"/></p></td>
<td><p class="c_002c9a fwRg">정상수신</p></td>
<td>
<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.successCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.successCount}" pattern="#,###.#"/></p>
</td>
<td><p class="c_002c9a fwRg">정상수신</p></td>
<td>
<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.kakaoResendSuccCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.kakaoResendSuccCount}" pattern="#,###.#"/></p>
</td>
<%-- <td>
<p class="c_002c9a fwRg">
<c:if test="${succPrice > 0}"><fmt:formatNumber value="${succPrice}" pattern="#,###.#"/></c:if>
<c:if test="${succPrice eq 0}">0</c:if>
</p>
</td> --%>
</tr>
<tr>
<td class="c_222"><p>실패/대기</p></td>
<td class="c_222">
<!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
<p <c:if test="${(resultAllSentList.waitCount+resultAllSentList.failCount) > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.failCount}" pattern="#,###"/> / <fmt:formatNumber value="${resultAllSentList.waitCount}" pattern="#,###"/></p>
</td>
<td class="c_222"><p>실패</p></td>
<td class="c_222"><!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
<p <c:if test="${resultAllSentList.kakaoResendFailCount > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.kakaoResendFailCount}" pattern="#,###"/></p></td>
<%--<td class="c_222">
<p>
<c:if test="${(failPrice+waitPrice) > 0}"><fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/></c:if>
<c:if test="${(failPrice+waitPrice) eq 0}">0</c:if>
</p>
</td>--%>
</tr> </tr>
</c:forEach> </c:forEach>
</c:if> </c:if>
<c:if test="${empty resultAllSentList}"> <c:if test="${empty resultAllSentList}">
<tr> <tr>
<td colspan="11">발송 내역이 없습니다.</td> <td colspan="12">발송 내역이 없습니다.</td>
</tr> </tr>
</c:if> </c:if>
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- 전송건별 끝 -->
<!-- 받는사람(개인별) privatevate -->
<div class="tb_wrap" id="privateListTable" style="display:none;">
<table class="tType4">
<colgroup>
<col style="width: 40px;">
<col style="width: 15%;">
<col style="width: 12%;">
<col style="width: 90px;">
<col style="width: 12%;">
<col style="width: 14%;">
<col style="width: 11%;">
<col style="width: 11%;">
</colgroup>
<thead>
<tr>
<th>
<label for="" class="label">전체 선택</label>
<input type="checkbox">
</th>
<th>
발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th>
형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgType">
</div>
</th>
<th>내용</th>
<th>
받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>
발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<th>카카오톡 결과</th>
<th>대체문자 결과</th>
</tr>
</thead>
<tbody>
<c:if test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<tr>
<td>
<label for="msgSentDel${status.count}" class="label">선택</label>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel"
value="${resultAllSentList.msgSeq}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>>
</td>
<td><p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p></td>
<td>
<p class="c_222 fwRg">
<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
</p>
</td>
<td>
<%-- <button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%>
<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button>
<!-- <button class="btnType btnType20" data-tooltip="rev_popup03">상세보기</button> -->
</td>
<td>
<c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}">
<p>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
</td>
<td><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
<td>
<c:choose>
<c:when test="${resultAllSentList.msgResult eq 'S'}">
<p class="c_002c9a fwRg">정상수신</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'W'}">
<p class="fwRg c_19b32b">발송대기</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'F'}">
<p class="fwRg c_e40000">수신오류</p>
</c:when>
<c:otherwise>-</c:otherwise>
</c:choose>
</td>
<td>
<!-- 알림톡 수신오류인 경우, 대체문자 발송 여부에 따라 정상수신/수신오류 표기 -->
<c:choose>
<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'S'}">
<p class="c_002c9a fwRg">정상수신</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'F'}">
<p class="fwRg c_e40000">수신오류</p>
</c:when>
<c:otherwise>-</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty resultAllSentList}">
<tr>
<td colspan="8">발송 내역이 없습니다.</td>
</tr>
</c:if>
</tbody>
</table>
</div>
<!-- 수신자별 끝 -->
<!--// 발송화면 개선 : 카카오톡 테이블 수정 -->
<div class="table_btn clearfix"> <div class="table_btn clearfix">
<div class="table_btn_left"> <div class="table_btn_left">
<!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) --> <button type="button" onclick="javascript:fnDelete(); return false;" class="btnType btnType15"><i class="remove_img"></i>선택삭제</button>
<!-- <button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button> -->
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${kakaoSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${kakaoSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
</div> </div>
<div class="table_btn_right"> <div class="table_btn_right">
<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${kakaoSentVO.listType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button> <button type="button" class="excel_btn btnType"><i class="downroad"></i>발송결과 리스트</button>
<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${kakaoSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
</div> </div>
</div> </div>
<c:if test="${!empty resultAllSentList}"> <c:if test="${!empty resultAllSentList}">
<ul class="pagination"> <ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" /> <ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul> </ul>
</c:if> </c:if>
<form id="resCancelForm" name="resCancelForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
</form>

View File

@ -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" %>
<script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript">
$(document).ready(function(){
/* 목록 정렬 항목 아이콘 표시 */
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);
}
//체크박스 전체 선택 및 해제
var allChkSts = false;
$("#allCheck").click(function(){
if(!allChkSts){// 전체선택이 해제되어 있을 경우
$("input[name=msgSentDel]").prop("checked", true);
allChkSts = true;
//발송 대기건은 선택 삭제가 안되도록 처리함
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
$(this).prop("checked", false);
}
});
}else{
$("input[name=msgSentDel]").prop("checked", false);
allChkSts = false;
}
});
if($("#tdType").val() == "groupList" || $("#tdType").val() == ""){
$("#privateListTable").hide();
$("#groupListTable").show();
}else{
$("#privateListTable").show();
$("#groupListTable").hide();
}
});
</script>
<input type="button" id="tooltopClick" data-tooltip="rev_popup01" style="display:none;"/>
<div class="list_info">
<input type="hidden" id="tdType" value="${kakaoSentVO.listType}">
<p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<div>
<label for="pageUnit" class="label">줄보기 선택</label>
<select id="pageUnit" name="pageUnit" class="selType2">
<option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
<option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option>
<option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option>
</select>
</div>
</div>
<!-- 전송건별 - groupList - -->
<div class="tb_wrap" id="groupListTable">
<table class="tType4">
<colgroup>
<col style="width: 40px;">
<col style="width: 14%;">
<col style="width: 7%;">
<col style="width: 10%;">
<col style="width: 18%;">
<col style="width: 12%;">
<col style="width: 10%;">
<col style="width: 12%;">
<col style="width: 7%;">
<col style="width: 12%;">
<col style="width: 7%;">
<%-- <col style="width: 10%;"> --%>
</colgroup>
<thead>
<tr>
<th>
<label for="" class="label">전체 선택</label>
<input type="checkbox">
</th>
<th>
발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th>
형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgType">
</div>
</th>
<th>내용</th>
<th>
받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>
발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<th>
발송건수
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div>
</th>
<th>카카오톡 결과</th>
<th>건수</th>
<th>대체문자 결과</th>
<th>건수</th>
<!-- <th>금액</th> -->
</tr>
</thead>
<tbody>
<c:if test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<tr>
<td rowspan="2">
<label for="msgSentDel${status.count}" class="label">선택</label>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel"
value="${resultAllSentList.msgGroupId}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>>
</td>
<td rowspan="2">
<c:choose>
<c:when test="${resultAllSentList.atDelayYn eq 'Y' && resultAllSentList.atDelayCompleteYn eq 'N'}">
<c:choose>
<c:when test="${resultAllSentList.curState eq '0'}">
<%--
20240906 추가
발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다.
30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌
--%>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.atDelayOrgTime}" /></p>
</c:when>
<c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
</c:otherwise>
</c:choose>
</td>
<td rowspan="2">
<p class="c_222 fwRg">
<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
</p>
</td>
<td rowspan="2">
<%-- <button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%>
<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button>
</td>
<td rowspan="2">
<c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}">
<p>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
<%-- <p>${resultAllSentList.msgGroupId}</p> --%>
</td>
<td rowspan="2"><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
<td rowspan="2"><p><c:out value="${resultAllSentList.msgGroupCnt}"/></p></td>
<td><p class="c_002c9a fwRg">정상수신</p></td>
<td>
<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.successCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.successCount}" pattern="#,###.#"/></p>
</td>
<td><p class="c_002c9a fwRg">정상수신</p></td>
<td>
<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.kakaoResendSuccCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.kakaoResendSuccCount}" pattern="#,###.#"/></p>
</td>
<%-- <td>
<p class="c_002c9a fwRg">
<c:if test="${succPrice > 0}"><fmt:formatNumber value="${succPrice}" pattern="#,###.#"/></c:if>
<c:if test="${succPrice eq 0}">0</c:if>
</p>
</td> --%>
</tr>
<tr>
<td class="c_222"><p>실패/대기</p></td>
<td class="c_222">
<!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
<p <c:if test="${(resultAllSentList.waitCount+resultAllSentList.failCount) > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.failCount}" pattern="#,###"/> / <fmt:formatNumber value="${resultAllSentList.waitCount}" pattern="#,###"/></p>
</td>
<td class="c_222"><p>실패</p></td>
<td class="c_222"><!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
<p <c:if test="${resultAllSentList.kakaoResendFailCount > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
<fmt:formatNumber value="${resultAllSentList.kakaoResendFailCount}" pattern="#,###"/></p></td>
<%--<td class="c_222">
<p>
<c:if test="${(failPrice+waitPrice) > 0}"><fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/></c:if>
<c:if test="${(failPrice+waitPrice) eq 0}">0</c:if>
</p>
</td>--%>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty resultAllSentList}">
<tr>
<td colspan="11">발송 내역이 없습니다.</td>
</tr>
</c:if>
</tbody>
</table>
</div>
<!-- 전송건별 끝 -->
<!-- 받는사람(개인별) privatevate -->
<div class="tb_wrap" id="privateListTable" style="display:none;">
<table class="tType4">
<colgroup>
<col style="width: 40px;">
<col style="width: 15%;">
<col style="width: 12%;">
<col style="width: 90px;">
<col style="width: 12%;">
<col style="width: 14%;">
<col style="width: 11%;">
<col style="width: 11%;">
</colgroup>
<thead>
<tr>
<th>
<label for="" class="label">전체 선택</label>
<input type="checkbox">
</th>
<th>
발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th>
형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgType">
</div>
</th>
<th>내용</th>
<th>
받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>
발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<th>카카오톡 결과</th>
<th>대체문자 결과</th>
</tr>
</thead>
<tbody>
<c:if test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<tr>
<td>
<label for="msgSentDel${status.count}" class="label">선택</label>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel"
value="${resultAllSentList.msgSeq}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>>
</td>
<td><p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p></td>
<td>
<p class="c_222 fwRg">
<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
</p>
</td>
<td>
<%-- <button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%>
<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button>
<!-- <button class="btnType btnType20" data-tooltip="rev_popup03">상세보기</button> -->
</td>
<td>
<c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}">
<p>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
</td>
<td><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
<td>
<c:choose>
<c:when test="${resultAllSentList.msgResult eq 'S'}">
<p class="c_002c9a fwRg">정상수신</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'W'}">
<p class="fwRg c_19b32b">발송대기</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'F'}">
<p class="fwRg c_e40000">수신오류</p>
</c:when>
<c:otherwise>-</c:otherwise>
</c:choose>
</td>
<td>
<!-- 알림톡 수신오류인 경우, 대체문자 발송 여부에 따라 정상수신/수신오류 표기 -->
<c:choose>
<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'S'}">
<p class="c_002c9a fwRg">정상수신</p>
</c:when>
<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'F'}">
<p class="fwRg c_e40000">수신오류</p>
</c:when>
<c:otherwise>-</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty resultAllSentList}">
<tr>
<td colspan="8">발송 내역이 없습니다.</td>
</tr>
</c:if>
</tbody>
</table>
</div>
<!-- 수신자별 끝 -->
<div class="table_btn clearfix">
<div class="table_btn_left">
<!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) -->
<!-- <button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button> -->
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${kakaoSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${kakaoSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
</div>
<div class="table_btn_right">
<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${kakaoSentVO.listType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button>
<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${kakaoSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
</div>
</div>
<c:if test="${!empty resultAllSentList}">
<ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul>
</c:if>

View File

@ -5,111 +5,112 @@
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<% pageContext.setAttribute("newLineChar", "\n"); %> <% pageContext.setAttribute("newLineChar", "\n"); %>
<div class="list_tab_wrap2 kakao_rev_tab"> <div class="phone">
<!-- tab button --> <!-- 탭스타일 -->
<ul class="list_tab"> <div class="list_tab_wrap2 type5">
<li class="tab active"><button type="button" onclick="popupTab(this,'1');" id="atBtn">카카오톡</button></li> <ul class="tabType3" id="tabType" name="tabType">
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}"> <li class="tab active"><button type="button" onclick="phoneTab(this,'1');" title="선택됨">카카오톡</button></li>
<li class="tab"><button type="button" onclick="popupTab(this,'2');">대체문자</button></li> <c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
</c:if> <li class="tab"><button type="button" onclick="phoneTab(this,'2');">대체문자</button></li>
</ul><!--// tab button --> </c:if>
</div> </ul>
</div>
<!--// 탭스타일 -->
<div class="popCont current kakao_wrap" id="popCont_1"> <!-- 카카오 알림톡 미리보기 -->
<div class="rev_pop_in"> <div class="tab_phone current" id="tab_phone_1">
<div class="rev_pop_middle clearfix"> <div class="phone_kakako">
<span><c:out value="${resultMsgDetail.reqDate }" /></span> <div class="phoneIn">
<span class="msg_com msg_allimtalk"> <p class="prev_p"><img src="/publish/images/content/kakao_prev_icon.png" alt=""><c:out value="${resultMsgDetail.yellowId}"/></p>
<c:choose> <!-- 텍스트 미리보기 -->
<c:when test="${msgType eq '8'}"> <div class="text_preview">
알림톡 <div class="allimtalk_title">
</c:when> <img src="/publish/images/content/icon_allimtalk.png" alt="">
<c:when test="${msgType eq '9'}"> <c:choose>
친구톡 <c:when test="${msgType eq '8'}">알림톡 도착</c:when>
</c:when> <c:when test="${msgType eq '9'}">친구톡 도착</c:when>
<c:otherwise> </c:choose>
</c:otherwise> </div>
</c:choose> <div class="allimtalk_content">
</span> <c:choose>
</div> <c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
<div class="rev_pop_txt"> <p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
<div class="text_preview"> <p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
<div class="allimtalk_title"> </c:when>
<img src="/publish/images/content/icon_allimtalk.png" alt=""> <c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
<c:choose> <div class="kakao_image">
<c:when test="${msgType eq '8'}"> <img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
알림톡 도착 </div>
</c:when> </c:when>
<c:when test="${msgType eq '9'}"> </c:choose>
친구톡 도착
</c:when> <p class="template_text">
<c:otherwise> <c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
</c:otherwise> </p>
</c:choose>
</div> <c:choose>
<div class="allimtalk_content"> <c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
<!-- 강조 텍스트 --> <p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
<!-- 강조 텍스트 --> </c:when>
<c:choose> <c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}"> <p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p> </c:when>
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p> </c:choose>
</c:when>
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}"> <c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
<div class="kakao_image"> <c:choose>
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt=""> <c:when test="${templatInfoButtonList.name eq '채널 추가'}">
</div> <button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
</c:otherwise> <button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
</c:choose> </c:otherwise>
</c:choose>
<!-- 알림톡 내용 표시 --> </c:forEach>
<p class="template_text"> </div>
<!-- 내용 --> </div>
<!-- 내용 --> </div>
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/> <p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
</p> </div>
</div>
<!-- 부가정보 내용 --> <!--// 카카오 알림톡 미리보기 -->
<c:choose>
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}"> <!-- 문자 미리보기 -->
<!-- 부가정보형인 경우 부가정보 내용 표시 --> <div class="tab_phone" id="tab_phone_2">
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p> <div class="phoneIn">
</c:when> <div>
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}"> <p class="prev_p"><img src="/publish/images/search.png"> 문자내용</p>
<!-- 채널 추가형인경우 채널 추가 메세지 표시 --> <div class="text_length2 clearfix">
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p> <c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
</c:when> <c:choose>
<c:otherwise> <c:when test="${resultMsgDetail.bizKakaoResendTypeCnt > 1}">
</c:otherwise> <span class="msg_com msg_short">단문</span>
</c:choose> <span class="msg_com msg_long">장문</span>
</c:when>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 --> <c:when test="${resultMsgDetail.bizKakaoResendTypeCnt < 2
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status"> && resultMsgDetail.bizKakaoResendType eq 'SMS'}">
<c:choose> <span class="msg_com msg_short">단문</span>
<c:when test="${templatInfoButtonList.name eq '채널 추가'}"> </c:when>
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button> <c:otherwise>
</c:when> <span class="msg_com msg_long">장문</span>
<c:otherwise> </c:otherwise>
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button> </c:choose>
</c:otherwise> </c:if>
</c:choose> <div>
</c:forEach> <span>글자크기</span>
</div> <button type="button" onclick="changeFontSize('plus');"><img src="/publish/images/content/font_plus.png"></button>
</div> <button type="button" onclick="changeFontSize('minus');"><img src="/publish/images/content/font_minus.png"></button>
</div>
</div>
</div>
<div class="popCont replace_send_popup" id="popCont_2">
<div class="rev_pop_in">
<div class="rev_pop_middle clearfix">
<span><c:out value="${resultMsgDetail.sentDate }" /></span>
<span class="msg_com msg_allimtalk">대체문자</span>
</div>
<div class="rev_pop_txt">
${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}
</div>
</div> </div>
</div> </div>
<div class="text_preview">
<div class="preview_auto">
<p class="realtime">${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}</p>
</div>
</div>
</div>
</div>
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
</div>
<!--// 문자 미리보기 -->
</div>

View File

@ -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"); %>
<div class="list_tab_wrap2 kakao_rev_tab">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="popupTab(this,'1');" id="atBtn">카카오톡</button></li>
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
<li class="tab"><button type="button" onclick="popupTab(this,'2');">대체문자</button></li>
</c:if>
</ul><!--// tab button -->
</div>
<div class="popCont current kakao_wrap" id="popCont_1">
<div class="rev_pop_in">
<div class="rev_pop_middle clearfix">
<span><c:out value="${resultMsgDetail.reqDate }" /></span>
<span class="msg_com msg_allimtalk">
<c:choose>
<c:when test="${msgType eq '8'}">
알림톡
</c:when>
<c:when test="${msgType eq '9'}">
친구톡
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
</span>
</div>
<div class="rev_pop_txt">
<div class="text_preview">
<div class="allimtalk_title">
<img src="/publish/images/content/icon_allimtalk.png" alt="">
<c:choose>
<c:when test="${msgType eq '8'}">
알림톡 도착
</c:when>
<c:when test="${msgType eq '9'}">
친구톡 도착
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
</div>
<div class="allimtalk_content">
<!-- 강조 텍스트 -->
<!-- 강조 텍스트 -->
<c:choose>
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'TEXT'}">
<p class="emphasis_side_text"><c:out value="${kakaoTemplateInfo.templateSubtitle}"/></p>
<p class="emphasis_title_text"><c:out value="${kakaoTemplateInfo.templateTitle}"/></p>
</c:when>
<c:when test="${kakaoTemplateInfo.templateEmphasizeType eq 'IMAGE'}">
<div class="kakao_image">
<img src="<c:url value='${kakaoTemplateInfo.templateImageUrl}'/>" alt="">
</div>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<!-- 알림톡 내용 표시 -->
<p class="template_text">
<!-- 내용 -->
<!-- 내용 -->
<c:out value="${fn:replace(fn:replace(kakaoTemplateInfo.templateContent, newLineChar, '<br/>'), newLineChar2, '<br/>')}" escapeXml="false"/>
</p>
<!-- 부가정보 내용 -->
<c:choose>
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'EX'}">
<!-- 부가정보형인 경우 부가정보 내용 표시 -->
<p class="side_info_text"><c:out value="${kakaoTemplateInfo.templateExtra}"/></p>
</c:when>
<c:when test="${kakaoTemplateInfo.templateMessageType eq 'AD'}">
<!-- 채널 추가형인경우 채널 추가 메세지 표시 -->
<p class="channel_info_text"><c:out value="${kakaoTemplateInfo.templateAd}"/></p>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<!-- 채널 추가형을 선택한 경우 자동으로 버튼이 하나 추가됨, 버튼을 추가한 경우 버튼 정보 표시 -->
<c:forEach var="templatInfoButtonList" items="${kakaoTemplateInfo.buttonList}" varStatus="status">
<c:choose>
<c:when test="${templatInfoButtonList.name eq '채널 추가'}">
<button type="button" class="btn_kakao_channel"><img src="/publish/images/content/icon_kakao_channel_plus.png" alt=""> 채널추가</button>
</c:when>
<c:otherwise>
<button type="button" class="btn_kakao_type"><c:out value="${templatInfoButtonList.name}"/></button>
</c:otherwise>
</c:choose>
</c:forEach>
</div>
</div>
</div>
</div>
</div>
<div class="popCont replace_send_popup" id="popCont_2">
<div class="rev_pop_in">
<div class="rev_pop_middle clearfix">
<span><c:out value="${resultMsgDetail.sentDate }" /></span>
<span class="msg_com msg_allimtalk">대체문자</span>
</div>
<div class="rev_pop_txt">
${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}
</div>
</div>
</div>

View File

@ -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"); %>
<style>
/* Tabulator Placeholder 기본 스타일 유지 */
.tabulator-placeholder {
font-size: 22px !important; /* 기존 폰트 크기 유지 */
color: #e2d6d6 !important; /* 기존 색상 유지 */
font-weight: normal !important; /* 기본 폰트 두께 유지 */
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
</style>
<script type="text/javascript">
var currentSearchKeyword = ""; // 검색어 저장
var currentTabFilter = "전체"; // 현재 선택된 탭 (기본값: 전체)
var $tbDtailList = null; //에러 팝업 영역
$(document).ready(function(){
//발송 미리보기 영역
previewPhone();
// 탭별 하위 버튼 활성화
fn_rowBtnSH('전체');
// 주소록 그룹 불러오기
getAddrGroupList();
//Tabulator AJAX Data Loading
$tbDtailList = new Tabulator("#detailPopup", {
height: "255px",
width: "20%",
// layout: "fitDataStretch", // 데이터가 너비에 맞게 늘어나도록 설정
layout: "fitColumns", // fitDataStretch 대신 fitColumns 사용
autoColumns: false,
headerHozAlign: "center",
validationMode: "highlight",
clipboard: false,
clipboardCopySelector: "table",
clipboardPasteAction: "insert", // insert, update, replace
placeholder:"데이터를 불러오고 있습니다...",
columns: [
{
title: "휴대폰",
field: "phone",
hozAlign: "center",
headerHozAlign: "center",
widthGrow: 1
},
{
title: "상세결과",
field: "result",
hozAlign: "center",
headerHozAlign: "center",
widthGrow: 1
}
]
});
fn_getDetailList();
$('#goPageBtn').click(function(){
$("#goList").submit();
});
// 탭 버튼 클릭 이벤트
$(".type4 .tabType3 .tab button").on("click", function () {
// 모든 탭의 active 클래스 제거
$(".type4 .tabType3 .tab").removeClass("active");
// 클릭한 버튼의 부모 요소(li)에 active 클래스 추가
$(this).parent().addClass("active");
// 기존 버튼들의 title 속성 초기화
$(".type4 .tabType3 .tab button").removeAttr("title");
// 선택된 버튼의 title 속성을 "선택됨"으로 변경
$(this).attr("title", "선택됨");
// 검색어 초기화
$("#searchInput").val("");
// 필터 적용 (검색 필터 없이 탭 기준으로만 적용)
fn_applyFilters();
});
// 검색 버튼 클릭 시 실행
$("#searchBtn").on("click", function () {
fn_search();
});
// 실시간 검색 및 Enter 키 이벤트 처리
$("#searchInput").on("keyup", function (event) {
let keyword = $(this).val().trim();
if (keyword.length > 2) {
console.log("keyword :: ", keyword);
fn_applyFilters({ field: "phone", type: "like", value: keyword });
} else {
fn_applyFilters(null);
}
// Enter 키 입력 시 검색 실행
if (event.key === "Enter") {
fn_search();
}
});
$('.listClose').on("click", function (){
tooltipInit();
});
$('.grpClose').on("click", function (){
$('#grpNm').val('')
});
$(document).on('change', '#addrGrpIdInfo', function() {
if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
$("#grpNm").val(""); // 새그룹명 Clear;
}
});
});
// window.onload = function(){
// setTimeout(() => {
// //발송 미리보기 영역
// previewPhone();
// }, 100000); // 필터 적용 후 반영되도록 약간의 딜레이 추가
// }
//검색 실행 함수
function fn_search() {
let keyword = $("#searchInput").val().trim();
if (keyword.length < 3) {
alert("검색어를 3자 이상 입력해주세요.");
return;
}
fn_applyFilters({ field: "phone", type: "like", value: keyword });
}
/**
* @Discription : 튤팁 닫을 때 팝업 초기화
*/
function tooltipInit(){
$tbDtailList.clearFilter();
$("#searchInput").val('');
$("#initTab").click();
}
/**
* @Discription : 상세결과 팝업 내용 가져오는 로직
*/
function fn_getDetailList(){
var params = {
"msgGroupId" : $('#msgGroupId').val()
}
$.ajax({
type: "POST",
url: "/web/mjon/msgsent/findByMsgDetailListAjax.do",
data: params,
dataType:'json',
async: true,
success: function (returnData) {
console.log('returnData : ', returnData);
if(returnData.status == 'OK'){
fn_setData(returnData.object);
}
},
error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); }
});
}
/**
* @Description: 데이터 설정
*/
function fn_setData(data){
// console.log('data : ', data);
// $tbDtailList.clearData();
const resultData = []; // 오류 데이터를 저장할 배열
data.forEach((row, index) => {
resultData.push({
// addrNm: row.addrNm, // 폰번호
phone: row.callTo, // 폰번호
result: row.statusTxt // 결과 메시지 추가
});
});
// 오류 및 중복 데이터를 한 번에 추가
$tbDtailList.setData(resultData);
};
/**
* @Discription : 필터 적용
*/
function fn_applyFilters(newFilter) {
console.log("newFilter :: ", newFilter);
// 현재 적용된 모든 필터 가져오기
let filters = [];
// 현재 선택된 탭 값 가져오기
let selectedTab = $(".type4 .tabType3 .tab.active button").text().trim();
// 탭 필터 적용 (탭이 "전체"가 아닐 경우)
if (selectedTab !== "전체") {
filters.push({ field: "result", type: "like", value: selectedTab });
}
// 검색어가 입력된 경우 검색 필터 추가
if (newFilter && newFilter.value) {
filters.push(newFilter);
}
// 필터 적용
$tbDtailList.setFilter(filters);
// Placeholder 업데이트
fn_setPlaceholder("검색 결과가 없습니다.");
// 툽팁 하위 버튼 삭제
fn_rowBtnSH(selectedTab);
}
/**
* @Description: 타블레이서 설명 수정
*/
function fn_setPlaceholder(msg){
// 검색 후 데이터가 있는지 확인 후 placeholder 변경
setTimeout(() => {
console.log("$tbDtailList.getRows('active').length :: ", $tbDtailList.getRows('active').length);
let filteredRows = $tbDtailList.getRows('active').length; // 필터링된 행 개수 가져오기
if (filteredRows === 0) {
// 기존 데이터 유지하면서 빈 데이터 추가하여 placeholder 변경
$(".tabulator-placeholder").text(msg); // placeholder 메시지 변경
}
}, 300); // 필터 적용 후 반영되도록 약간의 딜레이 추가
}
/**
* @Description: 필터링된 데이터만 다운로드
*/
function fn_downloadFilteredExcel() {
// 현재 날짜 및 시간 가져오기 (YYYYMMDD_HHMMSS 형식)
let now = new Date();
let timestamp = now.getFullYear() +
("0" + (now.getMonth() + 1)).slice(-2) +
("0" + now.getDate()).slice(-2) + "_" +
("0" + now.getHours()).slice(-2) +
("0" + now.getMinutes()).slice(-2) +
("0" + now.getSeconds()).slice(-2);
// 파일명 생성
let fileName = "filtered_data_" + timestamp + ".xlsx";
// 필터링된 데이터 가져오기
let filteredData = getFilteredDataByTab();
if (filteredData.length === 0) {
alert("다운로드할 데이터가 없습니다.");
return;
}
// console.log("엑셀 다운로드 - 필터링된 데이터:", filteredData);
// 컬럼명(타이틀) 설정 (배열 형태로 변환)
let headers = [["휴대폰", "상세결과"]];
console.log(filteredData); // 데이터 확인
console.log(filteredData[0]); // 첫 번째 데이터 확인 (객체 키값 체크)
// 필터링된 데이터 배열로 변환
let formattedData = filteredData.map(item => [item.phone, item.result]);
// 타이틀 행 추가
formattedData.unshift(headers[0]);
// 엑셀 생성
let workbook = XLSX.utils.book_new();
let worksheet = XLSX.utils.aoa_to_sheet(formattedData); // `aoa_to_sheet` 사용
XLSX.utils.book_append_sheet(workbook, worksheet, "Filtered Data");
// 엑셀 파일 다운로드
XLSX.writeFile(workbook, fileName);
}
/**
* @ 예약 취소
*/
function fnReservCancel(msgGroupId){
var form = document.resCancelForm;
var loginVO = '${LoginVO}';
form.msgGroupId.value = msgGroupId;
if(loginVO == "" || loginVO == null){
alert("로그인 후 이용이 가능합니다.");
return false;
}
console.log('msgGroupId : ', msgGroupId);
var data = new FormData(form);
url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do";
if(confirm("정말 예약을 취소하시겠습니까?")){
$.ajax({
type: "POST",
url: url,
data: data,
dataType:'json',
async: true,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if("fail"==returnData.result){
alert(returnData.message);
return false;
}
alert("예약 발송이 정상적으로 취소 되었습니다.");
location.reload(true);
} else if(status== 'fail'){
alert(returnData.message);
}
},
error: function (e) {
alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e);
},
beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
},
complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
});
}
}
/**
* @알림톡 재전송
*/
function fnMjMsgReSendAll() {
var form = document.reSendAllForm;
if (!confirm("알림톡 발송 화면으로 이동합니다.")) {
return;
}
// msgKind에 따른 action 설정
form.action = "/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do";
form.submit();
}
function fn_rowBtnSH(tabText){
var $addReg = $('#addReg');
var $addRemove = $('#addRemove');
// addReg 주소록 등록
// addRemove 주소록 삭제
if(tabText == '전체'
|| tabText == '성공'){
$addReg.show();
$addRemove.hide();
}else if(tabText == '대기'){
$addReg.hide();
$addRemove.hide();
}else if(tabText == '실패' ){
$addReg.hide();
$addRemove.show();
}
}
function fnAddAddrNo(){
let url = "/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do";
console.log($("#addrGrpIdInfo option:selected").val());
console.log($("#grpNm").val());
if ($("#addrGrpIdInfo option:selected").val() == "NEW"
&& $("#grpNm").val() == "") {
alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
return false;
}
// 필터링된 데이터 가져오기 (탭 필터 적용)
let filteredData = getFilteredDataByTab();
console.log('filteredData : ', filteredData)
// phone 필드 데이터만 추출
let addrPhones = filteredData.map(row => row.phone);
// console.log('addrPhones : ', addrPhones)
if(addrPhones.length < 1){
alert('해당 탭에 데이터가 없습니다.');
return false;
}
// 주소록 그룹명 가져오기
let addrGrpNm = $('#grpNm').val();
let addrGrpId = $("#addrGrpIdInfo option:selected").val();
// 데이터 객체 생성
let data = {
addrPhones : addrPhones
, addrGrpNm : addrGrpNm
, addrGrpId : addrGrpId
};
if(!confirm("연락처 정보를 주소록에 등록 하시겠습니까?")){
return false;
}
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json",
async: false,
processData: false,
success: function(data) {
if(data.status == 'BAD_REQUEST'){
alert(data.message);
return false;
}
// 성공 메세지
alert(data.message);
// 그룹등록 팝업 닫기
$('.grpClose').click();
},
error: function(error) {
alert("오류가 발생하였습니다.")
console.error("에러 발생:", error);
}
});
}
function fnDelAddrNo(){
let url = "/web/mjon/addr/deleteAddrNoDataAjax.do";
// 필터링된 데이터 가져오기 (탭 필터 적용)
let filteredData = getFilteredDataByTab();
// phone 필드 데이터만 추출
let addrPhones = filteredData.map(row => row.phone);
console.log('addrPhones : ', addrPhones)
if(addrPhones.length < 1){
alert('주소록에 살제할 연락처가 없습니다.');
return false;
}
// 데이터 객체 생성
let data = {
addrPhones: addrPhones
};
let selectedTab = $(".type4 .tabType3 .tab.active button").text().trim();
if(!confirm("발송"+selectedTab+" 번호를 주소록에서 삭제하시겠습니까?\n(모든 주소록 그룹에서 삭제)")){
return false;
}
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
dataType: "json",
contentType: "application/json",
async: false,
processData: false,
success: function(data) {
if(data.status == 'BAD_REQUEST'){
alert(data.message);
return false;
}
// 성공 메세지
alert(data.message);
},
error: function(error) {
alert("오류가 발생하였습니다.")
console.error("에러 발생:", error);
}
});
}
/**
* @description 현재 선택된 탭(`result` 필터) 기준으로 데이터를 필터링
* @returns {Array} 필터링된 데이터 리스트
*/
// function getFilteredDataByTab() {
// // 현재 적용된 모든 필터 가져오기
// let filters = $tbDtailList.getFilters();
// // 현재 모든 데이터 가져오기 (전체 데이터에서 필터 적용)
// let allData = $tbDtailList.getData();
// // 현재 적용된 필터에서 "result" 필터만 찾기
// let tabFilter = filters.find(filter => filter.field === "result");
// // 탭 필터 적용하여 데이터 필터링 (수신번호 필터는 무시)
// return allData.filter(row => tabFilter ? row.result.includes(tabFilter.value) : true);
// }
function getFilteredDataByTab() {
// 현재 표시된(필터링된) 행들을 가져오기
let filteredRows = $tbDtailList.getRows('active');
// 행의 데이터를 배열로 반환
return filteredRows.map(row => row.getData());
}
//주소록 그룹정보 불러오기
function getAddrGroupList() {
$.ajax({
type : "POST",
async : false,
url : "/web/mjon/addr/addrGroupListAjax.do",
data : {},
dataType:'json',
success : function(data) {
//alert(JSON.stringify(data.addrGroupList));
// Show Html
getAddrGroupListShow(data.addrGroupList);
},
error : function(xhr, status, error) {
alert(error);
return false;
}
});
}
//Show Html
function getAddrGroupListShow(jsonList) {
var sHtml = "";
sHtml += "<option value='NEW'>그룹추가</option>";
sHtml += "<option value='0'>그룹미지정</option>";
sHtml += "<option value='bookmark'>자주보내는 번호</option>";
for (var j = 0; j < jsonList.length; j++) {
sHtml += " <option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
}
$("#addrGrpIdInfo").html(sHtml);
}
function previewPhone(){
$("#previewPhone").load("/web/kakao/sent/selectKakaoSentDetailViewPhoneAjax.do", $(document.resPopForm).serialize() ,function(response, status, xhr){
if (status === 'success') {
$(this).html(response);
}
});
}
</script>
<div class="inner">
<input id="msgGroupId" type="hidden" value="${result.msgGroupId}"/>
<!-- send top -->
<div class="send_top">
<!-- 결제관리 - 요금 사용내역 -->
<div class="rev_admin_cont serv_content current">
<div class="heading">
<h2>발송결과 상세</h2>
<button type="button" class="button junk" data-tooltip="popupJunk" style="right:0;">통신사 스팸규격안내</button>
</div>
<!-- 발송결과 상세 및 미리보기-->
<div class="send_general">
<!-- 발송결과 상세 정보 -->
<div class="resultcont_left">
<!--발송정보-->
<div class="res_info">
<div class="res_info_in">
<div class="res_info_top clearfix">
<p>발송정보</p>
<p><button type="button" class="btnType btnType3" onclick="fnMjMsgReSendAll();">재전송</button></p>
</div>
<div class="res_info_btm">
<dl>
<dt>발송일시</dt>
<dd>${result.reqDate}</dd>
</dl>
<c:if test="${result.reserveYn eq 'Y' }">
<dl><!-- 예약 시 -->
<dt>등록일시</dt>
<dd>${result.regDate}</dd>
</dl>
</c:if>
<dl>
<dt>형태</dt>
<dd>
<c:if test="${result.msgType eq '8'}">알림톡</c:if>
<c:if test="${result.msgType eq '9'}">친구톡</c:if>
</dd>
</dl>
<dl>
<dt>발송건수</dt>
<dd><span class="c_222"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</dd>
</dl>
<dl>
<dt>채널정보</dt>
<dd><c:out value="${result.yellowId}"/></dd>
</dl>
<dl>
<dt>진행상황
<!-- 예약인 경우 -->
<c:if test="${result.reserveYn eq 'Y'}">
<div class="icon_wrap">
<div class="re">예약</div>
<!-- 예약일때만 분할이 있음 -->
<c:if test="${result.divideYn eq 'Y'}">
<div class="di_info">
<button class="di">분할</button>
<div class="di_hover_layer">
<strong>${result.divideText }</strong>
</div>
</div>
</c:if>
</div>
</c:if>
<!--// 예약인 경우 -->
</dt>
<dd>
<c:choose>
<c:when test="${result.statusCd eq '04' }">
예약취소(<c:out value="${result.canceldate }" />)
</c:when>
<c:when test="${result.statusCd ne '03' }">
<ec:code codeId="ITN057" code="${result.statusCd }" />
</c:when>
<c:otherwise>
<p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${result.msgGroupId}'); return false;">예약취소</button></p>
</c:otherwise>
</c:choose>
</dd>
</dl>
</div>
<div class="res_info_btm">
<dl>
<dt class="btm_charge">발송요금(합계)</dt>
<dd><span class="stcharge">
<c:if test="${result.totPrice ne '-'}">
<fmt:formatNumber value="${result.totPrice}" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
</c:if>
<c:if test="${result.totPrice eq '-'}">
0
</c:if>
</span>원</dd>
<!--<dd><span class="stcharge">-</span>원</dd>--><!-- 예역취소 후 금액은 하이픈 처리-->
</dl>
<div class="charge_line">
<dl>
<dt class="charge_title">· 카카오톡</dt>
<dd><span class="c_222">
<fmt:formatNumber value="${result.successPrice}" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
</span>원</dd>
</dl>
<dl>
<dt class="charge_title">· 대체문자</dt>
<dd><span class="c_222">
<fmt:formatNumber value="${result.kakaoResendSuccPrice}" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
</span>원</dd>
</dl>
</div>
</div>
</div>
</div>
<!--// 발송정보-->
<!--상세결과-->
<div class="res_info">
<div class="res_info_in">
<div class="res_info_top clearfix" style="padding:0 0 10px 0;">
<p>상세결과</p>
<p></p>
</div>
<div class="res_num">
<div class="res_info_btm1">
<dl>
<dt>전체건수</dt>
<dd><a href="#" data-tooltip="rev_popup04"><span class="c_222_g"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</a></dd>
</dl>
</div>
<div class="res_info_btm1">
<dl>
<dt>성공건수</dt>
<dd><span class="c_002c9a_g"><fmt:formatNumber value="${result.successCount}" type="number" groupingUsed="true" /></span>건(${result.successPct})</dd>
</dl>
</div>
</div>
<div class="res_num">
<div class="res_info_btm1">
<dl>
<dt>대기건수</dt>
<dd><span class="c_666_g"><fmt:formatNumber value="${result.waitCount}" type="number" groupingUsed="true" /></span>건(${result.waitingPct})</dd>
</dl>
</div>
<div class="res_info_btm1">
<dl>
<dt>실패건수</dt>
<dd><span class="c_e40000_g"><fmt:formatNumber value="${result.failCount}" type="number" groupingUsed="true" /></span>건(${result.failedPct})</dd>
</dl>
</div>
</div>
<p class="table_bottom_txt">* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.</p>
</div>
</div>
<!--// 상세결과-->
</div>
<!--// 발송결과 상세 정보 -->
<!-- 발송결과 미리보기 -->
<div class="resultcont_right" id="previewPhone">
</div>
<!--// 발송결과 미리보기 -->
</div>
<!--// 발송결과 상세 및 미리보기-->
<!-- 목록-->
<div class="btn_list_type1">
<button class="btnType btnType17">목록</button>
</div>
<!--// 목록-->
</div>
</div>
<!--// send top -->
</div>
<!-- 발송대상리스트 팝업 -->
<div class="tooltip-wrap">
<div class="popup-com ad_layer rev_popup04" tabindex="0" data-tooltip-con="rev_popup04" data-focus="rev_popup04" data-focus-prev="rev_popup04-close" style="width:530px;">
<div class="popup_heading">
<p>발송대상 리스트</p>
<button type="button" class="tooltip-close listClose" data-focus="rev_popup04-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<div class="popup_search_type2">
<label for="" class="label">검색종류 선택</label>
<div class="title">수신번호</div>
<label for="" class="label">검색어입력</label>
<input type="text" class="send_text" id="searchInput" placeholder="3자 이상 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='3자 이상 입력하세요.'">
<button type="button" id="searchBtn" class="btnType btnType2" style="width:63px; margin:0;">검색</button>
</div>
<div class="list_tab_wrap2 type4">
<ul class="tabType3" id="tabType" name="tabType">
<li class="tab active"><button type="button" id="initTab" title="선택됨">전체</button></li>
<li class="tab"><button type="button">대기</button></li>
<li class="tab"><button type="button">성공</button></li>
<li class="tab"><button type="button">실패</button></li>
</ul>
</div>
<div class="tb_wrap" id="detailPopup" style="min-height:200px;">
<!-- 타블레이터 영역 -->
</div>
<div class="table_btn clearfix">
<div class="table_btn_left">
<button type="button" onclick="fn_downloadFilteredExcel()" class="excel_btn btnType"><i class="downroad"></i>엑셀 다운로드</button>
<button type="button" id="addReg" data-tooltip="rev_popup02" class="btnType btnType14"><i class="add_img"></i>주소록 등록</button>
<button type="button" onclick="fnDelAddrNo()" id="addRemove" class="btnType btnType15"><i class="remove_img"></i>주소록에서 번호 삭제</button>
</div>
</div>
</div>
<div class="popup_btn_wrap2" style="margin: -40px auto 30px auto;">
<button type="button" class="tooltip-close listClose" data-focus="adr_popup01-close" data-focus-next="popup02">닫기</button>
</div>
</div>
</div>
<!-- //발송대상 리스트 안내 팝업 -->
<!-- 주소록에 등록 팝업 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer rev_popup02" tabindex="0" data-tooltip-con="rev_popup02" data-focus="rev_popup02" data-focus-prev="rev_popup02-close" style="width: 510px;">
<div class="popup_heading">
<p>주소록에 등록</p>
<button type="button" class="tooltip-close grpClose" data-focus="rev_popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<table class="layer_tType1 style1">
<caption>주소록 그룹선택 표</caption>
<colgroup>
<col style="width: 80px">
<col style="width: auto">
</colgroup>
<tbody>
<tr>
<th>그룹 선택</th>
<td>
<label for="" class="label">그룹 선택</label>
<select id="addrGrpIdInfo" name="addrGrpIdInfo">
</select>
<label for="" class="label">그룹명 입력</label>
<input type="text" id="grpNm" placeholder="새 그룹명을 입력해주세요." maxlength="24" onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'" class="inputLight">
</td>
</tr>
</tbody>
</table>
<div class="popup_btn_wrap2">
<button type="button" onclick="fnAddAddrNo()">등록</button>
<button type="button" class="tooltip-close grpClose" data-focus="rev_popup02-close" data-focus-next="rev_popup02">닫기</button>
</div>
</div>
</div>
</div>
<!--// 주소록에 등록 팝업 -->
<!-- 이전 리스트 상태(검색조건, 페이징) 그대로 가기 위한 form -->
<form id="goList" name="goList" method="post" action="/web/mjon/msgsent/selectMsgSentView.do">
<input type="hidden" name="pageIndex" value="<c:out value="${searchVO.pageIndex}" />" />
<input type="hidden" name="searchSortCnd" value="<c:out value='${searchVO.searchSortCnd }' />" />
<input type="hidden" name="searchSortOrd" value="<c:out value='${searchVO.searchSortOrd }' />" />
<input type="hidden" name="searchCondition01" value="<c:out value='${searchVO.searchCondition01 }' />" />
<input type="hidden" name="searchCondition02" value="<c:out value='${searchVO.searchCondition02 }' />" />
<input type="hidden" name="searchStartDate" value="<c:out value='${searchVO.searchStartDate }' />" />
<input type="hidden" name="searchEndDate" value="<c:out value='${searchVO.searchEndDate }' />" />
<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition }' />" />
<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword }' />" />
<input type="hidden" name="pageUnit" value="<c:out value='${searchVO.pageUnit }' />" />
</form>
<!-- 예약 취소 -->
<form id="resCancelForm" name="resCancelForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
</form>
<!-- 재발송 form -->
<form name="reSendAllForm" method="post">
<input type="hidden" name="msgResendAllFlag" value="Y"/>
<input type="hidden" name="msgResendAllGroupId" value="${result.msgGroupId}"/>
<input type="hidden" name="msgResendAllYellowId" value="${result.yellowId}"/>
<input type="hidden" name="msgResendAllTmpKey" value="${result.msgNoticetalkTmpKey}"/>
</form>
<form id="resPopForm" name="resPopForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value="${result.msgGroupId}"/>
<!-- <input type="hidden" id="msgId" name="msgId" value=""/> -->
</form>

View File

@ -45,20 +45,6 @@ $(document).ready(function(){
threefulstday = prevMonth(3); threefulstday = prevMonth(3);
threefuledday = today(); 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 (){ $(document).on('click', '.sort', function (){
listSortOrd(this); listSortOrd(this);
@ -101,6 +87,9 @@ $(document).ready(function(){
}); });
//발송건수 셋
cntSet();
}); });
//오늘날짜 구하기 //오늘날짜 구하기
@ -147,56 +136,16 @@ function linkPage(pageNo){
form.pageIndex.value = pageNo; form.pageIndex.value = pageNo;
var sendData = $(document.searchForm).serializeArray(); var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>'); // $(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>');
$(".msgSentAllLoad tbody:first").html('<tr><td colspan="12">LOADING...</td></tr>');
$(".msgSentAllLoad").load("/web/kakao/sent/selectKakaoSentListViewAjax.do", sendData ,function(response, status, xhr){ $(".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){ function fnRevDetailPop(msgGroupId, msgId){
document.resPopForm.msgGroupId.value = msgGroupId; document.resPopForm.msgGroupId.value = msgGroupId;
@ -204,20 +153,11 @@ function fnRevDetailPop(msgGroupId, msgId){
var sendData = $(document.resPopForm).serializeArray(); var sendData = $(document.resPopForm).serializeArray();
var form = document.searchForm; var form = document.searchForm;
if (form.listType.value == "privateList") { $("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailDataAjax.do", sendData ,function(response, status, xhr){
// 개인별 // 상세보기 클릭때마다 툴팁 1 tab이 열리게 설정
$("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailData2Ajax.do", sendData ,function(response, status, xhr){ popupTab($('#atBtn'),'1');
$('#tooltopClick').trigger('click'); $('#tooltopClick').trigger('click');
}); });
}
else {
// 전송건별
$("#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.btn_tab").removeClass("active");
$tab.siblings("li.tab").find("button").removeAttr("title"); $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; form.stateType.value = pageType;
linkPage(1); 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(){ function fnReSendMsg(){
var msgSeq = []; 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) { 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){ function infoPop(pageUrl){
document.popForm.pageType.value = pageUrl; document.popForm.pageType.value = pageUrl;
@ -685,33 +299,90 @@ function infoPop(pageUrl){
document.popForm.submit(); 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();
}
}
</script> </script>
<!-- 문자내용 팝업 data-tooltip: rev_popup01 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer kakao_rev_popup rev_popup01" tabindex="0" data-tooltip-con="rev_popup01"
data-focus="rev_popup01" data-focus-prev="rev_popup01-close" style="width: 440px;">
<div class="popup_heading">
<p>문자내용</p>
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"><img
src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<!-- 팝업 상세내용 노출 -->
<div id="msgSentDetailPopLoad" >
</div>
<div class="popup_btn_wrap2" style="justify-content: center;">
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"
data-focus-next="rev_popup01">닫기</button>
</div>
</div>
</div>
</div>
<!-- //문자내용 팝업 data-tooltip: rev_popup01 -->
<!-- 그룹등록 팝업 data-tooltip:rev_popup02 --> <!-- 그룹등록 팝업 data-tooltip:rev_popup02 -->
<div class="tooltip-wrap"> <div class="tooltip-wrap">
@ -763,154 +434,19 @@ function infoPop(pageUrl){
<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 --> <input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 --> <input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 --> <input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="ntceBgnde" name="ntceBgnde" value=""/>
<!-- 각 통계별 총 건수 --> <input type="hidden" id="ntceEndde" name="ntceEndde" value=""/>
<c:set var="totAllCnt" value="0"/><!-- 전체 건수 --> <input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
<c:set var="totAtCnt" value="0"/><!-- 알림톡 건수 -->
<c:set var="totFtCnt" value="0"/><!-- 친구톡 건수 -->
<!-- 각 통계별 성공, 실패 건수 처리 -->
<c:set var="waitAllCnt" value="0"/><!-- 전체 대기 건수 -->
<c:set var="succAllCnt" value="0"/><!-- 전체 성공 건수 -->
<c:set var="failAllCnt" value="0"/><!-- 전체 실패 건수 -->
<c:set var="waitAtCnt" value="0"/><!-- 알림톡 대기 건수 -->
<c:set var="succAtCnt" value="0"/><!-- 알림톡 성공 건수 -->
<c:set var="failAtCnt" value="0"/><!-- 알림톡 실패 건수 -->
<c:set var="waitFtCnt" value="0"/><!-- 친구톡 대기 건수 -->
<c:set var="succFtCnt" value="0"/><!-- 친구톡 성공 건수 -->
<c:set var="failFtCnt" value="0"/><!-- 친구톡 실패 건수 -->
<!-- 발송대기 건수가 있으면 이것도 발송 실패건수로 일단 집계한다. -->
<c:forEach var="totalMsgCnt" items="${totalMsgCnt}" varStatus="status">
<!-- 전체 갯수 구하기 -->
<c:set var="totAllCnt" value="${totAllCnt + totalMsgCnt.msgResultCnt}"/>
<!-- 전체 대기 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'W'}">
<c:set var="waitAllCnt" value="${waitAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 성공 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'S'}">
<c:set var="succAllCnt" value="${succAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 실패 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'F'}">
<c:set var="failAllCnt" value="${failAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 알림톡 처리 -->
<c:forEach var="atCnt" items="${atCnt}" varStatus="status">
<!-- 단문 전체 갯수 구하기 -->
<c:set var="totAtCnt" value="${totAtCnt + atCnt.msgResultCnt}"/>
<!-- 단문 대기 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'W'}">
<c:set var="waitAtCnt" value="${waitAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 성공 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'S'}">
<c:set var="succAtCnt" value="${succAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 실패 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'F'}">
<c:set var="failAtCnt" value="${failAtCnt + atCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 친구톡 처리 -->
<c:forEach var="ftCnt" items="${ftCnt}" varStatus="status">
<!-- 장문 전체 갯수 구하기 -->
<c:set var="totFtCnt" value="${totFtCnt + ftCnt.msgResultCnt}"/>
<!-- 장문 대기 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'W'}">
<c:set var="waitFtCnt" value="${waitFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 성공 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'S'}">
<c:set var="succFtCnt" value="${succFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 실패 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'F'}">
<c:set var="failFtCnt" value="${failFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<div class="rev_content kakao_rev_content" id="tab5_2"> <div class="rev_content kakao_rev_content" id="tab5_2">
<div class="rev_admin">
<div class="rev_admin_in"> <!-- 발송결과 개선 : 문구추가 -->
<div class="rev_admin_top clearfix"> <div class="titBox_result">
<p>전체</p> <p>- 최대 3개월간의 발송내역만 확인하실 수 있습니다.</p>
<p><span><fmt:formatNumber value="${totAllCnt}" pattern="#,###"/></span> 건</p> <p>- 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p><span><fmt:formatNumber value="${totAtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<%-- <div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>친구톡</p>
<p><span><fmt:formatNumber value="${totFtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div> --%>
</div> </div>
<!--// 발송결과 개선 : 문구추가 -->
<div class="excel_middle"> <div class="excel_middle">
<div class="select_btnWrap clearfix"> <div class="select_btnWrap clearfix">
<div class="btn_left"> <div class="btn_left">
@ -931,6 +467,8 @@ function infoPop(pageUrl){
<div class="btn_right"> <div class="btn_right">
<label for="searchCondition" class="label">발신번호 선택 == ${kakaoSentVO.searchCondition}</label> <label for="searchCondition" class="label">발신번호 선택 == ${kakaoSentVO.searchCondition}</label>
<select name="searchCondition" id="searchCondition" class="selType2"> <select name="searchCondition" id="searchCondition" class="selType2">
<option value="4" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >채널ID</option>
<option value="5" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >내용</option>
<option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option> <option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option>
</select> </select>
<div class="search"> <div class="search">
@ -941,34 +479,140 @@ function infoPop(pageUrl){
</div> </div>
</div> </div>
</div> </div>
<div class="rev_admin" id="lodingBefore">
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p></p>
</div>
<div class="rev_admin_btm admin_btm">
<table class="tType4"><tbody><tr><td>LOADING...</td></tr></tbody></table>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p></p>
</div>
<div class="rev_admin_btm admin_btm">
<table class="tType4"><tbody><tr><td>LOADING...</td></tr></tbody></table>
</div>
</div>
</div>
<div class="rev_admin" id="lodingAfter" style="display:none;">
<div class="rev_admin_in" id="allCnt">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p><span name="allCnt">0</span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a" name="waitCnt">0</span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a" name="succCnt">0</span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000" name="failCnt">0</span>건</dd>
</dl>
</div>
</div>
<div class="rev_admin_in" id="atCnt">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p><span name="allCnt">0</span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a" name="waitCnt">0</span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a" name="succCnt">0</span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000" name="failCnt">0</span>건</dd>
</dl>
</div>
</div>
<%-- <div class="rev_admin_in" id="ftCnt">
<div class="rev_admin_top clearfix">
<p>친구톡</p>
<p><span><fmt:formatNumber value="${totFtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a" name="waitCnt"><fmt:formatNumber value="${waitFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a" name="succCnt"><fmt:formatNumber value="${succFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000" name="failCnt"><fmt:formatNumber value="${failFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div> --%>
</div>
<div class="list_tab_wrap2 type4"> <div class="list_tab_wrap2 type4">
<!-- tab button --> <!-- tab button -->
<ul class="list_tab"> <ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li> <li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li> <li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
<%-- <c:if test="${fn:contains(pageContext.request.requestURL , 'localhost') --%> <c:if test="${pageContext.request.serverName == 'localhost'
<%-- || fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%> || pageContext.request.serverName == '119.193.215.98'}">
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li> --> <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
<%-- </c:if> --%> </c:if>
</ul><!--// tab button --> </ul><!--// tab button -->
</div> </div>
<!-- 예약관리 > 전체 --> <!-- 예약관리 > 전체 -->
<div class="price_history_cont current" id="listTab_2"> <div class="price_history_cont current price_wrap" id="listTab_2">
<!-- tab button --> <!-- tab button -->
<div class="table_tab_wrap"> <div class="table_tab_wrap">
<ul> <!-- <ul>
<li class="tab active"> <li class="tab active">
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li> <button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li> <li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li> <li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li> <li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li>
</ul><!--// tab button --> </ul> -->
<div class="tab_depth1"> <!--// tab button -->
<a href="#none" class="on msgGgoupList">받는사람(전송건별)</a> <!-- <div class="tab_depth1"> -->
<a href="#none" style="display: none;"></a> <!-- <a href="#none" class="on msgGgoupList">받는사람(전송건별)</a> -->
<a href="#none" class="msgPrivateList">받는사람(개인별)</a> <!-- <a href="#none" style="display: none;"></a> -->
<div class="on_active">받는사람(전송건별)</div> <!-- <a href="#none" class="msgPrivateList">받는사람(개인별)</a> -->
</div> <!-- <div class="on_active">받는사람(전송건별)</div> -->
<!-- </div> -->
<ul>
<li class="tab active">
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button>
</li>
<!-- <li class="tab">
<button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button>
</li>
<li class="tab">
<button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button>
</li>
<li class="tab">
<button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button>
</li> -->
<li class="tab">
<button type="button" onclick="fnListLoad('N','1'); return false;">즉시</button>
</li>
<li class="tab">
<button type="button" onclick="fnListLoad('Y','2'); return false;">예약</button>
</li>
</ul>
</div> </div>
<!-- 발송관리 리스트 --> <!-- 발송관리 리스트 -->
<div class="table_cont current msgSentAllLoad" id="tableCont_1"> <div class="table_cont current msgSentAllLoad" id="tableCont_1">

View File

@ -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" %>
<!-- <script src="/publish/js/content.js"></script> -->
<script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript">
var lastfulstday = ""; //전월 시작일
var lastfuledday = ""; //전월 마지막일
var thisfulstlday = ""; //당월 시작일
var thisfuledtlday = ""; //당원 마지막일
var threefulstday = ""; //3개월전 시작일
var threefuledday = ""; //3개월전 마지막일
$(document).ready(function(){
//초기 전체 리스트 페이지 보여주기
var form = document.searchForm;
form.listType.value = "groupList";
linkPage(1);
var date = new Date() ;
//이전달 첫날/마지막날 조회
if(date.getMonth()+1 == 1){
lastfulstday = date.getFullYear()-1 + "/12" + "/01";
lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+"";
}else{
lastfulstday = date.getFullYear() + "/" ;
lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ;
lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ;
lastfulstday += "/01" ;
}
//당월 첫날/마지막날 조회
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" ;
//3개월 이전 날짜 구해오기
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);
});
//목록 정렬 항목 클릭
function listSortOrd(obj){
var sortOrd = $(obj).attr("sortOrd");
var sortCnd = $(obj).attr("id");
$("[name='searchSortCnd']").val(sortCnd.substring(5)); // 구분자 제거
if (sortOrd == "desc") $("[name='searchSortOrd']").val("asc");
else $("[name='searchSortOrd']").val("desc");
linkPage('1'); //각 JSP마다 다를때 메소드 정의해 줘야됨
}
//전체선택 실행
var allChkSts = false;
$("#allCheck").click(function(){
if(!allChkSts){// 전체선택이 해제되어 있을 경우
$("input[name=msgSentDel]").prop("checked", true);
allChkSts = true;
}else{
$("input[name=msgSentDel]").prop("checked", false);
allChkSts = false;
}
});
$(document).on('change','#pageUnit', function(){
linkPage(1);
});
});
//오늘날짜 구하기
function today() {
var d = new Date();
return getDateStr(d);
}
//이전 날짜 구하기
function prevDay(days) {
var d = new Date();
var dayOfMonth = d.getDate();
d.setDate(dayOfMonth - days);
return getDateStr(d);
}
//이전 월 구하기
function prevMonth(month) {
var d = new Date();
var monthOfYear = d.getMonth();
d.setMonth(monthOfYear - month);
return getDateStr(d);
}
//날짜 받아오기
function getDateStr(myDate){
var year = myDate.getFullYear();
var month = ("0"+(myDate.getMonth()+1)).slice(-2);
var day = ("0"+myDate.getDate()).slice(-2);
return ( year + '/' + month + '/' + day );
}
//캘린더에 날짜 입력해 주기
function setCalVal(val,targetObj){
$('input[name='+targetObj+']').val(val) ;
}
//검색 버튼 실행
function linkPage(pageNo){
var form = document.searchForm;
var stateType = form.stateType.value;
form.pageIndex.value = pageNo;
var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>');
$(".msgSentAllLoad").load("/web/kakao/sent/selectKakaoSentListViewAjax.do", sendData ,function(response, status, xhr){
});
}
//선택 삭제 실행
/*
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;
document.resPopForm.msgId.value = 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');
});
}
}
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 == 'fail'){
form.listType.value = "privateList";
$(".tab_depth1").hide();
} else {
$(".tab_depth1").show();
}
form.stateType.value = pageType;
linkPage(1);
}
// 전체/단문/장문/그림 탭 선택 처리
function fnTabLoad(tabType, tabNum){
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");
}
function fnSearch(pageNo){
var form = document.searchForm;
form.pageIndex.value = pageNo ;
form.action="/web/kakao/sent/selectKakaoSentView.do";
form.submit();
}
function fnExcelDownLoad(pageType, listType){
var form = document.searchForm;
var loginVO = '${LoginVO}';
form.stateType.value = pageType;
form.listType.value = listType;
if(loginVO == "" || loginVO == null){
alert("로그인 후 이용이 가능합니다.");
return false;
}
if(confirm("엑셀 다운로드를 하시겠습니까?")){
form.action="/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do";
form.submit();
}
}
$(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){
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 = [];
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 인 것은 제외하고 아이디 저장
msgSeq[index] = $(this).val();
}
});
var form = document.reSendForm;
form.msgSeqList.value = msgSeq;
form.msgResendFlag.value = "Y";
form.action="/web/mjon/msgdata/selectMsgDataView.do";
form.submit();
}
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) {
//만들려는 팝업의 크기
var popup_wid = '840';
var popup_ht = '900';
var popup_left = (window.screen.width / 2) - (popup_wid / 2);
var popup_top =(window.screen.height / 2) - (popup_ht / 2);
$("#tabType").val(tabType);
$("#searchForm").attr("target","msgSentPrint");
window.open('', 'msgSentPrint', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top +',scrollbars=1');
$("#searchForm").attr({"action":"/web/kakao/sent/printKakaoSentDataAjax.do", "method":"post"}).submit();
}
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;
document.popForm.action = "/web/pop/infoPop.do";
document.popForm.method = "post";
window.open("about:blank", 'infoPop', 'width=790, height=320, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
document.popForm.target = "infoPop";
document.popForm.submit();
}
</script>
<!-- 문자내용 팝업 data-tooltip: rev_popup01 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer kakao_rev_popup rev_popup01" tabindex="0" data-tooltip-con="rev_popup01"
data-focus="rev_popup01" data-focus-prev="rev_popup01-close" style="width: 440px;">
<div class="popup_heading">
<p>문자내용</p>
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"><img
src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<!-- 팝업 상세내용 노출 -->
<div id="msgSentDetailPopLoad" >
</div>
<div class="popup_btn_wrap2" style="justify-content: center;">
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"
data-focus-next="rev_popup01">닫기</button>
</div>
</div>
</div>
</div>
<!-- //문자내용 팝업 data-tooltip: rev_popup01 -->
<!-- 그룹등록 팝업 data-tooltip:rev_popup02 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer rev_popup02" tabindex="0" data-tooltip-con="rev_popup02" data-focus="rev_popup02" data-focus-prev="rev_popup02-close" style="width: 500px;">
<div class="popup_heading">
<p>그룹등록</p>
<button type="button" class="tooltip-close" data-focus="rev_popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<div class="gorup_join_cont">
<p class="adr_pop_title">선택된 발송내역 전화번호를 그룹으로 등록합니다.</p>
<div class="group_input" style="margin-top: 0;">
<div class="input_left">그룹이름</div>
<div class="input_right">
<label for="grpNm" class="label">새 그룹명 입력</label>
<input type="text" id="grpNm" name="grpNm" placeholder="새 그룹명 입력" onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명 입력'" class="inputLight">
</div>
</div>
<div class="popup_btn_wrap2">
<button type="button" onclick="javascript:fnAddAddrNo(); return false;">저장</button>
<button type="button" class="tooltip-close" data-focus="rev_popup02-close" data-focus-next="rev_popup02">취소</button>
</div>
</div>
</div>
</div>
</div>
<div class="inner">
<!-- send top -->
<div class="send_top">
<!-- 결제관리 - 요금 사용내역 -->
<div class="rev_admin_cont serv_content current">
<div class="heading">
<h2>발송결과</h2>
<button type="button" class="button info" onclick="infoPop('selectMsgSentView');">사용안내</button>
<button type="button" class="button junk" data-tooltip="popupJunk">통신사 스팸규격안내</button>
</div>
<div class="pay_tab_wrap">
<!-- tab button -->
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp" %>
<!--// tab button -->
</div>
<form id="searchForm" name="searchForm" method="post">
<input type="hidden" id="pageIndex" name="pageIndex" value="1"/>
<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 -->
<input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 -->
<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
<!-- 각 통계별 총 건수 -->
<c:set var="totAllCnt" value="0"/><!-- 전체 건수 -->
<c:set var="totAtCnt" value="0"/><!-- 알림톡 건수 -->
<c:set var="totFtCnt" value="0"/><!-- 친구톡 건수 -->
<!-- 각 통계별 성공, 실패 건수 처리 -->
<c:set var="waitAllCnt" value="0"/><!-- 전체 대기 건수 -->
<c:set var="succAllCnt" value="0"/><!-- 전체 성공 건수 -->
<c:set var="failAllCnt" value="0"/><!-- 전체 실패 건수 -->
<c:set var="waitAtCnt" value="0"/><!-- 알림톡 대기 건수 -->
<c:set var="succAtCnt" value="0"/><!-- 알림톡 성공 건수 -->
<c:set var="failAtCnt" value="0"/><!-- 알림톡 실패 건수 -->
<c:set var="waitFtCnt" value="0"/><!-- 친구톡 대기 건수 -->
<c:set var="succFtCnt" value="0"/><!-- 친구톡 성공 건수 -->
<c:set var="failFtCnt" value="0"/><!-- 친구톡 실패 건수 -->
<!-- 발송대기 건수가 있으면 이것도 발송 실패건수로 일단 집계한다. -->
<c:forEach var="totalMsgCnt" items="${totalMsgCnt}" varStatus="status">
<!-- 전체 갯수 구하기 -->
<c:set var="totAllCnt" value="${totAllCnt + totalMsgCnt.msgResultCnt}"/>
<!-- 전체 대기 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'W'}">
<c:set var="waitAllCnt" value="${waitAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 성공 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'S'}">
<c:set var="succAllCnt" value="${succAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 실패 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'F'}">
<c:set var="failAllCnt" value="${failAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 알림톡 처리 -->
<c:forEach var="atCnt" items="${atCnt}" varStatus="status">
<!-- 단문 전체 갯수 구하기 -->
<c:set var="totAtCnt" value="${totAtCnt + atCnt.msgResultCnt}"/>
<!-- 단문 대기 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'W'}">
<c:set var="waitAtCnt" value="${waitAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 성공 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'S'}">
<c:set var="succAtCnt" value="${succAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 실패 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'F'}">
<c:set var="failAtCnt" value="${failAtCnt + atCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 친구톡 처리 -->
<c:forEach var="ftCnt" items="${ftCnt}" varStatus="status">
<!-- 장문 전체 갯수 구하기 -->
<c:set var="totFtCnt" value="${totFtCnt + ftCnt.msgResultCnt}"/>
<!-- 장문 대기 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'W'}">
<c:set var="waitFtCnt" value="${waitFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 성공 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'S'}">
<c:set var="succFtCnt" value="${succFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 실패 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'F'}">
<c:set var="failFtCnt" value="${failFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<div class="rev_content kakao_rev_content" id="tab5_2">
<div class="rev_admin">
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p><span><fmt:formatNumber value="${totAllCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p><span><fmt:formatNumber value="${totAtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<%-- <div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>친구톡</p>
<p><span><fmt:formatNumber value="${totFtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div> --%>
</div>
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div class="btn_left">
<span class="cal_label">기간선택</span>
<div class="calendar_wrap">
<input type="text" class="startDate inp calendar" title="검색 시작일" id="startDate" name="startDate" value="<c:out value='${kakaoSentVO.startDate}'/>" data-datecontrol="true">
<span class="dateEtc">~</span>
<input type="text" class="endDate inp calendar" title="검색 종료일" id="endDate" name="endDate" value="<c:out value='${kakaoSentVO.endDate}'/>" data-datecontrol="true">
</div>
<!-- <button type="button">전월</button>
<button type="button">당월</button> -->
<button type="button" onclick="setCalVal(lastfulstday,'startDate');setCalVal( lastfuledday,'endDate'); return false;" class="btnType btnType19">전월</button>
<button type="button" onclick="setCalVal(thisfulstlday,'startDate');setCalVal( thisfuledtlday,'endDate'); return false;" class="btnType btnType19">당월</button>
<!-- <button type="button">3개월</button> -->
<button type="button" onclick="setCalVal(threefulstday,'startDate');setCalVal( threefuledday,'endDate'); return false;" class="btnType btnType19">3개월</button>
<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
</div>
<div class="btn_right">
<label for="searchCondition" class="label">발신번호 선택 == ${kakaoSentVO.searchCondition}</label>
<select name="searchCondition" id="searchCondition" class="selType2">
<option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option>
</select>
<div class="search">
<label for="id" class="label"></label>
<input type="text" id="searchKeyword" name="searchKeyword" value="<c:out value='${searchKeyword}'/>" placeholder="검색어를 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2" onClick="javascript:fnSearch(1); return false;">검색</button>
</div>
</div>
</div>
</div>
<div class="list_tab_wrap2 type4">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
<%-- <c:if test="${fn:contains(pageContext.request.requestURL , 'localhost') --%>
<%-- || fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%>
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li> -->
<%-- </c:if> --%>
</ul><!--// tab button -->
</div>
<!-- 예약관리 > 전체 -->
<div class="price_history_cont current" id="listTab_2">
<!-- tab button -->
<div class="table_tab_wrap">
<ul>
<li class="tab active">
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li>
</ul><!--// tab button -->
<div class="tab_depth1">
<a href="#none" class="on msgGgoupList">받는사람(전송건별)</a>
<a href="#none" style="display: none;"></a>
<a href="#none" class="msgPrivateList">받는사람(개인별)</a>
<div class="on_active">받는사람(전송건별)</div>
</div>
</div>
<!-- 발송관리 리스트 -->
<div class="table_cont current msgSentAllLoad" id="tableCont_1">
</div><!-- //전체 종료 -->
<!-- table -->
</div>
</form>
</div>
</div>
</div><!--// send top -->
</div>
<form id="resPopForm" name="resPopForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
<input type="hidden" id="msgId" name="msgId" value=""/>
<input type="hidden" id="fileCnt" name="fileCnt" value=""/>
<input type="hidden" id="resultType" name="resultType" value="S"/>
</form>
<form id="reSendForm" name="reSendForm" method="post">
<input type="hidden" id="msgSeqList" name="msgSeqList" value=""/>
<input type="hidden" id="msgResendFlag" name="msgResendFlag" value="N"/>
</form>
<form name="popForm" id="popForm" method="post">
<input type="hidden" name="pageType" id="pageType" value=""/>
</form>

View File

@ -25,10 +25,15 @@ $(document).ready(function (){
alert("${message}"); alert("${message}");
} }
//웹헤더에서 보안로그인으로 인해 페이지 접근 시
getid(document.loginForm2); getid(document.loginForm2);
<c:if test="${headerLoginResult ne 'N'}">
headerLoginResult("<c:out value='${headerLoginResult}'/>");
</c:if>
}); });
function press(event) { if (event.keyCode == 13) actionLogin(); } function press(event) { if (event.keyCode == 13) actionLoginPage(); }
function actionLoginPage() { function actionLoginPage() {
// 아이디 공백 제거 // 아이디 공백 제거
@ -41,133 +46,22 @@ function actionLoginPage() {
alert("비밀번호를 입력하세요"); alert("비밀번호를 입력하세요");
return; return;
} else { } else {
//IP체크 삭제 후 바로 로그인처리 - 22.05.03
// ipCheck();
actionLogin(); 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="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
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 : "<c:url value='/web/user/login/selectIPCntAjax.do' />",
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(){ function actionLogin(){
console.log('actionLogin : actionLogin')
setTimeout(function() {
if (isKoreaIpAddress == false) {
alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다.");
location.href='/web/uat/uia/actionLogout.do';
return false;
}
// 로그인 START // 로그인 START
var rsa = new RSAKey(); var rsa = new RSAKey();
rsa.setPublic($('#RSAModulus2').val(),$('#RSAExponent2').val()); rsa.setPublic($('#RSAModulus2').val(),$('#RSAExponent2').val());
/* rsa.setPublic(document.loginForm2.RSAModulus.value, document.loginForm2.RSAExponent.value); */
var id = $("#id_text2"); var id = $("#id_text2");
var pw = $("#password_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.id.value = rsa.encrypt(id.val().toLowerCase());
document.loginForm2.password.value = rsa.encrypt(pw.val()); document.loginForm2.password.value = rsa.encrypt(pw.val());
//document.loginForm2.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
saveid(document.loginForm2);
//document.loginForm2.submit();
var checkForm = $("form[name=loginForm2]").serialize() ; var checkForm = $("form[name=loginForm2]").serialize() ;
$.ajax({ $.ajax({
@ -177,8 +71,6 @@ function actionLogin(){
data : checkForm, data : checkForm,
dataType:'json', dataType:'json',
success : function(data) { success : function(data) {
//alert(data.status);
//alert(data.data.moblphonNo);
if (data.status=="success"){ if (data.status=="success"){
document.loginForm2.passFlag.value = data.passFlag; document.loginForm2.passFlag.value = data.passFlag;
@ -199,7 +91,6 @@ function actionLogin(){
$("#input_list_item_5").show(); $("#input_list_item_5").show();
$("#input_list_item_6").show(); $("#input_list_item_6").show();
// $("#hp_text2").val(data.data.moblphonNo);
var $select = $('#hp_text2'); var $select = $('#hp_text2');
data.mberCertPhoneList.forEach(function(item) { data.mberCertPhoneList.forEach(function(item) {
$select.append($('<option>', { $select.append($('<option>', {
@ -207,19 +98,21 @@ function actionLogin(){
text: item.mbtlnum+'('+item.certAlias+')' // option의 화면에 보이는 텍스트 text: item.mbtlnum+'('+item.certAlias+')' // option의 화면에 보이는 텍스트
})); }));
}); });
} }
}else if (data.status=="fail"){ }else if (data.status=="fail"){
if (data.returnType == "A"){ if (data.returnType == "A"){
//휴면 회원
document.loginForm2.action="<c:url value='/web/user/humanPage.do'/>"; document.loginForm2.action="<c:url value='/web/user/humanPage.do'/>";
document.loginForm2.submit(); document.loginForm2.submit();
}else if (data.returnType == "B"){ }else if (data.returnType == "B"){
//기업회원 기업정보 기입
document.cmpChangeForm.mberId.value = data.mberId; document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/membershipAttachDocBefore.do'/>"; document.cmpChangeForm.action="<c:url value='/web/user/login/membershipAttachDocBefore.do'/>";
document.cmpChangeForm.submit(); document.cmpChangeForm.submit();
}else if (data.returnType == "C"){ }else if (data.returnType == "C"){
//스팸문자이용제한페이지
document.cmpChangeForm.mberId.value = data.mberId; document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/loginRestrictionUse.do'/>"; document.cmpChangeForm.action="<c:url value='/web/user/login/loginRestrictionUse.do'/>";
document.cmpChangeForm.submit(); document.cmpChangeForm.submit();
@ -228,17 +121,6 @@ function actionLogin(){
$("#ret_msg_info").html('<i></i>'+data.msg); $("#ret_msg_info").html('<i></i>'+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) { error : function(xhr, status, error) {
console.log("fn_click_banner_add_stat error : " + error); console.log("fn_click_banner_add_stat error : " + error);
@ -246,47 +128,22 @@ function actionLogin(){
return false; return false;
} }
}); });
}, 600);
} }
//아이디/휴대폰 번호 체크 //아이디/휴대폰 번호 체크
function actionLogin_end(){ function actionLogin_end(){
if (isKoreaIpAddress == false) {
alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다.");
location.href='/web/uat/uia/actionLogout.do';
return false;
}
// 로그인 START // 로그인 START
var rsa = new RSAKey(); var rsa = new RSAKey();
rsa.setPublic($('#RSAModulus2').val(),$('#RSAExponent2').val()); 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 hp = $("#hp_text2").val(); var hp = $("#hp_text2").val();
var num = $("#num_text2").val(); var num = $("#num_text2").val();
/* 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.hp.value = hp; document.loginForm2.hp.value = hp;
document.loginForm2.num.value = num; document.loginForm2.num.value = num;
document.loginForm2.action="<c:url value='/web/user/login/actionSecurityLoginAfterHp.do'/>"; document.loginForm2.action="<c:url value='/web/user/login/actionSecurityLoginAfterHp.do'/>";
saveid(document.loginForm2); saveid(document.loginForm2);
document.loginForm2.submit(); document.loginForm2.submit();
} }
//아이디/휴대폰 번호 체크 //아이디/휴대폰 번호 체크
@ -294,7 +151,6 @@ function step1IdCheck(){
document.checkForm.callTo.value = $('#hp_text2').val(); document.checkForm.callTo.value = $('#hp_text2').val();
document.checkForm.userId.value = $('#id_text2').val().toLowerCase(); document.checkForm.userId.value = $('#id_text2').val().toLowerCase();
//document.checkForm.searchNm.value = $('#findPw_userNm').val();
if ($('#id_text2').val()==''){ if ($('#id_text2').val()==''){
alert("아이디를 입력해주세요."); alert("아이디를 입력해주세요.");
@ -318,13 +174,9 @@ function step1IdCheck(){
if(returnData.result == "success") { if(returnData.result == "success") {
timer(); timer();
} }
}else{ alert("실패");return;} }else{ alert("실패");return;}
}, },
error : function(request , status, error){ error : function(request , status, error){
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error); alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
} }
@ -345,13 +197,11 @@ function timer(){
document.getElementById("timer").innerHTML = min + "분" + sec + "초"; document.getElementById("timer").innerHTML = min + "분" + sec + "초";
time--; time--;
//타임아웃 시 //타임아웃 시
if (time < 0) { if (time < 0) {
clearInterval(x); //setInterval() 실행을 끝냄 clearInterval(x); //setInterval() 실행을 끝냄
document.getElementById("timer").innerHTML = "시간초과"; document.getElementById("timer").innerHTML = "시간초과";
} }
}, 1000); }, 1000);
if(time != 300){ if(time != 300){
@ -360,38 +210,6 @@ function timer(){
} }
} }
function actionLogin_bak(){
// 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($('#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="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
saveid(document.loginForm2);
document.loginForm2.submit();
}, 600);
}
//인증번호 발송 1분마다 한번씩 보내기 //인증번호 발송 1분마다 한번씩 보내기
function sendMsgYn(){ function sendMsgYn(){
@ -441,7 +259,7 @@ function saveid(form) {
setCookie("ncms_saveid", form.id_text2.value, expdate); setCookie("ncms_saveid", form.id_text2.value, expdate);
} }
function setCookie (name, value, expires) { function setCookie(name, value, expires) {
document.cookie = name + "=" + escape (value) + "; path=/; expires=" + expires.toGMTString(); document.cookie = name + "=" + escape (value) + "; path=/; expires=" + expires.toGMTString();
} }
@ -449,7 +267,6 @@ function getid(form){
if(getCookie("ncms_saveid") != ""){ if(getCookie("ncms_saveid") != ""){
form.checkId.checked = (form.id_text2.value = getCookie("ncms_saveid")); form.checkId.checked = (form.id_text2.value = getCookie("ncms_saveid"));
} }
/* form.checkId.checked = ((form.id_text.value = getCookie("ncms_saveid")) != ""); */
} }
function getCookie(Name) { function getCookie(Name) {
@ -471,7 +288,6 @@ function getCookie(Name) {
//로그인 화면 비밀번호 보기 추가 //로그인 화면 비밀번호 보기 추가
function fn_passView(obj){ function fn_passView(obj){
var passInputType = $('#password_text2').prop("type"); var passInputType = $('#password_text2').prop("type");
if(passInputType == 'text'){ if(passInputType == 'text'){
$('#password_text2').prop("type", "password"); $('#password_text2').prop("type", "password");
@ -484,51 +300,22 @@ function fn_passView(obj){
} }
} }
<c:if test="${headerLoginResult ne 'N'}">
function headerLoginResult(headerLoginResult){
//보안로그인로 왔을때
//함수명: 배너 클릭하면 통계 추가 (2023-05-17 최남규) - 메인화면(mainPage.jsp)에도 같음 함수명 추가했음(단, 배너 갯수 다름) if(headerLoginResult === 'secure'){
//설명: 베너코드(ITN054)와 메뉴코드(ITN055) 조합코드 전달 후 Ajax.do 에서 '_' 분리후 날짜와 배너코드와 메뉴코드와 클릭수 +1 document.loginForm2.id_text2.value = "<c:out value='${id_secure}'/>";
// 테이블(mj_banner_click_stat)에 최초 등록 후 이후 전체접속수(CLICK_A_CNT+1)를 수정 document.loginForm2.password_text2.value = "<c:out value='${pw_secure}'/>";
//배너 추가될때 배너코드를 공통코드(ITN054) 추가 actionLoginPage();
//배너클릭통계-배너코드(ITN054): 원키퍼: 001, 간판다움: 002, NORDIC TOOLS: 003, 폰더하기: 004
//배너클릭통계-메뉴코드(ITN055): 메인:01, 로그인: 02
function fn_click_banner_add_stat(bannerMenuCode){
console.log("fn_click_banner_add_stat 배너 선택 "+ bannerMenuCode) ;
if (bannerMenuCode == "001_02")
{
window.open("https://www.one-keeper.co.kr/cp/munjaon/index.aspx"); // 새탭에서 열림
} else if (bannerMenuCode == "002_02")
{
window.open("http://ganpandaum.co.kr"); // 새탭에서 열림
}
var _param = { "bannerMenuCode" : bannerMenuCode }
$.ajax({
type : "POST",
async : false,
url : "/web/main/insertBannerClickStatAjax.do",
data : _param,
dataType:'json',
success : function(data) {
//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 "); else{
console.log("sucess data.msg : " + data.msg); $("#ret_msg").show();
console.log("sucess data1 : " + JSON.stringify(data)); $("#ret_msg_info").html('<i></i>'+headerLoginResult);
} }
}, }
error : function(xhr, status, error) { </c:if>
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;
}
});
}
</script> </script>
<div class="inner"> <div class="inner">
@ -612,16 +399,11 @@ function fn_click_banner_add_stat(bannerMenuCode){
<div class="input_left">휴대폰번호</div> <div class="input_left">휴대폰번호</div>
<div class="input_right"> <div class="input_right">
<label for="list_inputType1" class="label">휴대폰번호</label> <label for="list_inputType1" class="label">휴대폰번호</label>
<!-- <input type="text" id="hp_text2" class="list_inputType1" placeholder="가입휴대폰번호" style="width: 250px;" -->
<!-- onfocus="this.placeholder=''" onblur="this.placeholder='가입휴대폰번호'" maxlength="20" readonly> -->
<select id="hp_text2" class="list_selType1" style="width:70%;"> <select id="hp_text2" class="list_selType1" style="width:70%;">
</select> </select>
</div> </div>
<div class="login_del"> <div class="login_del">
<button type="button" class="btnType btnType3" onclick="sendMsgYn();">인증번호 받기</button> <button type="button" class="btnType btnType3" onclick="sendMsgYn();">인증번호 받기</button>
</div> </div>
</div> </div>
<div class="input_list_item" id="input_list_item_5" style="display:none;"> <div class="input_list_item" id="input_list_item_5" style="display:none;">
@ -656,16 +438,6 @@ function fn_click_banner_add_stat(bannerMenuCode){
</ul> </ul>
</div> </div>
<ul class="adv_list"> <ul class="adv_list">
<!-- <li><a href="https://www.ubikey.co.kr/" target="_blank"><img src="/publish/images/adv/adv_login_ubikey.png" alt="인증서를 사용하는 곳이면 어디서나 편리하게! 휴대폰 인증서 서비스 UBIKEY"></a></li> -->
<!--
<li><a href="https://twww.one-keeper.co.kr/cp/munjaon/index.aspx" target="_blank"><img src="/publish/images/adv/adv_login_onekeeper.png" alt="소중한 내 개인정보! 원키퍼로 내가 지킨다!"></a></li>
<li><a href="http://ganpandaum.co.kr/" target="_blank"><img src="/publish/images/adv/adv_login_ganpandaum.png" alt="간판다움 간판 잘하는 청년들이 뭉쳤다 간판, 인테리어, 네온, 썬팅, 어닝, 실사"></a></li>
-->
<!--
<li><a href="#" target="_blank" onclick="fn_click_banner_add_stat('001_02'); return false;" ><img src="/publish/images/adv/adv_login_onekeeper.png" alt="소중한 내 개인정보! 원키퍼로 내가 지킨다!"></a></li>
<li><a href="#" target="_blank" onclick="fn_click_banner_add_stat('002_02'); return false;" ><img src="/publish/images/adv/adv_login_ganpandaum.png" alt="간판다움 간판 잘하는 청년들이 뭉쳤다 간판, 인테리어, 네온, 썬팅, 어닝, 실사"></a></li>
-->
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -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" %>
<!-- 암화화 순서에 유의 -->
<link rel="stylesheet" href="/publish/css/mem.css">
<script src="/publish/js/content.js"></script>
<script type="text/javascript" src="/js/RSA/rsa.js"></script>
<script type="text/javascript" src="/js/RSA/jsbn.js"></script>
<script type="text/javascript" src="/js/RSA/prng4.js"></script>
<script type="text/javascript" src="/js/RSA/rng.js"></script>
<script src="/publish/js/jquery-3.5.0.js"></script>
<script type="text/javascript">
$(document).ready(function (){
if(${!empty message}){
alert("${message}");
}
getid(document.loginForm2);
});
function press(event) { if (event.keyCode == 13) actionLogin(); }
function actionLoginPage() {
// 아이디 공백 제거
document.loginForm2.id_text2.value = $.trim(document.loginForm2.id_text2.value);
if (document.loginForm2.id_text2.value =="") {
alert("아이디를 입력하세요");
return;
} else if (document.loginForm2.password_text2.value =="") {
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="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
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 : "<c:url value='/web/user/login/selectIPCntAjax.do' />",
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="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
saveid(document.loginForm2);
//document.loginForm2.submit();
var checkForm = $("form[name=loginForm2]").serialize() ;
$.ajax({
type : "POST",
async : false,
url : "/web/user/login/actionSecurityLoginBeforeHpAjax.do",
data : checkForm,
dataType:'json',
success : function(data) {
//alert(data.status);
//alert(data.data.moblphonNo);
if (data.status=="success"){
document.loginForm2.passFlag.value = data.passFlag;
if(data.passFlag == "Y")
{
actionLogin_end();
}
else
{
//번호인증팝업 띄우기
$("#input_list_item_1").hide();
$("#input_list_item_2").hide();
$("#input_list_item_3").hide();
$("#input_list_item_0").hide();
$("#input_list_item_4").show();
$("#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($('<option>', {
value: item.mbtlnum, // option의 value 값
text: item.mbtlnum+'('+item.certAlias+')' // option의 화면에 보이는 텍스트
}));
});
}
}else if (data.status=="fail"){
if (data.returnType == "A"){
//휴면 회원
document.loginForm2.action="<c:url value='/web/user/humanPage.do'/>";
document.loginForm2.submit();
}else if (data.returnType == "B"){
//기업회원 기업정보 기입
document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/membershipAttachDocBefore.do'/>";
document.cmpChangeForm.submit();
}else if (data.returnType == "C"){
//스팸문자이용제한페이지
document.cmpChangeForm.mberId.value = data.mberId;
document.cmpChangeForm.action="<c:url value='/web/user/login/loginRestrictionUse.do'/>";
document.cmpChangeForm.submit();
}else{
$("#ret_msg").show();
$("#ret_msg_info").html('<i></i>'+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;
}
});
}, 600);
}
//아이디/휴대폰 번호 체크
function actionLogin_end(){
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 hp = $("#hp_text2").val();
var num = $("#num_text2").val();
/* 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.hp.value = hp;
document.loginForm2.num.value = num;
document.loginForm2.action="<c:url value='/web/user/login/actionSecurityLoginAfterHp.do'/>";
saveid(document.loginForm2);
document.loginForm2.submit();
}
//아이디/휴대폰 번호 체크
function step1IdCheck(){
document.checkForm.callTo.value = $('#hp_text2').val();
document.checkForm.userId.value = $('#id_text2').val().toLowerCase();
//document.checkForm.searchNm.value = $('#findPw_userNm').val();
if ($('#id_text2').val()==''){
alert("아이디를 입력해주세요.");
return;
}else if ($('#hp_text2').val()==''){
alert("핸드폰번호를 입력해주세요.");
return;
}
var checkForm = $("form[name=checkForm]").serialize() ;
$.ajax({
url : "<c:url value='/web/user/sendSysMsgDataAjax.do' />",
type : 'POST',
data : checkForm,
dataType:'json',
success : function(returnData, status){
if(status == "success") {
alert(returnData.message);
if(returnData.result == "success") {
timer();
}
}else{ alert("실패");return;}
},
error : function(request , status, error){
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
}
});
}
var time = 300; //기준시간 작성
var min = ""; //분
var sec = ""; //초
//인증번호 타이머
function timer(){
//setInterval(함수, 시간) : 주기적인 실행
var x = setInterval(function() {
//parseInt() : 정수를 반환
min = parseInt(time/60);
sec = time%60; //나머지를 계산
document.getElementById("timer").innerHTML = min + "분" + sec + "초";
time--;
//타임아웃 시
if (time < 0) {
clearInterval(x); //setInterval() 실행을 끝냄
document.getElementById("timer").innerHTML = "시간초과";
}
}, 1000);
if(time != 300){
time = 300;
clearInterval(x);
}
}
function actionLogin_bak(){
// 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($('#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="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
saveid(document.loginForm2);
document.loginForm2.submit();
}, 600);
}
//인증번호 발송 1분마다 한번씩 보내기
function sendMsgYn(){
document.checkForm.receive.value = $('#hp_text2').val();
if ($('#hp_text2').val()==''){
alert("휴대폰 번호를 입력해주세요.");
return;
}
var checkForm = $("form[name=checkForm]").serialize() ;
$.ajax({
url : "<c:url value='/web/user/sendSysMsgSelectAjax.do' />",
type : 'POST',
data : checkForm,
dataType:'json',
success : function(returnData, status){
if(status == "success") {
if(returnData.compare){
step1IdCheck();
}else{
alert("인증번호 발송은 1분마다 가능합니다.");
return;
}
}else{ alert("실패");return;}
},
error : function(request , status, error){
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
}
});
}
function textClear(pram){
var area = pram;
$('#'+area).val('');
}
function saveid(form) {
var expdate = new Date();
// 기본적으로 30일동안 기억하게 함. 일수를 조절하려면 * 30에서 숫자를 조절하면 됨
if (form.checkId.checked)
expdate.setTime(expdate.getTime() + 1000 * 3600 * 24 * 30); // 30일
else
expdate.setTime(expdate.getTime() - 1); // 쿠키 삭제조건
setCookie("ncms_saveid", form.id_text2.value, expdate);
}
function setCookie (name, value, expires) {
document.cookie = name + "=" + escape (value) + "; path=/; expires=" + expires.toGMTString();
}
function getid(form){
if(getCookie("ncms_saveid") != ""){
form.checkId.checked = (form.id_text2.value = getCookie("ncms_saveid"));
}
/* form.checkId.checked = ((form.id_text.value = getCookie("ncms_saveid")) != ""); */
}
function getCookie(Name) {
var search = Name + "="
if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면
offset = document.cookie.indexOf(search)
if (offset != -1) { // 쿠키가 존재하면
offset += search.length
// set index of beginning of value
end = document.cookie.indexOf(";", offset)
// 쿠키 값의 마지막 위치 인덱스 번호 설정
if (end == -1)
end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
}
return "";
}
//로그인 화면 비밀번호 보기 추가
function fn_passView(obj){
var passInputType = $('#password_text2').prop("type");
if(passInputType == 'text'){
$('#password_text2').prop("type", "password");
//비밀번호 보호 이미지
$(obj).find('img').attr('src', '/publish/images/content/password_protect.png');
}else{
$('#password_text2').prop("type", "text");
//비밀번호 비보호 이미지
$(obj).find('img').attr('src', '/publish/images/content/password_protect2.png');
}
}
//함수명: 배너 클릭하면 통계 추가 (2023-05-17 최남규) - 메인화면(mainPage.jsp)에도 같음 함수명 추가했음(단, 배너 갯수 다름)
//설명: 베너코드(ITN054)와 메뉴코드(ITN055) 조합코드 전달 후 Ajax.do 에서 '_' 분리후 날짜와 배너코드와 메뉴코드와 클릭수 +1
// 테이블(mj_banner_click_stat)에 최초 등록 후 이후 전체접속수(CLICK_A_CNT+1)를 수정
//배너 추가될때 배너코드를 공통코드(ITN054) 추가
//배너클릭통계-배너코드(ITN054): 원키퍼: 001, 간판다움: 002, NORDIC TOOLS: 003, 폰더하기: 004
//배너클릭통계-메뉴코드(ITN055): 메인:01, 로그인: 02
function fn_click_banner_add_stat(bannerMenuCode){
console.log("fn_click_banner_add_stat 배너 선택 "+ bannerMenuCode) ;
if (bannerMenuCode == "001_02")
{
window.open("https://www.one-keeper.co.kr/cp/munjaon/index.aspx"); // 새탭에서 열림
} else if (bannerMenuCode == "002_02")
{
window.open("http://ganpandaum.co.kr"); // 새탭에서 열림
}
var _param = { "bannerMenuCode" : bannerMenuCode }
$.ajax({
type : "POST",
async : false,
url : "/web/main/insertBannerClickStatAjax.do",
data : _param,
dataType:'json',
success : function(data) {
//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;
}
});
}
</script>
<div class="inner">
<form:form id="loginForm2" name="loginForm2" method="post">
<input type="hidden" name="beforeUrl" value="<c:out value='/web/user/login/login.do'/>"/>
<input type="hidden" name="userSe" value="USR"/>
<input type="hidden" id="RSAModulus2" value="${RSAModulus}"/>
<input type="hidden" id="RSAExponent2" value="${RSAExponent}"/>
<input type="hidden" id="id" name="id">
<input type="hidden" id="password" name="password">
<input type="hidden" name="goEventPay" value="${goEventPay}"/>
<input type="hidden" id="hp" name="hp">
<input type="hidden" id="num" name="num">
<input type="hidden" id="passFlag" name="passFlag">
<div class="send_top">
<div class="mypage_content current">
<div class="heading">
<h2>로그인</h2>
</div>
<div class="mem_cont_in widthS login_wrap">
<div class="input_list">
<p class="welcome">
<span>문자온</span>에 오신것을 환영합니다.<br>
<span class="c_222 fwMd">로그인</span>해주세요.
</p>
<div class="input_list_item" id="input_list_item_1">
<div class="input_left">아이디</div>
<div class="input_right">
<label for="list_inputType1" class="label">아이디</label>
<input type="text" id="id_text2" class="list_inputType1" placeholder="아이디를 입력해주세요"
onfocus="this.placeholder=''" onblur="this.placeholder='아이디를 입력해주세요'" onkeypress="press(event);" maxlength="20">
</div>
<div class="login_del">
<button type="button" onclick="textClear('id_text2')" tabindex="-1">
<img src="/publish/images/content/login_del.png" alt="입력 삭제">
</button>
</div>
</div>
<div class="input_list_item" id="input_list_item_2">
<div class="input_left">비밀번호</div>
<div class="input_right">
<label for="list_inputType1" class="label">비밀번호 입력</label>
<input type="password" id="password_text2" class="list_inputType1" placeholder="비밀번호를 입력해주세요"
onfocus="this.placeholder=''" onblur="this.placeholder='비밀번호를 입력해주세요'" onkeypress="if(event.keyCode==13) {actionLoginPage(); return false;}">
</div>
<div class="login_del">
<!-- <i class="password_protect"></i> -->
<button type="button" onclick="fn_passView(this); return false;" tabindex="-1">
<img id="passViewImg" src="/publish/images/content/password_protect.png" alt="비밀번호 보기">
</button>
<button type="button" onclick="textClear('password_text2')" tabindex="-1">
<img src="/publish/images/content/login_del.png" alt="입력 삭제">
</button>
</div>
</div>
<c:if test="${fail}">
<div class="pass_no2" id="input_list_item_0">
<p>
<i></i>아이디 또는 비밀번호가 일치하지 않습니다.
</p>
</div>
</c:if>
<c:if test="${fail2}">
<div class="pass_no2" id="input_list_item_0">
<p>
<i></i>인증번호가 일치하지 않습니다.
</p>
</div>
</c:if>
<div class="pass_no2" style="display:none;" id="ret_msg">
<p id="ret_msg_info">
<i></i>아이디 또는 비밀번호가 일치하지 않습니다.
</p>
</div>
<div class="mem_btnWrap2" id="input_list_item_3">
<button type="button" class="mem_btn5" onclick="javascript:actionLoginPage(); return false;">로그인</button>
</div>
<div class="input_list_item" id="input_list_item_4" style="display:none;">
<div class="input_left">휴대폰번호</div>
<div class="input_right">
<label for="list_inputType1" class="label">휴대폰번호</label>
<!-- <input type="text" id="hp_text2" class="list_inputType1" placeholder="가입휴대폰번호" style="width: 250px;" -->
<!-- onfocus="this.placeholder=''" onblur="this.placeholder='가입휴대폰번호'" maxlength="20" readonly> -->
<select id="hp_text2" class="list_selType1" style="width:70%;">
</select>
</div>
<div class="login_del">
<button type="button" class="btnType btnType3" onclick="sendMsgYn();">인증번호 받기</button>
</div>
</div>
<div class="input_list_item" id="input_list_item_5" style="display:none;">
<div class="input_left">인증번호 입력</div>
<div class="input_right">
<label for="list_inputType1" class="label">인증번호 입력</label>
<input type="text" id="num_text2" class="list_inputType1" placeholder="인증번호를 입력해주세요" maxlength="6"
onfocus="this.placeholder=''" onblur="this.placeholder='인증번호를 입력해주세요'" onkeypress="if(event.keyCode==13) {return false;}">
</div>
<div class="login_del">
<!-- <i class="password_protect"></i> -->
<button type="button" onclick="textClear('num_text2')" tabindex="-1">
<img src="/publish/images/content/login_del.png" alt="입력 삭제">
</button>
</div>
</div>
<div class="mem_btnWrap2" id="input_list_item_6" style="display:none;">
<button type="button" class="mem_btn5" onclick="javascript:actionLogin_end(); return false;">확인</button>
</div>
<div class="lgoin_bottom clearfix">
<div>
<div class="checkbox_wrap">
<input type="checkbox" id="save_id" name="checkId" title="아이디 저장" class="joinCheckbox type3">
<label for="save_id">아이디 저장</label>
</div>
</div>
<ul>
<li><a href="/web/user/login/selectUserDept.do">회원가입</a></li>
<li class="SortLine"><a href="/web/user/findUserId.do">아이디찾기</a></li>
<li class="SortLine"><a href="/web/user/rePassword.do">비밀번호찾기</a></li>
</ul>
</div>
<ul class="adv_list">
<!-- <li><a href="https://www.ubikey.co.kr/" target="_blank"><img src="/publish/images/adv/adv_login_ubikey.png" alt="인증서를 사용하는 곳이면 어디서나 편리하게! 휴대폰 인증서 서비스 UBIKEY"></a></li> -->
<!--
<li><a href="https://twww.one-keeper.co.kr/cp/munjaon/index.aspx" target="_blank"><img src="/publish/images/adv/adv_login_onekeeper.png" alt="소중한 내 개인정보! 원키퍼로 내가 지킨다!"></a></li>
<li><a href="http://ganpandaum.co.kr/" target="_blank"><img src="/publish/images/adv/adv_login_ganpandaum.png" alt="간판다움 간판 잘하는 청년들이 뭉쳤다 간판, 인테리어, 네온, 썬팅, 어닝, 실사"></a></li>
-->
<!--
<li><a href="#" target="_blank" onclick="fn_click_banner_add_stat('001_02'); return false;" ><img src="/publish/images/adv/adv_login_onekeeper.png" alt="소중한 내 개인정보! 원키퍼로 내가 지킨다!"></a></li>
<li><a href="#" target="_blank" onclick="fn_click_banner_add_stat('002_02'); return false;" ><img src="/publish/images/adv/adv_login_ganpandaum.png" alt="간판다움 간판 잘하는 청년들이 뭉쳤다 간판, 인테리어, 네온, 썬팅, 어닝, 실사"></a></li>
-->
</ul>
</div>
</div>
<!--// 비밀번호 확인 -->
</div>
</div>
<!--// 마이페이지 - 회원정보 변경 -->
</form:form>
<form name="checkForm" id="checkForm" method="post" action="#">
<input type="hidden" name="searchNm" value=""/>
<input type="hidden" name="userId" value=""/>
<input type="hidden" name="callTo" value=""/>
<input type="hidden" name="receive" value=""/>
</form>
<form name="cmpChangeForm" id="cmpChangeForm" method="post" action="#">
<input type="hidden" name="mberId" value=""/>
</form>
</div>

View File

@ -18,8 +18,6 @@
$(document).ready(function(){ $(document).ready(function(){
console.log("12111111111111");
// console.log(' + $(#tabDision).val() : ',$('#tabDision').val()) // console.log(' + $(#tabDision).val() : ',$('#tabDision').val())
// if($('#tabDision').val() == 'tab02'){ // if($('#tabDision').val() == 'tab02'){
@ -1120,7 +1118,19 @@ $(document).ready(function (){
.filter(num => num !== "") .filter(num => num !== "")
.filter(num => isValidPhoneNumber(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 초기화
textarea.val(''); // jQuery 객체에서 값을 초기화할 때는 .val('') 사용 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; form.mmsSubject.value = msgForm.mmsSubject.value;
} else { } else {
form.mmsSubject.value = ""; //초기화 form.mmsSubject.value = ""; //초기화
@ -3411,7 +3421,7 @@ function fnTestSend(){
form.eachPrice.value = '<c:out value="${longPrice}" />'; form.eachPrice.value = '<c:out value="${longPrice}" />';
//제목 사용한 경우 //제목 사용한 경우
if($("input[name=title_status]:checked").val() == 'Y') { if($("input[name=subjectChkYn]:checked").val() == 'Y') {
form.mmsSubject.value = msgForm.mmsSubject.value; form.mmsSubject.value = msgForm.mmsSubject.value;
} else { } else {
form.mmsSubject.value = ""; //초기화 form.mmsSubject.value = ""; //초기화
@ -3964,6 +3974,8 @@ function getMjMsgSentListAll(pageNo) {
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</h2> </h2>
<!-- /web/mjon/msgdata/selectMsgDataSMLViewAjax.do -->
<!-- MsgDataSMLView.jsp -->
<button type="button" class="button info" onclick="infoPop('selectMsgDataView1');">사용안내</button> <button type="button" class="button info" onclick="infoPop('selectMsgDataView1');">사용안내</button>
</div> </div>
<div class="send_general"> <div class="send_general">
@ -4018,9 +4030,9 @@ function getMjMsgSentListAll(pageNo) {
<td> <td>
<ul class="title_wrap"> <ul class="title_wrap">
<li> <li>
<input id="title_y" type="radio"name="title_status" value="Y" onchange="titleStatus(this);"> <input id="title_y" type="radio"name="subjectChkYn" value="Y" onchange="titleStatus(this);">
<label for="title_y">사용</label> <label for="title_y">사용</label>
<input id="title_n" type="radio" name="title_status" value="N" onchange="titleStatus(this);" checked="checked"> <input id="title_n" type="radio" name="subjectChkYn" value="N" onchange="titleStatus(this);" checked="checked">
<label for="title_n">사용안함</label> <label for="title_n">사용안함</label>
</li> </li>
<li class="textbox"> <li class="textbox">

View File

@ -71,8 +71,6 @@ $(document).ready(function(){
</div> </div>
</div> </div>
<div class="btn_wrap"> <div class="btn_wrap">
<!-- <button type="button" class="btnType btnType2" style="margin:50px 0;" onclick="progressStart(10,'완료되었습니다.');">시작</button>
<button type="button" class="btnType btnType2" style="margin:50px 0;" onclick="progressComplete('완료되었습니다.');return false;">멈춤</button> -->
</div> </div>
</div> </div>
@ -123,18 +121,18 @@ $(document).ready(function(){
</div> </div>
</div> </div>
</div> </div>
<div class="inner"> <div class="inner">
<!-- send top --> <!-- send top -->
<div class="send_top"> <div class="send_top">
<!-- tab button --> <!-- tab button -->
<ul class="tabType1"> <ul class="tabType1">
<li class="tab ${tabDision eq 'tab01' ? 'active' : ''}"> <li class="tab ${tabDision eq 'tab01' ? 'active' : ''}">
<button type="button" onclick="javascript:fnMsgDataView(); return false;">일반문자</button> <button type="button" onclick="javascript:fnMsgDataView(); return false;">일반문자</button>
</li> </li>
<li class="tab ${tabDision eq 'tab02' ? 'active' : ''}"> <li class="tab ${tabDision eq 'tab02' ? 'active' : ''}">
<button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량문자(광고문자)</button> <button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량문자(광고문자)</button>
</li> </li>
</ul><!--// tab button --> </ul><!--// tab button -->
<!-- tab content1 --> <!-- tab content1 -->
<!-- <span id="contentArea"></span> --> <!-- <span id="contentArea"></span> -->
<div class="top_content ${tabDision eq 'tab02' ? 'get_excel' : ''} current contentArea" id="tab1_1" style="min-height: 555px;"></div> <div class="top_content ${tabDision eq 'tab02' ? 'get_excel' : ''} current contentArea" id="tab1_1" style="min-height: 555px;"></div>

View File

@ -3,19 +3,23 @@
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ 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" %> <%@ page import="itn.com.cmm.LoginVO" %>
<script src="/publish/js/content.js"></script> <script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script> <script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript"> <script type="text/javascript">
/* 문자 발송결과 리스트 advc*/
$(document).ready(function(){ $(document).ready(function(){
var startDate = '${startDate}'; // var searchStartDate = '${searchStartDate}';
var endDate = '${endDate}'; // console.log('searchStartDate : ', searchStartDate);
// var searchEndDate = '${searchEndDate}';
// console.log('searchEndDate : ', searchEndDate);
// DatePicker 값 수정 // // DatePicker 값 수정
var startDatePicker = $('#startDate').pickadate('picker'); // var startDatePicker = $('#searchStartDate').pickadate('picker');
startDatePicker.set('select', startDate, { format: 'yyyy/mm/dd' }); // startDatePicker.set('select', searchStartDate, { format: 'yyyy/mm/dd' });
startDatePicker = $('#endDate').pickadate('picker'); // startDatePicker = $('#searchEndDate').pickadate('picker');
startDatePicker.set('select', endDate, { format: 'yyyy/mm/dd' }); // startDatePicker.set('select', searchEndDate, { format: 'yyyy/mm/dd' });
/* 목록 정렬 항목 아이콘 표시 */ /* 목록 정렬 항목 아이콘 표시 */
@ -58,21 +62,96 @@ $(document).ready(function(){
} }
}); });
if($("#tdType").val() == "groupList"){
$('td[name="listTd"]').attr("rowspan", "2")
}else{
$('tr[name="listTr"]').remove();
$('td[name="listSucc"]').remove();
}
}); });
function fn_sentDetailView(msgGroupId) {
// msgGroupId 값을 form에 설정
$("#searchForm #msgGroupId").val(msgGroupId);
// form을 해당 URL로 제출
$("#searchForm").attr("action", "/web/mjon/msgsent/msgSentDetailView.do");
$("#searchForm").submit();
}
// function fnReservCancel(msgGroupId, agentCode, msgType){
function fnReservCancel(msgGroupId){
var form = document.resCancelForm;
var loginVO = '${LoginVO}';
form.msgGroupId.value = msgGroupId;
// form.agentCode.value = agentCode;
// form.msgType.value = msgType;
if(loginVO == "" || loginVO == null){
alert("로그인 후 이용이 가능합니다.");
return false;
}
console.log('msgGroupId : ', msgGroupId);
var data = new FormData(form);
url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do";
if(confirm("정말 예약을 취소하시겠습니까?")){
$.ajax({
type: "POST",
url: url,
data: data,
dataType:'json',
async: true,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if("fail"==returnData.result){
alert(returnData.message);
return false;
}
// var smsCnt = returnData.resultSts;
alert("예약 발송이 정상적으로 취소 되었습니다.");
//예약 관리 리스트 다시 불러오기
linkPage(1);
//현황도 갱신 필요하여 새로고침으로 변경
// location.reload(true);
} else if(status== 'fail'){
alert(returnData.message);
}
},
error: function (e) {
alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e);
},
beforeSend : function(xmlHttpRequest) {
//로딩창 show
$('.loading_layer').addClass('active');
},
complete : function(xhr, textStatus) {
//로딩창 hide
$('.loading_layer').removeClass('active');
}
});
}
}
</script> </script>
<div class="list_info"> <div class="list_info">
<input type="hidden" id="tdType" value="${mjonMsgSentVO.listType}"> <p>총 <span class="c_e40000" id="testId"><c:out value="${totalRecordCount}"/></span>건</p>
<p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<div> <div>
<p class="cf_text c_e40000">※ 예약문자 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
<label for="pageUnit" class="label">줄보기 선택</label> <label for="pageUnit" class="label">줄보기 선택</label>
<select id="pageUnit" name="pageUnit" class="selType2"> <select id="pageUnitS" class="selType2">
<option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option> <option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
<option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option> <option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option>
<option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option> <option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option>
@ -84,134 +163,100 @@ $(document).ready(function(){
<div class="tb_wrap"> <div class="tb_wrap">
<table class="tType4"> <table class="tType4">
<colgroup> <colgroup>
<col style="width: 40px;"> <col style="width: 45px;">
<col style="width: 12%;"> <col style="width: 12%;">
<col style="width: 8%;"> <col style="width: 8%;">
<col style="width: 90px;"> <col style="width: auto;">
<col style="width: 10%;">
<col style="width: 15%;">
<col style="width: 12%;">
<col style="width: 8%;"> <col style="width: 8%;">
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}"> <col style="width: 6%;">
<col style="width: 8%;"> <col style="width: 6%;">
<col style="width: 8%;"> <col style="width: 6%;">
</c:if> <col style="width: 6%;">
<col style="width: 11%;">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
<th> <th rowspan="2">
<label for="allCheck" class="label">전체 선택</label> <label for="allCheck" class="label">전체 선택</label>
<input type="checkbox" id="allCheck" name="allCheck"> <input type="checkbox" id="allCheck" name="allCheck">
</th> </th>
<th>발송일시 <th rowspan="2">발송일시
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate"> <input type="button" class="sort sortBtn" id="sort_reqdate">
</div> </div>
</th> </th>
<th>형태 <th rowspan="2">형태
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_orderByCode"> <input type="button" class="sort sortBtn" id="sort_orderByCode">
</div> </div>
</th> </th>
<th>발송방식 <th rowspan="2">내용</th>
<div class="sort_wrap"> <th rowspan="2">
<input type="button" class="sort sortBtn" id="sort_sendKind">
</div>
</th>
<th>내용</th>
<th>받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<th>
발송건수 발송건수
<div class="sort_wrap"> <div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt"> <input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div> </div>
</th> </th>
</c:if> <th colspan="3">결과</th>
<th>결과</th> <th rowspan="2">금액(원)</th>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}"> <th rowspan="2">진행상황</th>
<th>건수</th> <!-- <th>금액</th> -->
</c:if> </tr>
<th>금액</th> <tr>
<th>대기</th>
<th>성공</th>
<th>실패</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<c:choose> <c:choose>
<c:when test="${not empty resultAllSentList}"> <c:when test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status"> <c:forEach var="result" items="${resultAllSentList}" varStatus="status">
<c:set var="replaceCnt" value="0" />
<c:set var="electionCnt" value="0" />
<c:set var="advertisementCnt" value="0" />
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'[*이름*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*1*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*2*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*3*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*4*]') != -1}">
<c:set var="replaceCnt" value="1" />
</c:if>
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(선거운동정보)') == 0}">
<c:set var="electionCnt" value="1" />
</c:if>
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(광고)') == 0}">
<c:set var="advertisementCnt" value="1" />
</c:if>
<tr> <tr>
<td name="listTd"> <td>
<label for="msgSentDel${status.count}" class="label">선택</label> <label for="msgSentDel${status.count}" class="label">선택</label>
<c:choose> <c:choose>
<c:when test="${resultAllSentList.curState == '0'}"> <c:when test="${result.statusCd eq '03' or result.statusCd eq '01'}">
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" disabled> <input type="checkbox" disabled>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<c:choose> <input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${result.msgGroupId}">
<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}">
</c:when>
<c:otherwise>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgSeq}">
</c:otherwise>
</c:choose>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</td> </td>
<td name="listTd"> <td>
<c:choose> <c:choose>
<c:when test="${resultAllSentList.delayYn eq 'Y' && resultAllSentList.delayCompleteYn eq 'N'}"> <c:when test="${result.delayYn eq 'Y' && result.delayCompleteYn eq 'N'}">
<c:choose> <c:choose>
<c:when test="${resultAllSentList.curState eq '0'}"> <c:when test="${result.curState eq '0'}">
<%-- <%--
20240906 추가 20240906 추가
발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다. 발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다.
30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌
--%> --%>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.delayOrgTime}" /></p> <p>${result.delayOrgTime}</p>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p> <p>${result.reqDate}</p>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p> <p>${result.reqDate}</p>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</td> </td>
<td name="listTd"> <td>
<p> <p>
<c:choose> <c:choose>
<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt eq 0 }"> <c:when test="${result.msgType eq '6' && result.fileCnt eq 0 }">
장문 장문
</c:when> </c:when>
<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt ne 0 }"> <c:when test="${result.msgType eq '6' && result.fileCnt ne 0 }">
그림 그림
</c:when> </c:when>
<c:otherwise> <c:otherwise>
@ -220,239 +265,69 @@ $(document).ready(function(){
</c:choose> </c:choose>
</p> </p>
</td> </td>
<td name="listTd"> <td class="result_cont">
<p> <div class="icon_wrap">
<c:choose> <c:if test="${result.reserveYn eq 'Y'}">
<c:when test="${resultAllSentList.sendKind eq 'H' }"> <span class="re">예약</span>
WEB <!-- 예약일때만 분할이 있음 -->
</c:when> <c:if test="${result.divideYN eq 'Y'}">
<c:when test="${resultAllSentList.sendKind eq 'A'}"> <span class="di">분할</span>
API </c:if>
</c:when> </c:if>
<c:otherwise> <a href="#none" onclick="fn_sentDetailView('${result.msgGroupId}')">
-
</c:otherwise>
</c:choose>
</p>
</td>
<td name="listTd">
<button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button>
<button class="btnType btnType20" onClick="javascript:fnMjMsgReSendAll('${resultAllSentList.msgGroupId}','${replaceCnt}','${electionCnt}','${advertisementCnt}'); return false;">재전송</button>
</td>
<td name="listTd">
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
<c:choose> <c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}"> <c:when test="${result.subjectChkYn eq 'Y' }">
<p> <c:out value="${result.subject }" />
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p> <c:out value="${result.smsTxt}" />
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:when> </a>
<c:otherwise> </div>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</td> </td>
<td name="listTd"> <td>
<p><c:out value="${resultAllSentList.callFromComma}"/></p> <p><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /> </p>
</td> </td>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}"> <td>
<td name="listTd"> <p><fmt:formatNumber value="${result.resultWValue}" type="number" groupingUsed="true" /> </p>
<p><c:out value="${resultAllSentList.msgGroupCnt}"/></p>
</td> </td>
</c:if> <td>
<!-- 발송 성공/실패 listType에 따른 전송건별(groupList), 개인별 리스트 처리--> <p class="c_002c9a"><fmt:formatNumber value="${result.resultSValue}" type="number" groupingUsed="true" /> </p>
<c:set var="succ" value="0"/> <!-- 정상수신--> </td>
<c:set var="fail" value="0"/> <!-- 수신실패--> <td>
<c:set var="wait" value="0"/> <!-- 결과대기--> <p class="c_e40000"><fmt:formatNumber value="${result.resultFValue}" type="number" groupingUsed="true" /> </p>
<c:set var="succPrice" value="0"/> <!-- 정상수신 가격--> </td>
<c:set var="failPrice" value="0"/> <!-- 수신실패 가격--> <td>
<c:set var="waitPrice" value="0"/> <!-- 결과대기 가격-->
<c:set var="msgResultSts" value=""/><!-- 결과상태 확인 -->
<c:forEach var="resultMsgSFList" items="${resultMsgSucFailList}" varStatus="status">
<c:choose> <c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList'}"> <c:when test="${result.totPrice eq '-' }">
<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId}"> <c:out value="${result.totPrice }" />
<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
</c:if>
</c:if>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId && resultAllSentList.msgSeq == resultMsgSFList.msgSeq}"> <fmt:formatNumber value="${result.totPrice }" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
<c:set var="msgResultSts" value="${resultMsgSFList.msgResultSts}"/>
<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
</c:if>
</c:if>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach>
<td name="listSucc">
<p class="fwRg c_002c9a">정상수신</p>
</td> </td>
<td name="listSucc"> <td>
<c:choose> <c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList' && succ > 0}"> <c:when test="${result.statusCd ne '03' }">
<p class="fwRg c_002c9a" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p> <ec:code codeId="ITN057" code="${result.statusCd }" />
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<p class="fwRg c_002c9a"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p> <p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${result.msgGroupId}'); return false;">예약취소</button></p>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</td>
<!-- 과금/비과금 --> <!-- -->
<td name="listSucc">
<p class="fwRg c_002c9a">
<c:choose>
<c:when test="${succPrice > 0}">
<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td> </td>
<c:if test="${mjonMsgSentVO.listType != 'groupList'}">
<c:if test="${msgResultSts == 'S'}">
<td>
<p class="fwRg c_002c9a">정상수신</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_002c9a">
<c:choose>
<c:when test="${succPrice > 0}">
<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
<c:if test="${msgResultSts == 'F'}">
<td>
<p class="fwRg c_e40000">수신오류</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_e40000">
<c:choose>
<c:when test="${failPrice > 0}">
<fmt:formatNumber value="${failPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
<c:if test="${msgResultSts == 'W'}">
<td>
<p class="fwRg c_e40000">결과대기</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_e40000">
<c:choose>
<c:when test="${waitPrice > 0}">
<fmt:formatNumber value="${waitPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
</c:if>
</tr>
<tr name="listTr">
<td>
<p class="c_222">실패/대기</p>
</td>
<td>
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList' && (fail+wait) > 0}">
<p class="c_222" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;">
<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
</p>
</c:when>
<c:otherwise>
<p class="c_222">
<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
</p>
</c:otherwise>
</c:choose>
</td>
<td>
<p class="c_222">
<c:choose>
<c:when test="${(failPrice+waitPrice) > 0}">
<fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</tr> </tr>
</c:forEach> </c:forEach>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<tr> <tr>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}"> <td colspan="10">발송 내역이 없습니다.</td>
<td colspan="11">발송 내역이 없습니다.</td>
</c:if>
<c:if test="${mjonMsgSentVO.listType ne 'groupList'}">
<td colspan="9">발송 내역이 없습니다.</td>
</c:if>
</tr> </tr>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
@ -462,14 +337,14 @@ $(document).ready(function(){
<div class="table_btn clearfix"> <div class="table_btn clearfix">
<div class="table_btn_left"> <div class="table_btn_left">
<!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) --> <!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) -->
<!-- <button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button> --> <button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button>
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button> <!-- <button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button> -->
<button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button> <%-- <button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button> --%>
<button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button> <%-- <button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button> --%>
</div> </div>
<div class="table_btn_right"> <div class="table_btn_right">
<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${mjonMsgSentVO.tabType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button> <button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad(); return false;"><i class="downroad"></i>발송결과 리스트</button>
<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button> <%-- <button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button> --%>
</div> </div>
</div> </div>
<c:if test="${!empty resultAllSentList}"> <c:if test="${!empty resultAllSentList}">
@ -477,3 +352,12 @@ $(document).ready(function(){
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" /> <ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul> </ul>
</c:if> </c:if>
<form name="detailForm" id="detailForm" method="post">
<input type="hidden" name="msgGroupId" id="msgGroupId" value=""/>
</form>
<form id="resCancelForm" name="resCancelForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
</form>

View File

@ -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" %>
<script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var startDate = '${startDate}';
var endDate = '${endDate}';
// DatePicker 값 수정
var startDatePicker = $('#startDate').pickadate('picker');
startDatePicker.set('select', startDate, { format: 'yyyy/mm/dd' });
startDatePicker = $('#endDate').pickadate('picker');
startDatePicker.set('select', endDate, { format: 'yyyy/mm/dd' });
/* 목록 정렬 항목 아이콘 표시 */
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);
}
//체크박스 전체 선택 및 해제
var allChkSts = false;
$("#allCheck").click(function(){
if(!allChkSts){// 전체선택이 해제되어 있을 경우
$("input[name=msgSentDel]").prop("checked", true);
allChkSts = true;
//발송 대기건은 선택 삭제가 안되도록 처리함
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
$(this).prop("checked", false);
}
});
}else{
$("input[name=msgSentDel]").prop("checked", false);
allChkSts = false;
}
});
if($("#tdType").val() == "groupList"){
$('.listTd').attr("rowspan", "2")
}else{
$('.listTr').remove();
$('.listSucc').remove();
}
});
</script>
<div class="list_info">
<input type="hidden" id="tdType" value="${mjonMsgSentVO.listType}">
<p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<div>
<label for="pageUnit" class="label">줄보기 선택</label>
<select id="pageUnit" name="pageUnit" class="selType2">
<option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
<option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option>
<option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option>
<option value="100" <c:if test="${paginationInfo.recordCountPerPage == '100'}">selected</c:if> >100개보기</option>
</select>
</div>
</div>
<!-- 받는사람(전송건별) - 전체 -->
<div class="tb_wrap">
<table class="tType4">
<colgroup>
<col style="width: 40px;">
<col style="width: 12%;">
<col style="width: 8%;">
<col style="width: 90px;">
<col style="width: 10%;">
<col style="width: 15%;">
<col style="width: 12%;">
<col style="width: 8%;">
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<col style="width: 8%;">
<col style="width: 8%;">
</c:if>
</colgroup>
<thead>
<tr>
<th>
<label for="allCheck" class="label">전체 선택</label>
<input type="checkbox" id="allCheck" name="allCheck">
</th>
<th>발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th>형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_orderByCode">
</div>
</th>
<th>발송방식
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_sendKind">
</div>
</th>
<th>내용</th>
<th>받는사람
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callTo">
</div>
</th>
<th>발신번호
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_callFrom">
</div>
</th>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<th>
발송건수
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
</div>
</th>
</c:if>
<th>결과</th>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<th>건수</th>
</c:if>
<th>금액</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<c:set var="replaceCnt" value="0" />
<c:set var="electionCnt" value="0" />
<c:set var="advertisementCnt" value="0" />
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'[*이름*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*1*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*2*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*3*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*4*]') != -1}">
<c:set var="replaceCnt" value="1" />
</c:if>
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(선거운동정보)') == 0}">
<c:set var="electionCnt" value="1" />
</c:if>
<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(광고)') == 0}">
<c:set var="advertisementCnt" value="1" />
</c:if>
<tr>
<td class="listTd">
<label for="msgSentDel${status.count}" class="label">선택</label>
<c:choose>
<c:when test="${resultAllSentList.curState == '0'}">
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" disabled>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}">
</c:when>
<c:otherwise>
<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgSeq}">
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</td>
<td class="listTd">
<c:choose>
<c:when test="${resultAllSentList.delayYn eq 'Y' && resultAllSentList.delayCompleteYn eq 'N'}">
<c:choose>
<c:when test="${resultAllSentList.curState eq '0'}">
<%--
20240906 추가
발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다.
30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌
--%>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.delayOrgTime}" /></p>
</c:when>
<c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
</c:otherwise>
</c:choose>
</td>
<td class="listTd">
<p>
<c:choose>
<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt eq 0 }">
장문
</c:when>
<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt ne 0 }">
그림
</c:when>
<c:otherwise>
단문
</c:otherwise>
</c:choose>
</p>
</td>
<td class="listTd">
<p>
<c:choose>
<c:when test="${resultAllSentList.sendKind eq 'H' }">
WEB
</c:when>
<c:when test="${resultAllSentList.sendKind eq 'A'}">
API
</c:when>
<c:otherwise>
-
</c:otherwise>
</c:choose>
</p>
</td>
<td class="listTd">
<button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button>
<button class="btnType btnType20" onClick="javascript:fnMjMsgReSendAll('${resultAllSentList.msgGroupId}','${replaceCnt}','${electionCnt}','${advertisementCnt}'); return false;">재전송</button>
</td>
<td class="listTd">
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
<c:choose>
<c:when test="${resultAllSentList.msgGroupCnt > 1}">
<p>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<c:out value="${resultAllSentList.addrNm}"/>
</c:when>
<c:otherwise>
<c:out value="${resultAllSentList.callToComma}"/>
</c:otherwise>
</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
</p>
</c:when>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
<p><c:out value="${resultAllSentList.addrNm}"/></p>
</c:when>
<c:otherwise>
<p><c:out value="${resultAllSentList.callToComma}"/></p>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</td>
<td class="listTd">
<p><c:out value="${resultAllSentList.callFromComma}"/></p>
</td>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<td class="listTd">
<p><c:out value="${resultAllSentList.msgGroupCnt}"/></p>
</td>
</c:if>
<!-- 발송 성공/실패 listType에 따른 전송건별(groupList), 개인별 리스트 처리-->
<c:set var="succ" value="0"/> <!-- 정상수신-->
<c:set var="fail" value="0"/> <!-- 수신실패-->
<c:set var="wait" value="0"/> <!-- 결과대기-->
<c:set var="succPrice" value="0"/> <!-- 정상수신 가격-->
<c:set var="failPrice" value="0"/> <!-- 수신실패 가격-->
<c:set var="waitPrice" value="0"/> <!-- 결과대기 가격-->
<c:set var="msgResultSts" value=""/><!-- 결과상태 확인 -->
<c:forEach var="resultMsgSFList" items="${resultMsgSucFailList}" varStatus="status">
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId}">
<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
</c:if>
</c:if>
</c:when>
<c:otherwise>
<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId && resultAllSentList.msgSeq == resultMsgSFList.msgSeq}">
<c:set var="msgResultSts" value="${resultMsgSFList.msgResultSts}"/>
<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
</c:if>
<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
</c:if>
</c:if>
</c:otherwise>
</c:choose>
</c:forEach>
<td class="listSucc">
<p class="fwRg c_002c9a">정상수신</p>
</td>
<td class="listSucc">
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList' && succ > 0}">
<p class="fwRg c_002c9a" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>
</c:when>
<c:otherwise>
<p class="fwRg c_002c9a"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>
</c:otherwise>
</c:choose>
</td>
<!-- 과금/비과금 -->
<td class="listSucc">
<p class="fwRg c_002c9a">
<c:choose>
<c:when test="${succPrice > 0}">
<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
<c:if test="${mjonMsgSentVO.listType != 'groupList'}">
<c:if test="${msgResultSts == 'S'}">
<td>
<p class="fwRg c_002c9a">정상수신</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_002c9a">
<c:choose>
<c:when test="${succPrice > 0}">
<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
<c:if test="${msgResultSts == 'F'}">
<td>
<p class="fwRg c_e40000">수신오류</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_e40000">
<c:choose>
<c:when test="${failPrice > 0}">
<fmt:formatNumber value="${failPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
<c:if test="${msgResultSts == 'W'}">
<td>
<p class="fwRg c_e40000">결과대기</p>
</td>
<!-- 과금/비과금 -->
<td>
<p class="fwRg c_e40000">
<c:choose>
<c:when test="${waitPrice > 0}">
<fmt:formatNumber value="${waitPrice}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</c:if>
</c:if>
</tr>
<tr class="listTr">
<td>
<p class="c_222">실패/대기</p>
</td>
<td>
<c:choose>
<c:when test="${mjonMsgSentVO.listType == 'groupList' && (fail+wait) > 0}">
<p class="c_222" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;">
<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
</p>
</c:when>
<c:otherwise>
<p class="c_222">
<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
</p>
</c:otherwise>
</c:choose>
</td>
<td>
<p class="c_222">
<c:choose>
<c:when test="${(failPrice+waitPrice) > 0}">
<fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/>
</c:when>
<c:otherwise>
0
</c:otherwise>
</c:choose>
</p>
</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
<td colspan="11">발송 내역이 없습니다.</td>
</c:if>
<c:if test="${mjonMsgSentVO.listType ne 'groupList'}">
<td colspan="9">발송 내역이 없습니다.</td>
</c:if>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
<div class="table_btn clearfix">
<div class="table_btn_left">
<!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) -->
<!-- <button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button> -->
<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
<button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
</div>
<div class="table_btn_right">
<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${mjonMsgSentVO.tabType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button>
<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
</div>
</div>
<c:if test="${!empty resultAllSentList}">
<ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul>
</c:if>

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,12 @@ var thisfuledtlday = ""; //당원 마지막일
$(document).ready(function(){ $(document).ready(function(){
//초기 전체 리스트 페이지 보여주기 //초기 전체 리스트 페이지 보여주기
linkPage(1); linkPage($('#searchForm #pageIndex').val());
fn_activateTab($('#searchForm #searchCondition01').val())
fn_setActiveTab($('#searchForm #searchCondition02').val())
var date = new Date() ; var date = new Date() ;
//이전달 첫날/마지막날 조회 //이전달 첫날/마지막날 조회
@ -28,12 +33,14 @@ $(document).ready(function(){
lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ; lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ;
lastfulstday += "/01" ; lastfulstday += "/01" ;
} }
console.log('lastfulstday: ', lastfulstday);
//당월 첫날/마지막날 조회 //당월 첫날/마지막날 조회
thisfulstlday = date.getFullYear() + "/" ; thisfulstlday = date.getFullYear() + "/" ;
thisfulstlday += date.getMonth()+1 < 10 ? "0"+ (date.getMonth()+1) : date.getMonth()+1+"" ; thisfulstlday += date.getMonth()+1 < 10 ? "0"+ (date.getMonth()+1) : date.getMonth()+1+"" ;
thisfuledtlday = thisfulstlday + "/"+ new Date(date.getFullYear(), date.getMonth()+1, 0).getDate()+""; thisfuledtlday = thisfulstlday + "/"+ new Date(date.getFullYear(), date.getMonth()+1, 0).getDate()+"";
thisfulstlday += "/01" ; thisfulstlday += "/01" ;
console.log('thisfulstlday: ', thisfulstlday);
//3개월 이전 날짜 구해오기 //3개월 이전 날짜 구해오기
@ -55,6 +62,19 @@ $(document).ready(function(){
$(document).on('click', '.sort', function (){ $(document).on('click', '.sort', function (){
listSortOrd(this); listSortOrd(this);
}); });
// 탭 :: 전체 , 즉시, 예약
$(document).on('click', '.sendKindBtn', function (){
// 클릭된 버튼의 data-info 값을 전달하여 함수 호출
fn_activateTab($(this).data('info'));
linkPage(1);
});
//목록 정렬 항목 클릭 //목록 정렬 항목 클릭
function listSortOrd(obj){ 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); 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){ function linkPage(pageNo){
var form = document.searchForm; var form = document.searchForm;
var stateType = form.stateType.value;
form.pageIndex.value = pageNo; form.pageIndex.value = pageNo;
console.log('form : ', form);
var sendData = $(document.searchForm).serializeArray(); var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>'); $(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>');
$(".msgSentAllLoad").load("/web/mjon/msgsent/selectMsgSentListViewAjax.do", sendData ,function(response, status, xhr){ $(".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 기준으로 이지우가 수정 //22.04.25 구글 독스 alert 기준으로 이지우가 수정
/* if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) */ /* if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) */
if(confirm("선택한 목록을 삭제하시겠습니까?")){ if(confirm("선택한 목록을 삭제하시겠습니까?\n삭제한 목록은 복구가 불가합니다.")){
document.searchForm.msgGroupIdList.value = msgId; document.searchForm.msgGroupIdList.value = msgId;
var sendData = $(document.searchForm).serializeArray(); var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){ $(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){
}); });
// var form = document.searchForm; alert("삭제되었습니다.");
// form.action="/web/mjon/msgsent/selectMsgSentView.do"; var form = document.searchForm;
// form.submit(); 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; 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"); // 탭 선택 CSS 처리
$tabPrev.find("button").css("border-right","0"); 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){ function fnSearch(pageNo){
/* if(!fn_G_cmndataValueChk("startDate", "endDate", 3)){ /* if(!fn_G_cmndataValueChk("searchStartDate", "searchEndDate", 3)){
return; return;
}; */ }; */
fn_activateTab('')
fn_setActiveTab('')
console.log('fnSearch') console.log('fnSearch')
var form = document.searchForm; var form = document.searchForm;
@ -274,27 +263,8 @@ function prevMonth(month) {
function fnExcelDownLoad(pageType, tabType){ function fnExcelDownLoad(pageType, tabType){
var form = document.searchForm; 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("엑셀 다운로드를 하시겠습니까?")){ 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){ function fnDeleteAddrNo(listType){
@ -537,7 +492,7 @@ function fnMsgSFDetailList(msgGroupId, resultType){
} }
/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */ /* 사용내역서 클릭 시 내역서 새창 팝업 오픈
function fnShowPrintPopup(tabType, type) { function fnShowPrintPopup(tabType, type) {
//만들려는 팝업의 크기 //만들려는 팝업의 크기
var popup_wid = '840'; var popup_wid = '840';
@ -553,7 +508,7 @@ function fnShowPrintPopup(tabType, type) {
$("#searchForm").attr({"action":"/web/mjon/msgsent/printMsgSentDataAjax.do", "method":"post"}).submit(); $("#searchForm").attr({"action":"/web/mjon/msgsent/printMsgSentDataAjax.do", "method":"post"}).submit();
} }
*/
function addrGroupDuplCnt() { function addrGroupDuplCnt() {
document.searchForm.addrGrpNm.value = $('#grpNm').val(); 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 = '<table>' var v_html_pre = '<table>'
+ '<caption>구분, 충전금액, 사용금액, 잔액 등 정보를 제공하는 표</caption>' + '<caption>구분, 충전금액, 사용금액, 잔액 등 정보를 제공하는 표</caption>'
+ '<colgroup>' + '<colgroup>'
@ -891,60 +847,51 @@ function subContent(p_content_no){
</div> </div>
</div>--%> </div>--%>
<form id="searchForm" name="searchForm" method="post"> <form id="searchForm" name="searchForm" method="post">
<input type="hidden" id="pageIndex" name="pageIndex" value="1"/> <!-- <input type="hidden" id="pageIndex" name="pageIndex" value="1"/> -->
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value="${searchVO.pageIndex}" />" />
<input type="hidden" id="pageUnit" name="pageUnit" value="<c:out value="${searchVO.pageUnit}" />" />
<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/> <input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" /> <input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" /> <input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 --> <input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 -->
<input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 --> <input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 -->
<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 --> <input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 --> <input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 --> <input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/>
<input type="hidden" id="searchCondition01" name="searchCondition01" value="${searchVO.searchCondition01}"/>
<input type="hidden" id="searchCondition02" name="searchCondition02" value="${searchVO.searchCondition02}"/>
<div class="rev_content" id="tab5_1"> <div class="rev_content" id="tab5_1">
<!-- 페이지 로딩 속도를 위해서 ajax 로딩처리 -->
<div class="rev_admin" id ="revAdmin"> <!-- 발송결과 개선 : 문구추가 -->
<div class="titBox_result">
<p>- 최대 3개월간의 발송내역만 확인하실 수 있습니다.</p>
<p>- 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.</p>
<p>- 단문문자는 최대 24시간, 장문 및 그림문자는 최대 72시간까지 결과값이 수신되지 않은 경우 실패(비과금) 처리됩니다.</p>
</div> </div>
<!--// 발송결과 개선 : 문구추가 -->
<div class="excel_middle"> <div class="excel_middle">
<div class="select_btnWrap clearfix"> <div class="select_btnWrap clearfix">
<div class="btn_left"> <div class="btn_left">
<span class="cal_label">기간선택</span> <span class="cal_label">기간선택</span>
<div class="calendar_wrap"> <div class="calendar_wrap">
<input type="text" class="startDate inp calendar" title="검색 시작일" id="startDate" name="startDate" value="<c:out value='${mjonMsgSentVO.startDate}'/>" data-datecontrol="true"> <input type="text" class="searchStartDate inp calendar" title="검색 시작일" id="searchStartDate" name="searchStartDate" value="<c:out value='${mjonMsgSentVO.searchStartDate}'/>" data-datecontrol="true">
<span class="dateEtc">~</span> <span class="dateEtc">~</span>
<input type="text" class="endDate inp calendar" title="검색 종료일" id="endDate" name="endDate" value="<c:out value='${mjonMsgSentVO.endDate}'/>" data-datecontrol="true"> <input type="text" class="searchEndDate inp calendar" title="검색 종료일" id="searchEndDate" name="searchEndDate" value="<c:out value='${mjonMsgSentVO.searchEndDate}'/>" data-datecontrol="true">
</div> </div>
<!-- <button type="button">전월</button> <button type="button" onclick="setCalVal(lastfulstday,'searchStartDate');setCalVal( lastfuledday,'searchEndDate'); return false;" class="btnType btnType19">전월</button>
<button type="button">당월</button> --> <button type="button" onclick="setCalVal(thisfulstlday,'searchStartDate');setCalVal( thisfuledtlday,'searchEndDate'); return false;" class="btnType btnType19">당월</button>
<button type="button" onclick="setCalVal(lastfulstday,'startDate');setCalVal( lastfuledday,'endDate'); return false;" class="btnType btnType19">전월</button> <button type="button" onclick="fn_G_getPrevMonth('searchStartDate', 3);fn_G_getCurrDate('searchEndDate'); return false;" class="btnType btnType19">3개월</button>
<button type="button" onclick="setCalVal(thisfulstlday,'startDate');setCalVal( thisfuledtlday,'endDate'); return false;" class="btnType btnType19">당월</button>
<!-- <button type="button">3개월</button> -->
<button type="button" onclick="fn_G_getPrevMonth('startDate', 3);fn_G_getCurrDate('endDate'); return false;" class="btnType btnType19">3개월</button>
<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button> <button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
</div> </div>
<div class="btn_right"> <div class="btn_right">
<%-- <label for="searchMsgType" class="label">문자형태 선택 == ${mjonMsgSentVO.searchMsgType}</label> <label for="searchCondition" class="label">검색 조건: ${mjonMsgSentVO.searchCondition == '2' ? '발신번호' : '문자내용'}</label>
<select name="searchMsgType" id="searchMsgType" class="selType2">
<option value="">전체</option>
<option value="S" <c:if test="${mjonMsgSentVO.searchMsgType == 'S'}">selected</c:if> >단문</option>
<option value="L" <c:if test="${mjonMsgSentVO.searchMsgType == 'L'}">selected</c:if> >장문</option>
<option value="M" <c:if test="${mjonMsgSentVO.searchMsgType == 'M'}">selected</c:if> >그림</option>
</select> --%>
<c:if test="${appMgmt }">
<label for="searchCondition_01" class="label">발신방식 == ${mjonMsgSentVO.searchCondition}</label>
<select name="searchCondition_01" id="searchCondition_01" class="selType2 select_all_btn">
<option value="" <c:if test="${empty mjonMsgSentVO.searchCondition_01 }">selected</c:if> >발송방식 전체</option>
<option value="H" <c:if test="${mjonMsgSentVO.searchCondition_01 == 'H'}">selected</c:if> >WEB</option>
<option value="A" <c:if test="${mjonMsgSentVO.searchCondition_01 == 'A'}">selected</c:if> >API</option>
</select>
</c:if>
<label for="searchCondition" class="label">발신번호 선택 == ${mjonMsgSentVO.searchCondition}</label>
<select name="searchCondition" id="searchCondition" class="selType2 select_btn"> <select name="searchCondition" id="searchCondition" class="selType2 select_btn">
<option value="2" <c:if test="${mjonMsgSentVO.searchCondition == '2'}">selected</c:if> >발신번호</option> <option value="2" <c:if test="${mjonMsgSentVO.searchCondition == '2'}">selected</c:if> >발신번호</option>
<option value="3" <c:if test="${mjonMsgSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option> <option value="3" <c:if test="${mjonMsgSentVO.searchCondition == '3'}">selected</c:if> >문자내용</option>
</select> </select>
<div class="search"> <div class="search">
<label for="id" class="label"></label> <label for="id" class="label"></label>
@ -954,32 +901,72 @@ function subContent(p_content_no){
</div> </div>
</div> </div>
</div> </div>
<!-- 페이지 로딩 속도를 위해서 ajax 로딩처리 -->
<div class="rev_admin" id ="revAdmin">
</div>
<div class="list_tab_wrap2 type4"> <div class="list_tab_wrap2 type4">
<!-- tab button --> <!-- tab button -->
<ul class="list_tab"> <ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li> <li class="tab active"><button type="button" onclick="fnTabLoad(''); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('S',1); return false;">단문(SMS)</button></li> <li class="tab"><button type="button" onclick="fnTabLoad('S'); return false;">단문(SMS)</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('L',2); return false;">장문(LMS)</button></li> <li class="tab"><button type="button" onclick="fnTabLoad('L'); return false;">장문(LMS)</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('M',3); return false;">그림(MMS)</button></li> <li class="tab"><button type="button" onclick="fnTabLoad('M'); return false;">그림(MMS)</button></li>
</ul><!--// tab button --> </ul><!--// tab button -->
</div> </div>
<!-- 예약관리 > 전체 --> <!-- 예약관리 > 전체 -->
<div class="price_history_cont current" id="listTab_2"> <div class="price_history_cont current price_wrap" id="listTab_2">
<!-- tab button --> <!-- tab button -->
<div class="table_tab_wrap"> <div class="table_tab_wrap">
<ul> <!--<ul>
<li class="tab active"> <li class="tab active">
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li> <button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li> <li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li> <li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li> <li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li>
</ul><!--// tab button --> </ul>// tab button -->
<div class="tab_depth1">
<!-- tab button -->
<ul>
<li class="tab ${empty searchVO.searchCondition_01 ? 'active' : ''}">
<button type="button" class="sendKindBtn" data-info="">전체</button>
</li>
<li class="tab ${searchVO.searchCondition_01 == '0' ? 'active' : ''}">
<button type="button" class="sendKindBtn" data-info="N">즉시</button>
</li>
<li class="tab ${searchVO.searchCondition_01 == '1' ? 'active' : ''}">
<button type="button" class="sendKindBtn" data-info="Y">예약</button>
</li>
</ul>
<!--// tab button -->
<!-- <div class="tab_depth1">
<a href="#none" class="on msgGgoupList">받는사람(전송건별)</a> <a href="#none" class="on msgGgoupList">받는사람(전송건별)</a>
<a href="#none" style="display: none;"></a> <a href="#none" style="display: none;"></a>
<a href="#none" class="msgPrivateList">받는사람(개인별)</a> <a href="#none" class="msgPrivateList">받는사람(개인별)</a>
<div class="on_active">받는사람(전송건별)</div> <div class="on_active">받는사람(전송건별)</div>
</div> -->
<!-- 발송화면 개선 : 발송결과 추가-->
<div class="tab_btnbox">
<button type="button" class="btnType btnType14 check_validity">발송결과<i class="qmMark"></i></button>
<div class="info_hover_cont send_hover_cont price_hover">
<dl>
<dt class="c_222">[<span>대기</span>]</dt>
<dd>
발송은 성공하였으며, 수신자측 통신사로부터 수신여부를 확인중인 상태 <br>
<span>※ 예약문자의 경우 실발송 전까지는 “대기”로 표시</span>
</dd>
<dt class="c_002c9a">[<span>성공</span>]</dt>
<dd>발송 및 수신이 완료된 상태</dd>
<dt class="c_e40000">[<span>실패</span>]</dt>
<dd class="last">결번, 일시정지, 전화번호 오류 등의 사유로 발송이
불가한 상태</dd>
</dl>
</div>
</div> </div>
<!--// 발송화면 개선 : 발송결과 추가-->
</div> </div>
<!-- 발송관리 리스트 --> <!-- 발송관리 리스트 -->
<div class="table_cont current msgSentAllLoad" id="tableCont_1"> <div class="table_cont current msgSentAllLoad" id="tableCont_1">

View File

@ -25,14 +25,14 @@ $(document).ready(function(){
</script> </script>
<div class="rev_admin_in"> <div class="rev_admin_in">
<div class="rev_admin_top clearfix"> <div class="rev_admin_top clearfix">
<p>전체</p> <p>전체</p>
<c:set var="allTotal" value="${H_allSentCntVO.totCnt + A_allSentCntVO.totCnt }" /> <c:set var="allTotal" value="${H_allSentCntVO.totCnt}" />
<p><span><fmt:formatNumber value="${allTotal }" pattern="#,###"/></span> 건</p> <p><span><fmt:formatNumber value="${allTotal }" pattern="#,###"/></span> 건</p>
</div> </div>
<div class="rev_admin_btm admin_btm"> <div class="rev_admin_btm">
<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> <%-- <P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
<dl> <dl>
<dt>대기</dt> <dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${H_allSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_002c9a"><fmt:formatNumber value="${H_allSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@ -46,32 +46,15 @@ $(document).ready(function(){
<dd><span class="c_e40000"><fmt:formatNumber value="${H_allSentCntVO.failCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_e40000"><fmt:formatNumber value="${H_allSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl> </dl>
</div> </div>
<c:if test="${appMgmt }">
<div class="rev_admin_btm admin_btm admin_btm_api">
<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_allSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_allSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${A_allSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</c:if>
</div> </div>
<div class="rev_admin_in"> <div class="rev_admin_in">
<div class="rev_admin_top clearfix"> <div class="rev_admin_top clearfix">
<p>단문(SMS)</p> <p>단문(SMS)</p>
<c:set var="smsTotal" value="${H_smsSentCntVO.totCnt + A_smsSentCntVO.totCnt }" /> <c:set var="smsTotal" value="${H_smsSentCntVO.totCnt }" />
<p><span><fmt:formatNumber value="${smsTotal }" pattern="#,###"/></span> 건</p> <p><span><fmt:formatNumber value="${smsTotal }" pattern="#,###"/></span> 건</p>
</div> </div>
<div class="rev_admin_btm admin_btm"> <div class="rev_admin_btm">
<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> <%-- <P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
<dl> <dl>
<dt>대기</dt> <dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${H_smsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_002c9a"><fmt:formatNumber value="${H_smsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@ -85,32 +68,15 @@ $(document).ready(function(){
<dd><span class="c_e40000"><fmt:formatNumber value="${H_smsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_e40000"><fmt:formatNumber value="${H_smsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl> </dl>
</div> </div>
<c:if test="${appMgmt }">
<div class="rev_admin_btm admin_btm admin_btm_api">
<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_smsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_smsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${A_smsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</c:if>
</div> </div>
<div class="rev_admin_in"> <div class="rev_admin_in">
<div class="rev_admin_top clearfix"> <div class="rev_admin_top clearfix">
<p>장문(LMS)</p> <p>장문(LMS)</p>
<c:set var="lmsTotal" value="${H_lmsSentCntVO.totCnt + A_lmsSentCntVO.totCnt }" /> <c:set var="lmsTotal" value="${H_lmsSentCntVO.totCnt }" />
<p><span><fmt:formatNumber value="${lmsTotal }" pattern="#,###"/></span> 건</p> <p><span><fmt:formatNumber value="${lmsTotal }" pattern="#,###"/></span> 건</p>
</div> </div>
<div class="rev_admin_btm admin_btm"> <div class="rev_admin_btm">
<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> <%-- <P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
<dl> <dl>
<dt>대기</dt> <dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${H_lmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_002c9a"><fmt:formatNumber value="${H_lmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@ -124,32 +90,15 @@ $(document).ready(function(){
<dd><span class="c_e40000"><fmt:formatNumber value="${H_lmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_e40000"><fmt:formatNumber value="${H_lmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl> </dl>
</div> </div>
<c:if test="${appMgmt }">
<div class="rev_admin_btm admin_btm admin_btm_api">
<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_lmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_lmsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${A_lmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</c:if>
</div> </div>
<div class="rev_admin_in"> <div class="rev_admin_in">
<div class="rev_admin_top clearfix"> <div class="rev_admin_top clearfix">
<p>그림(MMS)</p> <p>그림(MMS)</p>
<c:set var="mmsTotal" value="${H_mmsSentCntVO.totCnt + A_mmsSentCntVO.totCnt }" /> <c:set var="mmsTotal" value="${H_mmsSentCntVO.totCnt }" />
<p><span><fmt:formatNumber value="${mmsTotal }" pattern="#,###"/></span> 건</p> <p><span><fmt:formatNumber value="${mmsTotal }" pattern="#,###"/></span> 건</p>
</div> </div>
<div class="rev_admin_btm admin_btm"> <div class="rev_admin_btm">
<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> <%-- <P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
<dl> <dl>
<dt>대기</dt> <dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${H_mmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_002c9a"><fmt:formatNumber value="${H_mmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@ -163,21 +112,4 @@ $(document).ready(function(){
<dd><span class="c_e40000"><fmt:formatNumber value="${H_mmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd> <dd><span class="c_e40000"><fmt:formatNumber value="${H_mmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl> </dl>
</div> </div>
<c:if test="${appMgmt }">
<div class="rev_admin_btm admin_btm admin_btm_api">
<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_mmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${A_mmsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${A_mmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</c:if>
</div> </div>

View File

@ -4,6 +4,8 @@
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%> <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%>
<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script> <script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script language=javascript> <script language=javascript>
@ -845,8 +847,9 @@ function callTo() {
</td> </td>
<td> <td>
<c:choose> <c:choose>
<c:when test="${not empty resultSentMsg.regdate}"> <c:when test="${not empty resultSentMsg.regDate}">
<fmt:formatDate value="${resultSentMsg.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/> <%-- <fmt:formatDate value="${resultSentMsg.regDate}" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
${fnc:setStrToDataFormatter(resultSentMsg.regDate, 'yyyy-MM-dd HH:mm:ss') }
</c:when> </c:when>
<c:otherwise> <c:otherwise>
- -

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
version="2.1">
<display-name>Custom Functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>custom-funcs</short-name>
<!-- PhoneFormatUtil 클래스의 함수 -->
<function>
<name>formatPhone</name> <!-- JSP에서 호출할 함수명 -->
<function-class>itn.com.cmm.util.StringUtil2</function-class> <!-- 해당 함수를 포함하는 Java 클래스 -->
<function-signature>java.lang.String formatPhone(java.lang.String)</function-signature> <!-- 함수의 반환 타입 및 매개변수 타입 (메서드 시그니처) -->
</function>
<function>
<name>setStrToDataFormatter</name>
<function-class>itn.com.cmm.util.DateUtils</function-class>
<function-signature>java.lang.String setStrToDataFormatter(java.lang.String, java.lang.String)</function-signature>
</function>
<!-- 예시) function 추가 - StringUtil 클래스의 함수 -->
<!--
<function>
<name>toUpper</name>
<function-class>com.example.utils.StringUtil</function-class>
<function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
</function>
-->
</taglib>

View File

@ -200,6 +200,8 @@ function XSSChange(str) {
//숫자 천단위 콤마 찍어주기 //숫자 천단위 콤마 찍어주기
function numberWithCommas(x) { function numberWithCommas(x) {
console.log(' + typeof x : ',typeof x);
console.log(' + x : ',x);
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} }
@ -1030,6 +1032,17 @@ function removeDuplicatesAndCount(array, key) {
} }
function setAllCntData(result){
console.log('result :: ', result);
// 합쳐진 데이터를 tableL에 설정합니다.
tableL.setData(result.uniqueArray);
// 중복데이터 건수 입력
setRowDupCnt(result.duplicateCount);
$('#rowTotCnt').text(result.uniqueCount)
}
function validateRowLimit(totalRows, limit = 300000) { function validateRowLimit(totalRows, limit = 300000) {
// 값과 타입 확인 // 값과 타입 확인

View File

@ -101,6 +101,7 @@ function addrClose(){
} }
//주소록 불러오기에서 수신자 리스트 추가해 주기 //주소록 불러오기에서 수신자 리스트 추가해 주기
/*
function addrToList(){ function addrToList(){
var selectedData = tableAddr.getSelectedRows(); var selectedData = tableAddr.getSelectedRows();
@ -114,10 +115,10 @@ function addrToList(){
}else{ // 선택한 Row 데이터 저장해주기 }else{ // 선택한 Row 데이터 저장해주기
// 선택한 Row 데이터 저장해주기 // 선택한 Row 데이터 저장해주기
if(selectedData.length > 500){ // if(selectedData.length > 500){
alert("최대 발송 건수는 500 입니다."); // alert("최대 발송 건수는 500 입니다.");
return false; // return false;
}else{ // }else{
for(var i=0; i < selectedData.length; i++){ for(var i=0; i < selectedData.length; i++){
//좌측 받는사람 리스트를 담아둔 배열에 데이터를 추가해 준다. //좌측 받는사람 리스트를 담아둔 배열에 데이터를 추가해 준다.
@ -137,10 +138,68 @@ function addrToList(){
//주소록 레이어 팝업의 Tabulator 데이터 지워주기 //주소록 레이어 팝업의 Tabulator 데이터 지워주기
tableAddr.clearData(); tableAddr.clearData();
} // }
} }
} }
*/
//주소록 불러오기에서 수신자 리스트 추가해 주기
function addrToList_advc(type){
// 선택된 데이터 또는 전체 데이터 변수 초기화
let selectedData = type === 'select' ? tableAddr.getSelectedRows() : tableAddr.getData();
// 데이터가 비어있으면 경고 후 종료
if (!selectedData || selectedData.length < 1) {
if(tableAddr.getDataCount() < 1){
alert("주소록을 선택해 주세요.");
}else{
alert("전화번호를 선택해 주세요.");
}
return false;
}
// 데이터 변환 로직
const addrData = selectedData.map(row => {
const rowData = type === 'select' ? row.getData() : row; // 'select'는 행 객체에서 데이터 추출
return {
phone: removeDash(rowData.phone),
};
})
.filter(row => checkHpNum(row.phone)); // 유효한 번호만 필터링;
// 기존 tableL의 데이터를 가져옵니다.
var existingData = tableL.getData();
// 기존 데이터와 새로운 데이터를 합칩니다.
var combinedData = existingData.concat(addrData);
// @ phone을 기준으로 중복 제거 및 갯수 계산
const result = removeDuplicatesAndCount(combinedData, 'phone');
// 총 30만건이 넘으면 false
if (!validateRowLimit(result.uniqueCount)) {
return false;
}
setAllCntData(result);
// 미리보기 버튼 활성화
$(".closeAddr").trigger("click");
//주소록 레이어 팝업의 Tabulator 데이터 지워주기
tableAddr.clearData();
fn_priceClclt();
}
function loadAddrList(){ function loadAddrList(){
console.log(' loadAddrList() '); console.log(' loadAddrList() ');
@ -150,7 +209,8 @@ function loadAddrList(){
*/ */
var data = $("#searchAddrGrpForm").serialize(); var data = $("#searchAddrGrpForm").serialize();
var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do"; // var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do";
var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do";
$.ajax({ $.ajax({
type: "POST", type: "POST",
@ -159,43 +219,36 @@ function loadAddrList(){
dataType:'json', dataType:'json',
async: false, async: false,
cache: false, cache: false,
success: function (returnData, status) { success: function (data) {
console.log('returnData : ', returnData); console.log('data : ', data);
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 if(data.status == "OK"){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if(returnData.result == "success"){
var addrList = data.object;
var addrList = returnData.resultAddrList;
var tableData = []; if(addrList.length == 0){
if(addrList.length == 0){ alert("주소록 정보가 없습니다.");
// tableAddr.setData([]);
alert("주소록 정보가 없습니다."); return false;
tableAddr.setData(tableData); }
return false; tableAddr.setData(addrList);
} }
else
//받는사람 리스트를 담아둔 배열에 신규 추가 데이터를 추가해 준다. {
for(var i=0; i < addrList.length; i++){ alert("주소록 불러오기에 실패하였습니다. !!");
}
tableData.push({addrGroupNm: addrList[i].addrGrpNm, addrPhone: removeDash(addrList[i].addrPhoneNo) , addrName: addrList[i].addrNm, addrRep1: addrList[i].addrInfo1, addrRep2: addrList[i].addrInfo2, addrRep3: addrList[i].addrInfo3, addrRep4: addrList[i].addrInfo4}); },
error: function (e) {
} alert("주소록 불러오기에 실패하였습니다."); console.log("ERROR : ", e);
}
//우측 주소록 리스트 Tabulator에 입력해주기 , beforeSend : function(xmlHttpRequest) {
tableAddr.setData(tableData); //로딩창 show
$('.loading_layer').addClass('active');
}else{ }
, complete : function(xhr, textStatus) {
alert(returnData.message); //로딩창 hide
return false; $('.loading_layer').removeClass('active');
}
}
} else if(status== 'fail'){
alert("주소록 불러오기에 실패하였습니다. !!");
}
},
error: function (e) { alert("주소록 불러오기에 실패하였습니다."); console.log("ERROR : ", e); }
}); });
} }
@ -267,7 +320,7 @@ function fnAddrGrpSearch(){
}); });
} }
/*
//문자발송 받는사람 목록 주소록에 등록하기 기능 처리 //문자발송 받는사람 목록 주소록에 등록하기 기능 처리
$('.registAddr').click(function(){ $('.registAddr').click(function(){
@ -331,7 +384,7 @@ $('.registAddr').click(function(){
rep4List[i] = rep4; rep4List[i] = rep4;
} }
/* if(name == "" || name == null){ if(name == "" || name == null){
alert("수신 목록에 이름이 없는 항목이 있습니다. 이름을 입력해 주세요"); alert("수신 목록에 이름이 없는 항목이 있습니다. 이름을 입력해 주세요");
return false; return false;
@ -365,7 +418,7 @@ $('.registAddr').click(function(){
rep4List[i] = rep4; rep4List[i] = rep4;
} }
} */ }
} }
@ -467,4 +520,4 @@ $('.registAddr').click(function(){
}); });
*/

View File

@ -23,12 +23,6 @@ $(document).ready(function(){
}); });
//치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행
$('.c3').click(function(){ // 엑셀파일 불러오기 선택 시
$("#excelFile").click();
});
}); });
@ -198,6 +192,7 @@ function excelAddAjax(){
* *
* */ * */
function excelExportVarAjax(){ function excelExportVarAjax(){
console.log(' :: excelExportVarAjax ::')
var data = document.getElementById('excelFile').files; var data = document.getElementById('excelFile').files;
@ -245,7 +240,7 @@ function excelAddVarAjax(){
//timeout: 600000, //timeout: 600000,
success: function (returnData, status) { success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
console.log('returnData : ', returnData);
if(returnData.success){ if(returnData.success){
var data = returnData.data; var data = returnData.data;
@ -290,10 +285,10 @@ function excelAddVarAjax(){
var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보 var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보
var $excelBody = $('#excelBody02'); var $excelBody = $('#excelBody02');
var bodyData;
var addDiv = ""; var addDiv = "";
var phoneNum; var phoneNum;
var msgCnt = 0;
//입력데이터를 역정렬해준다. //입력데이터를 역정렬해준다.
data.reverse(); data.reverse();
@ -337,6 +332,7 @@ function excelAddVarAjax(){
if(lengthCheck){ if(lengthCheck){
addDiv += excelBody; addDiv += excelBody;
msgCnt++;
} }
} }
@ -359,6 +355,9 @@ function excelAddVarAjax(){
//화면에 수신번호 및 변수 데이터 추가해 주기 //화면에 수신번호 및 변수 데이터 추가해 주기
$excelBody.append(addDiv); $excelBody.append(addDiv);
// 총 금액 계산
fn_priceClclt(msgCnt);
} }

View File

@ -12,6 +12,8 @@
* *
* *
*/ */
$(document).ready(function(){ $(document).ready(function(){

View File

@ -70,8 +70,6 @@ $(document).ready(function(){
fn_priceClclt(); fn_priceClclt();
}); });
// 대상 노드에 감시자 전달 // 대상 노드에 감시자 전달
observer_wrap01.observe(target01, option); observer_wrap01.observe(target01, option);
@ -85,18 +83,24 @@ $(document).ready(function(){
/** /**
* @description 금액 계산 function * @description 금액 계산 function
*/ */
function fn_priceClclt(){ function fn_priceClclt(phoneSu = 0){
// 미리보기 텍스트 console.log(":: at fn_priceClclt :: ");
var templateHtml = $('#smsTxtArea').val(); // 미리보기 텍스트
// var templateHtml = $('.template_text').html(); var templateHtml = $('#smsTxtArea').val();
// var templateHtml = $('.template_text').html();
// 수신 번호 개수
var phoneSu = $('.phoneArea').length; // 치환문자 여부 확인
var txtReplYn = $('#txtReplYn').val()
console.log('txtReplYn : ', txtReplYn);
// 수신 번호 개수
if(phoneSu == 0 && txtReplYn == 'Y')
phoneSu = $('.phoneArea').length;
if(phoneSu == 0 && txtReplYn == 'N')
phoneSu = tableL.getData().length;
// 대체문자 있는지 확인 // 대체문자 있는지 확인
var isSendFailChecked = $("#send_fail_check").is(":checked"); var isSendFailChecked = $("#send_fail_check").is(":checked");
// 치환문자 여부 확인
var txtReplYn = $('#txtReplYn').val()
// 대체문자 하위에 장문 / 단문 select // 대체문자 하위에 장문 / 단문 select
var msgTypeText = $('.msg_com').text().trim(); var msgTypeText = $('.msg_com').text().trim();
@ -212,8 +216,8 @@ function fn_writePriceText(msgTypeText, phoneSu){
if(msgTypeText == '단문') price = SHORT_PRICE * phoneSu; if(msgTypeText == '단문') price = SHORT_PRICE * phoneSu;
else if(msgTypeText == '장문') price = LONG_PRICE * phoneSu; else if(msgTypeText == '장문') price = LONG_PRICE * phoneSu;
else price = KAKAO_AT_PRICE * phoneSu; // 카카오 else price = KAKAO_AT_PRICE * phoneSu; // 카카오
$('#totalPriceTxt').text((price).toFixed(1)); $('#totalPriceTxt').text(numberWithCommas((price).toFixed(1)));
} }

View File

@ -12,83 +12,71 @@
* *
* *
*/ */
var tableL = null;
$(document).ready(function (){ $(document).ready(function (){
/**
//받는사람 연락처 내용 처리 //받는사람 연락처 내용 처리
//Tabulator AJAX Data Loading //Tabulator AJAX Data Loading
tableL = new Tabulator(".callList_box", { tableL = new Tabulator(".callList_box_P", {
height:"255px", height:"255px",
layout:"fitColumns", layout:"fitColumns",
//data:tabledata, headerHozAlign:"center",
//autoColumns:true, validationMode:"highlight",
headerHozAlign:"center", headerHozAlign:"center",
validationMode:"highlight", clipboard: true, // 클립보드 기능 활성화
//clipboard:false, clipboardPasteAction: "replace", // 붙여넣기 시 기존 데이터 교체 (또는 "update" 선택 가능)
//clipboardCopySelector:"table", validationMode:"highlight",
//clipboardPasteAction:"insert", // insert, update, replace placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional) resizableColumns:false,
resizableColumns:false, clipboardPasteParser: function(clipboard){
const rows = clipboard.split("\n").filter(row => row.trim() !== "");
// 1. 붙여넣기 데이터 → 가공
const newData = rows
.map(row => {
const cols = row.split("\t");
const phoneRaw = cols[0].trim();
const phone = removeDash(phoneRaw);
return { phone };
})
.filter(row => checkHpNum(row.phone));
// 2. 기존 데이터 가져오기
const existingData = tableL.getData();
// 3. 기존 데이터 + 붙여넣은 데이터 합치기
const combinedData = existingData.concat(newData);
// 4. 중복 제거 + 갯수 카운트
const result = removeDuplicatesAndCount(combinedData, 'phone');
// 5. 외부 처리 함수 호출
setAllCntData(result);
fn_priceClclt();
// 6. 테이블에 반영할 데이터 리턴
return result;
},
columnDefaults:{ // 공통설정
hozAlign: "center",
headerHozAlign: "center",
editor: false
},
columns:[ //Define Table Columns columns:[ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ {formatter:"rowSelection", titleFormatter:"rowSelection", width:60, clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
cell.getRow().toggleSelect(); cell.getRow().toggleSelect();
}}, }},
{title:"이름", hozAlign:"center", field:"name", editor:"input", validator:["maxLength:12"], cellEdited:function(cell){ // {title:"이름", hozAlign:"center", field:"name", editor:"input", validator:["maxLength:12"], cellEdited:function(cell){
//cell - cell component // //cell - cell component
fnReplCell(); // fnReplCell();
}}, // }},
{title:"휴대폰", hozAlign:"center", field:"phone", editor:"input", width:100, validator:["required","minLength:10", "maxLength:12"], cellEdited:function(cell){ {title:"휴대폰", hozAlign:"center", field:"phone", editor:"input", validator:["required","minLength:10", "maxLength:12"], cellEdited:function(cell){
//cell - cell component //cell - cell component
fnDuplPhone(); fnDuplPhone();
}}, }},
{title:"[*1*]", hozAlign:"center", field:"rep1", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){ ]
//cell - cell component
fnReplCell();
}},
{title:"[*2*]", hozAlign:"center", field:"rep2", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){
//cell - cell component
fnReplCell();
}},
{title:"[*3*]", hozAlign:"center", field:"rep3", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){
//cell - cell component
fnReplCell();
}},
{title:"[*4*]", hozAlign:"center", field:"rep4", editor:"input", minWidth:60, validator:["maxLength:40"], cellEdited:function(cell){
//cell - cell component
fnReplCell();
}},
],
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음
//take action on validation fail
var valid = cell.isValid();
var fieldNm = cell.getField();
var cellVal = cell.getValue();
var returnVal = "";
if(!valid){
if(fieldNm == "name"){
alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다.");
cell.setValue(strMaxLengthSubstring(cellVal, 11)); //스크립트 함수가 0부터 시작이므로 원하는 글자수 -1을 해줘야한다.
cell.clearValidation();
}else if(fieldNm == "phone"){
alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요.");
}else{
alert("치환문자를 정확히 입력해 주세요. 40글자 이내로 입력 가능합니다.");
cell.setValue(strMaxLengthSubstring(cellVal, 39));
cell.clearValidation();
}
//해당 셀 데이터 삭제
//cell.setValue("");
}
return value % parameters.phone;
},
}); });
*/
//주소록 불러오기 팝업 내용 //주소록 불러오기 팝업 내용
//Tabulator AJAX Data Loading //Tabulator AJAX Data Loading
tableAddr = new Tabulator(".callAddr_box", { tableAddr = new Tabulator(".callAddr_box", {
@ -99,13 +87,13 @@ $(document).ready(function (){
placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional) placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional)
resizableColumns:false, resizableColumns:false,
columns:[ //Define Table Columns columns:[ //Define Table Columns
{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){ {formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, width: 50, cellClick:function(e, cell){
cell.getRow().toggleSelect(); cell.getRow().toggleSelect();
} }
}, },
{title:"그룹명", hozAlign:"center", field:"addrGroupNm", editor:"input", width:120, validator:["required","minLength:2", "maxLength:40"]}, {title:"그룹명", hozAlign:"center", field:"addrGroupNm", widthGrow: 3, editor:"input", validator:["required","minLength:2", "maxLength:40"]},
{title:"이름", hozAlign:"center", field:"addrName", editor:"input", width:120, validator:["maxLength:12"]}, {title:"이름", hozAlign:"center", field:"name", widthGrow: 2, editor:"input", validator:["maxLength:12"]},
{title:"휴대폰번호", hozAlign:"center", field:"addrPhone", editor:"input", width:120, validator:["required","minLength:10", "maxLength:11"]}, {title:"휴대폰번호", hozAlign:"center", field:"phone", widthGrow: 3, editor:"input", validator:["required","minLength:10", "maxLength:11"]},
], ],
validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음 validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음
@ -132,53 +120,32 @@ $(document).ready(function (){
//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기 //받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
$('.addCallToF').click(function(){ $('.addCallToF').click(function(){
var callToNum = $('#callTo').val(); // checkHpNum(callToNum)
if(callToNum == null || callToNum == ""){
alert("받는사람 번호를 입력해 주세요.");
return false;
}else if(!checkHpNum(callToNum)){
alert("올바른 전화번호를 입력해 주세요.");
$('#callTo').val("");
return false;
}
//핸드폰 번호에 '-' 문자 제거하기
callToNum = removeDash(callToNum);
var dpCnt = 0; var textarea = $('#callTo');
$(".phoneArea p").each(function(index, item){ const numbers = textarea.val().split('\n')
if(this.textContent == callToNum){ .map(num => removeDash(num.trim()))
.filter(num => num !== "")
dpCnt++; .filter(num => checkHpNum(num)); // 유효한 번호만 필터링;
alert("받는사람 리스트에 동일한 연락처가 있습니다.");
$('#callTo').val("");
return false; const formattedData = numbers.map(num => ({phone: num}));
}
}); // 기존 tableL의 데이터를 가져옵니다.
var existingData = tableL.getData();
if(dpCnt > 0){ // 기존 데이터와 새로운 데이터를 합칩니다.
alert("받는사람 리스트에 동일한 연락처가 있습니다."); var combinedData = existingData.concat(formattedData);
$('#callTo').val("");
return false; // @ phone을 기준으로 중복 제거 및 갯수 계산
}else{ const result = removeDuplicatesAndCount(combinedData, 'phone');
// fn_displayJsonToHtmlTable 재사용을 위한
// 파라미터 형변환 setAllCntData(result);
var data =[];
data.push({ phone: callToNum, name: ''}); textarea.val('');
fn_displayJsonToHtmlTable(data); fn_priceClclt();
/*
* 토탈 카운트 화면에 노출
*/
updateTotCnt();
// 번호 추가란 초기화
$('#callTo').val('');
}
}); });
@ -242,48 +209,50 @@ $(document).ready(function (){
//최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기) //최근전송내역 팝업 선택추가 버튼 처리(체크내역 받는사람 리스트로 추가해주기)
$(document).on('click', '#latestAddPhone', function (){ $(document).on('click', '#latestAddPhone', function (){
var addPhoneList = []; //신규로 추가할 전화번호 저장변수 var addPhoneList = [];
$("input:checkbox[name='latAddrChk']:checked").each(function(index){ $("input:checkbox[name='latAddrChk']:checked").each(function(){
var chkPhone = $(this).val().trim();
var chkPhone = $(this).val();
console.log('b chkPhone: ', chkPhone);
if(!checkHpNum(chkPhone)){ if(!checkHpNum(chkPhone)){
// alert("올바른 전화번호가 아닙니다.");
alert("올바른 전화번호가 아닙니다."); return false;
return false; }
// console.log('a chkPhone: ', chkPhone);
}else{ addPhoneList.push(chkPhone);
});
addPhoneList.push({phone: removeDash(chkPhone.trim())});
if(addPhoneList.length < 1) {
} alert("연락처를 선택해주세요.");
return false;
}); }
if(addPhoneList.length > 0){ // 1. 기존 로직: 연락처 추가 처리
//연락처 추가해 주기 // addPhoneInfo(addPhoneList);
addPhoneInfo(addPhoneList);
$("#btnLatestAddPhoneClose").trigger("click"); // 2. Tabulator에 넣기 위한 포맷 변환
} const formattedData = addPhoneList.map(num => ({phone: num}));
else {
alert("연락처를 선택해주세요."); // 3. 기존 테이블 데이터와 합치기
return false; const existingData = tableL.getData();
} const combinedData = existingData.concat(formattedData);
//중복연락처 제거 // 4. 중복 제거
//var removeDuplData = dupliPhoneData(addPhoneList); const result = removeDuplicatesAndCount(combinedData, 'phone');
//받는사람 목록에 추가 // console.log('result: ', result);
//tableL.addData(removeDuplData); // 5. 테이블에 반영
// tableL.setData(result);
//총 받는사람 수 계산
//totRows = tableL.getRows().length; // 6. 수량/가격 계산
//updateTotCnt(totRows); setAllCntData(result);
fn_priceClclt();
//결제 금액 구하기
//totalPriceSum(totRows); // 7. 팝업 닫기
$("#btnLatestAddPhoneClose").trigger("click");
}); });
@ -375,63 +344,6 @@ $(document).ready(function (){
} }
//오류 검사 버튼 처리
$('.check_validity').click(function(){
var invalid = tableL.getInvalidCells(); //오류 데이터 체크
var dataLen = tableL.getRows().length; //연락처 데이터 갯수
var totLen = invalid.length; //오류 데이터 갯수
var errMsg = ""; //최종 alert에 표시할 메시지 저장 변수
if(dataLen > 0){ //연락처 정보가 있으면 수행
if(totLen > 0){ //내용에 오류가 있으면 수행
//오류 데이터 값 저장
for(var i=0; i < totLen; i++){
var cellValue = invalid[i].getValue();
if(i == 0){
errMsg = cellValue;
}else{
errMsg = errMsg +", "+ cellValue;
}
}
if(errMsg == "" || errMsg == null){
alert("내용에 오류가 있습니다.");
return false;
}else{
alert(errMsg + "의 내용에 오류가 있습니다.");
return false;
}
}else{
alert("오류 데이터가 없습니다.");
return false;
}
}else{
alert("연락처를 입력해 주세요.");
return false;
}
});
}); });
var tableErrorData = []; var tableErrorData = [];
@ -442,9 +354,9 @@ var totRows = 0; // 좌측 받는사람 총 갯수
* 토탈 카운트 화면에 노출 * 토탈 카운트 화면에 노출
* 변수 없는 리스트만 체크 * 변수 없는 리스트만 체크
*/ */
function updateTotCnt(){ function updateTotCnt(cnt){
$("#rowTotCnt").text($('#wrap01_body .list_body').length); $("#rowTotCnt").text(cnt);
} }
@ -456,10 +368,10 @@ function addPhoneInfo(taData){
return; return;
} }
if(taData.length > 500){ // if(taData.length > 500){
alert("최대 발송 건수는 500건 입니다."); // alert("최대 발송 건수는 500건 입니다.");
return; // return;
} // }
/* /*

View File

@ -13,6 +13,7 @@
// 문자 그룹정보 => 재전송용 // 문자 그룹정보 => 재전송용
function getMjMsgGroupInfoByResend() { function getMjMsgGroupInfoByResend() {
console.log('재전송 시 싱행되는 function');
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: "/web/mjon/msgdata/selectMjMsgGroupInfoByResendAjax.do", url: "/web/mjon/msgdata/selectMjMsgGroupInfoByResendAjax.do",
@ -33,6 +34,7 @@ function getMjMsgGroupInfoByResend() {
var smsTxt = msgData.smsTxt; var smsTxt = msgData.smsTxt;
var subject = msgData.subject; var subject = msgData.subject;
var subjectChkYn = msgData.subjectChkYn;
var fileId = ""; var fileId = "";
var filePath = ""; var filePath = "";
var len = fileData.length; var len = fileData.length;
@ -56,11 +58,13 @@ function getMjMsgGroupInfoByResend() {
console.log('msgData : ', msgData); console.log('msgData : ', msgData);
console.log('msgData : ', msgData); console.log('msgData : ', msgData);
// 문자제목 // 문자제목
if (msgData.subject != null && msgData.subject != "") { if (subject != null && subject != "") {
$('.msg_title').addClass('active'); if(subjectChkYn == 'Y'){
$("input:radio[name='title_status']:radio[value='Y']").prop('checked', true); // 선택하기 $('.msg_title').addClass('active');
$('.textbox').show(); $("input:radio[name='subjectChkYn']:radio[value='Y']").prop('checked', true); // 선택하기
$("#mmsSubject").val(subject); $('.textbox').show();
$("#mmsSubject").val(subject);
}
} }
// 문자내용 // 문자내용
@ -1255,7 +1259,7 @@ function sendMsgAjax_advc(){
}); });
// 빈 값 제거 // 빈 값 제거
removeEmptyValues(formData); removeEmptyValues(formData);
// 선택된 데이터 추가 // 선택된 데이터 추가
formData["mjonMsgSendVOList"] = $selectedData; formData["mjonMsgSendVOList"] = $selectedData;
@ -1265,8 +1269,6 @@ function sendMsgAjax_advc(){
var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do"; var url = "/web/mjon/msgdata/sendMsgDataAjax_advc.do";
// 시작 시간 // 시작 시간
const startTime = new Date();
// 프로그래스파 시간을 위한 계산 // 프로그래스파 시간을 위한 계산
var estimtedTime = calculateEstimatedTime($selectedData.length); var estimtedTime = calculateEstimatedTime($selectedData.length);
@ -1280,10 +1282,8 @@ function sendMsgAjax_advc(){
dataType: 'json', dataType: 'json',
success: function (data) { success: function (data) {
console.log('data : ', data);
var status = data.status; var status = data.status;
if("OK" == status){ if("OK" == status){ // 성공
var smsCnt = Number(data.object.resultSts); var smsCnt = Number(data.object.resultSts);
var blockCnt = Number(data.object.resultBlockSts); var blockCnt = Number(data.object.resultBlockSts);
@ -1309,19 +1309,19 @@ function sendMsgAjax_advc(){
} }
}else if("BAD_REQUEST" == status){ }else if("BAD_REQUEST" == status){ // 오류
alert(data.message); alert(data.message);
return false; return false;
}else if("UNAUTHORIZED" == status){ }else if("UNAUTHORIZED" == status){ // 정지 회원 처리
alert(data.message); alert(data.message);
//문자발송 URL Move //문자발송 URL Move
goMsgUrlMove(); goMsgUrlMove();
return false; return false;
}else if("NO_CONTENT" == status){ }else if("NO_CONTENT" == status){ // 발송로직에서 이미지 처리 오류 시 처리
$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'}); $('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
$('.pop_msg_fails .msg_text').html(returnData.message); $('.pop_msg_fails .msg_text').html(returnData.message);
@ -1363,7 +1363,7 @@ function validateForm(form) {
} }
if (form.title_status.value === 'N') { if (form.subjectChkYn.value === 'N') {
form.mmsSubject.value = ""; form.mmsSubject.value = "";
} else if (getSpacialStringChk(form.mmsSubject.value)) { } else if (getSpacialStringChk(form.mmsSubject.value)) {
alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다."); alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다.");
@ -1371,7 +1371,7 @@ function validateForm(form) {
} }
//문자제목에 이모지가 있는지 체크 //문자제목에 이모지가 있는지 체크
var titleStatusYn = $("input[name='title_status']:checked").val(); var titleStatusYn = $("input[name='subjectChkYn']:checked").val();
if(titleStatusYn == 'Y') { if(titleStatusYn == 'Y') {
if(!emojiCheck(form.mmsSubject.value)) return false; if(!emojiCheck(form.mmsSubject.value)) return false;
} }
@ -1710,15 +1710,15 @@ function msgSpamClose(obj){
function msgResultLink(){ function msgResultLink(){
var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인 var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
if(reserYn == 'Y'){ /*if(reserYn == 'Y'){
location.href="/web/mjon/reservmsg/selectReservMsgView.do"; location.href="/web/mjon/reservmsg/selectReservMsgView.do";
}else{ }else{*/
location.href="/web/mjon/msgsent/selectMsgSentView.do"; location.href="/web/mjon/msgsent/selectMsgSentView.do";
} /*}*/
} }

View File

@ -2126,7 +2126,10 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
.res_info .res_info_in .res_info_btm {margin:20px 0 0 0;padding:10px;background:#fff;border-radius:5px;box-sizing:border-box;} .res_info .res_info_in .res_info_btm {margin:20px 0 0 0;padding:10px;background:#fff;border-radius:5px;box-sizing:border-box;}
.res_info .res_info_in .res_info_btm dl {display:flex;padding:8px 10px;font-size:16px;font-weight:300;justify-content:space-between; color:#222;} .res_info .res_info_in .res_info_btm dl {display:flex;padding:8px 10px;font-size:16px;font-weight:300;justify-content:space-between; color:#222;}
.res_info .res_info_in .res_info_btm dl.charge_line {border-top:1px solid #e6e6e6; text-align:center;} .res_info .res_info_in .res_info_btm .charge_line {border-top:1px solid #e6e6e6; text-align:center; margin:0 10px; padding:7px 0 5px 0; }
.res_info .res_info_in .res_info_btm .charge_line dl {padding:7px 0 5px 10px; }
.res_info .res_info_in .res_info_btm .charge_line dl dt {font-size:15px;}
.res_info .res_info_in .res_info_btm .charge_line dl dd {padding:0; font-size:16px;}
.res_info .res_info_in .res_info_btm dl dt.charge_title {font-size:15px; padding:0 0 0 5px;} .res_info .res_info_in .res_info_btm dl dt.charge_title {font-size:15px; padding:0 0 0 5px;}
.res_info .res_info_in .res_info_btm dl dt {font-weight:400;} .res_info .res_info_in .res_info_btm dl dt {font-weight:400;}
.res_info .res_info_in .res_info_btm dl dt.btm_charge {font-size:16px;} .res_info .res_info_in .res_info_btm dl dt.btm_charge {font-size:16px;}
@ -2151,7 +2154,7 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
/* phone 기본 -- sticky */ /* phone 기본 -- sticky */
.send_top .resultcont_right .phone {width: 374px; position: absolute; right: -2px; top: 0;} .send_top .resultcont_right .phone {width: 374px; position: absolute; right: -2px; top: 0;}
.send_top .resultcont_right .phone .phoneIn {background-image: url(/publish/images/content/phoneBg.png); height: 720px; background-size: 100% auto; background-repeat: no-repeat; } .send_top .resultcont_right .phone .phoneIn {background-image: url(/publish/images/content/phoneBg.png); height: 720px; background-size: 100% auto; background-repeat: no-repeat; }
.send_top .resultcont_right .phone .phoneIn>div {padding: 45px 30px 0 30px; position: relative; height: 96%; box-sizing: border-box;} .send_top .resultcont_right .phone .phoneIn>div {padding: 45px 30px 25px 30px; position: relative; height: 96%; box-sizing: border-box;}
.send_top .resultcont_right .phone .prev_p {font-size: 20px;font-weight: 500;padding-bottom: 12px;border-bottom: 1px solid #e5e5e5;} .send_top .resultcont_right .phone .prev_p {font-size: 20px;font-weight: 500;padding-bottom: 12px;border-bottom: 1px solid #e5e5e5;}
.send_top .resultcont_right .phone .text_length2 {padding: 12px 0;} .send_top .resultcont_right .phone .text_length2 {padding: 12px 0;}
.send_top .resultcont_right .phone .text_length2>span {float: left;line-height: 27px;} .send_top .resultcont_right .phone .text_length2>span {float: left;line-height: 27px;}
@ -2182,7 +2185,7 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
/* 알림톡 미리보기 */ /* 알림톡 미리보기 */
.send_top .resultcont_right .phone_kakao {width: 374px; position: absolute; right:0; top: 0;} .send_top .resultcont_right .phone_kakao {width: 374px; position: absolute; right:0; top: 0;}
.send_top .resultcont_right .phone_kakako .phoneIn{height: 720px; width:346px; background-image: url(/publish/images/content/kakaoBg.png); padding: 27px 25px 0 25px; margin:0 0 0 -12px;} .send_top .resultcont_right .phone_kakako .phoneIn{height: 720px; width:346px; background-image: url(/publish/images/content/kakaoBg_01.png); padding: 27px 25px 0 25px; margin:0 0 0 -12px;}
.send_top .resultcont_right .phone_kakako .prev_p{padding: 0 0 0 10px; border: 0; letter-spacing: -0.25px;} .send_top .resultcont_right .phone_kakako .prev_p{padding: 0 0 0 10px; border: 0; letter-spacing: -0.25px;}
.send_top .resultcont_right .phone_kakako .prev_p img{margin: 0 10px 0 0;} .send_top .resultcont_right .phone_kakako .prev_p img{margin: 0 10px 0 0;}
.send_top .resultcont_right .phone_kakako .allimtalk_title{position: relative; width: calc(100% - 20px); background-color: #fae100; font-family: 'LotteMartDream'; font-size: 18px; padding: 12px 21px; border-radius: 5px 5px 0 0; box-sizing: border-box;} .send_top .resultcont_right .phone_kakako .allimtalk_title{position: relative; width: calc(100% - 20px); background-color: #fae100; font-family: 'LotteMartDream'; font-size: 18px; padding: 12px 21px; border-radius: 5px 5px 0 0; box-sizing: border-box;}
@ -2206,7 +2209,7 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px
.send_top .resultcont_right .phone_kakako .phoneIn .text_preview .allimtalk_content .btn_kakao_type{width: calc(100% - 20px); height: 40px; font-size: 15px; border-radius: 5px; background-color: #ededed;} .send_top .resultcont_right .phone_kakako .phoneIn .text_preview .allimtalk_content .btn_kakao_type{width: calc(100% - 20px); height: 40px; font-size: 15px; border-radius: 5px; background-color: #ededed;}
.send_top .resultcont_right .phone_kakako .phoneIn .template_info_wrap{display: flex; width: calc(85% + 13px); height: auto; padding: 6px 15px 6px 23px; justify-content: space-between; align-items: center; background-color: #fae100; margin: -5px 0 0 -3px; border-radius: 0 0 25px 25px;} .send_top .resultcont_right .phone_kakako .phoneIn .template_info_wrap{display: flex; width: calc(85% + 13px); height: auto; padding: 6px 15px 6px 23px; justify-content: space-between; align-items: center; background-color: #fae100; margin: -5px 0 0 -3px; border-radius: 0 0 25px 25px;}
.send_top .resultcont_right .phone_kakako .phoneIn .template_info_wrap .btn_template_choice{width: 120px; height: 36px; font-size: 16px; color: #fae100; background-color: #302218; border-radius: 5px;} .send_top .resultcont_right .phone_kakako .phoneIn .template_info_wrap .btn_template_choice{width: 120px; height: 36px; font-size: 16px; color: #fae100; background-color: #302218; border-radius: 5px;}
.send_top .resultcont_right .phone_kakako .addText{color: #002c9a;text-align: center; font-size: 14px; padding-top: 2px; margin:10px 0 10px 0;} .send_top .resultcont_right .phone_kakako .addText{color: #002c9a;text-align: center; font-size: 14px; padding-top: 2px; margin:-27px 0 10px 0;}
.btn_list_type1 {border-top:solid 1px #e5e5e5; text-align: right; padding:26px 0 0 0; margin:60px 0 0 0;} .btn_list_type1 {border-top:solid 1px #e5e5e5; text-align: right; padding:26px 0 0 0; margin:60px 0 0 0;}
.btn_list_type1 .btnType.btnType17 {width:100px; } .btn_list_type1 .btnType.btnType17 {width:100px; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,146 +1,143 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko"> <html lang="ko">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>프리미엄 문자 발송 서비스 문자온</title> <title>프리미엄 문자 발송 서비스 문자온</title>
<meta property="og:title" content="프리미엄 문자 발송 서비스 문자온"> <meta property="og:title" content="프리미엄 문자 발송 서비스 문자온">
<meta property="og:image" content="https://www.munjaon.co.kr/publish/publish_m/img/preview_logo.png"> <meta property="og:image" content="https://www.munjaon.co.kr/publish/publish_m/img/preview_logo.png">
<link rel="apple-touch-icon" sizes="57x57" href="/publish/images/favicon/apple-icon-57x57.png"> <link rel="apple-touch-icon" sizes="57x57" href="/publish/images/favicon/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/publish/images/favicon/apple-icon-60x60.png"> <link rel="apple-touch-icon" sizes="60x60" href="/publish/images/favicon/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/publish/images/favicon/apple-icon-72x72.png"> <link rel="apple-touch-icon" sizes="72x72" href="/publish/images/favicon/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/publish/images/favicon/apple-icon-76x76.png"> <link rel="apple-touch-icon" sizes="76x76" href="/publish/images/favicon/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/publish/images/favicon/apple-icon-114x114.png"> <link rel="apple-touch-icon" sizes="114x114" href="/publish/images/favicon/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/publish/images/favicon/apple-icon-120x120.png"> <link rel="apple-touch-icon" sizes="120x120" href="/publish/images/favicon/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/publish/images/favicon/apple-icon-144x144.png"> <link rel="apple-touch-icon" sizes="144x144" href="/publish/images/favicon/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/publish/images/favicon/apple-icon-152x152.png"> <link rel="apple-touch-icon" sizes="152x152" href="/publish/images/favicon/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/publish/images/favicon/apple-icon-180x180.png"> <link rel="apple-touch-icon" sizes="180x180" href="/publish/images/favicon/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/publish/images/favicon/android-icon-192x192.png"> <link rel="icon" type="image/png" sizes="192x192" href="/publish/images/favicon/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/publish/images/favicon/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/publish/images/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/publish/images/favicon/favicon-96x96.png"> <link rel="icon" type="image/png" sizes="96x96" href="/publish/images/favicon/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/publish/images/favicon/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/publish/images/favicon/favicon-16x16.png">
<link rel="manifest" href="/publish/images/favicon/manifest.json"> <link rel="manifest" href="/publish/images/favicon/manifest.json">
<link rel="stylesheet" href="/publish/publish_m/css/reset.css"> <link rel="stylesheet" href="/publish/publish_m/css/reset.css">
<link rel="stylesheet" href="/publish/publish_m/css/style.css"> <link rel="stylesheet" href="/publish/publish_m/css/style.css">
</head> </head>
<body> <body>
<div class="con_wrap"> <div class="con_wrap">
<header> <header>
<div class="inner"> <div class="inner">
<a href="https://www.munjaon.co.kr"> <a href="https://www.munjaon.co.kr">
<h1><img src="/publish/publish_m/img/header_logo.png" alt="문자온 로고"></h1> <h1><img src="/publish/publish_m/img/header_logo.png" alt="문자온 로고"></h1>
<p>munjaon.co.kr</p> <p>munjaon.co.kr</p>
</a> </a>
</div> </div>
</header> </header>
<div class="visual"> <div class="visual">
<div class="inner"> <div class="inner">
<h2><span>프리미엄</span>&nbsp;문자<br>발송 서비스</h2> <h2><span>프리미엄</span>&nbsp;문자<br>발송 서비스</h2>
<div class="button"> <div class="button">
<a href="https://www.munjaon.co.kr"> <a href="https://www.munjaon.co.kr">
<p>문자온 바로가기&nbsp;<span>(클릭)</span></p> <p>문자온 바로가기&nbsp;<span>(클릭)</span></p>
</a> </a>
</div> </div>
<div class="price banner_con"> <div class="price banner_con">
<ul> <ul>
<li> <li>
<div class="wrap"> <div class="wrap">
<p class="inner_text">최저가 요금<span>(후불제 가능)</span></p> <p class="inner_text">최저가 요금<span>(후불제 가능)</span></p>
</div> </div>
</li> </li>
<li> <li>
<div class="wrap"> <div class="wrap">
<p class="inner_text second_te">편리한 선거문자 시스템</p> <p class="inner_text second_te">편리한 선거문자 시스템</p>
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
<section> <section>
<div class="con"> <div class="con">
<div class="title"> <div class="title">
<p class="num">1</p> <p class="num">1</p>
<p>특장점</p> <p>특장점</p>
</div> </div>
<div class="text_wrap add_wrap"> <div class="text_wrap add_wrap">
<div class="text"> <div class="text">
<p class="te">편리한 20건 선거문자 발송</p> <p class="te">편리한 20건 선거문자 발송</p>
<p class="inner_sub">(자동분류, 전체선택 가능)</p> <p class="inner_sub">(자동분류, 전체선택 가능)</p>
</div> </div>
<div class="text"> <div class="text">
<p class="te">업계 최저가 요금</p> <p class="te">업계 최저가 요금</p>
<p class="inner_sub">(현 요금보다 저렴하게 제공)</p> <p class="inner_sub">(현 요금보다 저렴하게 제공)</p>
</div> </div>
<div class="text"> <div class="text">
<p class="te">단문<span class="inner_sub">(SMS)</span>, 장문<span class="inner_sub">(LMS)</span>, 그림문자<span class="inner_sub">(MMS)</span>, 카카오 알림톡, 팩스 발송 기능 제공</p> <p class="te">단문<span class="inner_sub">(SMS)</span>, 장문<span class="inner_sub">(LMS)</span>, 그림문자<span class="inner_sub">(MMS)</span>, 카카오 알림톡, 팩스 발송 기능 제공</p>
</div> </div>
<div class="text"> <div class="text">
<p class="te">최신 트렌드 반영 서비스 제공</p> <p class="te">최신 트렌드 반영 서비스 제공</p>
<div class="text_sub"> <div class="text_sub">
<p>- 주소록 입력 대행(무료)</p> <p>- 주소록 입력 대행(무료)</p>
<p>- 예약발송 기능 제공(분 단위)</p> <p>- 예약발송 기능 제공(분 단위)</p>
<p>- 문자메시지 지도‧약도 자동 첨부 가능</p> <p>- 문자메시지 지도‧약도 자동 첨부 가능</p>
<p>- 그림문자 주문제작 서비스 제공</p> <p>- 그림문자 주문제작 서비스 제공</p>
<p>- 다양한 결제수단 제공(신용카드, 휴대폰 결제, 전용계좌, 즉시이체, 간편결제 등)</p> <p>- 다양한 결제수단 제공(신용카드, 휴대폰 결제, 전용계좌, 즉시이체, 간편결제 등)</p>
<p>- 무제한 발송량 제공</p> <p>- 무제한 발송량 제공</p>
<p>- 특정 공통문구(이름, 일시, 비용 등) 일괄 변경 기능 제공</p> <p>- 특정 공통문구(이름, 일시, 비용 등) 일괄 변경 기능 제공</p>
</div> </div>
</div> </div>
<div class="text"> <div class="text">
<p class="te">기업‧단체‧공공기관 B2B 전용라인 제공</p> <p class="te">기업‧단체‧공공기관 B2B 전용라인 제공</p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<section> <section>
<div class="con"> <div class="con">
<div class="title"> <div class="title">
<p class="num">2</p> <p class="num">2</p>
<p>이용고객</p> <p>이용고객</p>
</div> </div>
<div class="text_wrap add_wrap"> <div class="text_wrap add_wrap">
<div class="text"> <div class="text">
<p class="te">개인<span class="inner_sub">(사업자)</span></p> <p class="te">개인<span class="inner_sub">(사업자)</span></p>
<div class="text_sub"> <div class="text_sub">
<p>- 동호회, 동문회, 향우회, 병원, 부동산, 음식점, 마트, 대리점, 숙박업, 전문직 사무실, 소셜커머스 사업자, 교육시설(학원, 학교, 유치원, 어린이집), 스포츠시설(골프장, 피트니스) 등</p> <p>- 동호회, 동문회, 향우회, 병원, 부동산, 음식점, 마트, 대리점, 숙박업, 전문직 사무실, 소셜커머스 사업자, 교육시설(학원, 학교, 유치원, 어린이집), 스포츠시설(골프장, 피트니스) 등</p>
</div> </div>
</div> </div>
<div class="text"> <div class="text">
<p class="te">기업‧협회‧단체</p> <p class="te">기업‧협회‧단체</p>
<div class="text_sub"> <div class="text_sub">
<p>- 기업(대‧중‧소기업), 협회, 조합, 비영리단체, 종교단체(교회, 사찰), 은행, 카드사, 쇼핑몰, 택배사, 보험사, 리서치사 등</p> <p>- 기업(대‧중‧소기업), 협회, 조합, 비영리단체, 종교단체(교회, 사찰), 은행, 카드사, 쇼핑몰, 택배사, 보험사, 리서치사 등</p>
</div> </div>
</div> </div>
<div class="text"> <div class="text">
<p class="te">공공</p> <p class="te">공공</p>
<div class="text_sub"> <div class="text_sub">
<p>- 정부, 지방자치단체, 국회, 지방의회, 법원, 공공기관, 공직유관단체, 도서관, 미술관, 전시관, 공연시설, 영화관 등</p> <p>- 정부, 지방자치단체, 국회, 지방의회, 법원, 공공기관, 공직유관단체, 도서관, 미술관, 전시관, 공연시설, 영화관 등</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<footer> <footer>
<div class="title"> <div class="title">
<img src="/publish/publish_m/img/tel_icon.png" alt="고객센터 아이콘"> <img src="/publish/publish_m/img/tel_icon.png" alt="고객센터 아이콘">
<p>고객센터</p> <p>고객센터</p>
</div> </div>
<ul> <ul>
<li> <li>
<a href="tel:010-8432-9333">010-8432-9333</a> <a href="tel:1551-8011">1551-8011</a>
</li> </li>
<li> </ul>
<a href="tel:010-2290-4789">010-2290-4789</a> <p class="iten">주식회사 아이티앤</p>
</li> </footer>
</ul> </div>
<p class="iten">주식회사 아이티앤</p>
</footer> </body>
</div>
</body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More