Merge branch 'advc'
This commit is contained in:
commit
e9a66e7bdf
11
pom.xml
11
pom.xml
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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");
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
145
src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java
Normal file
145
src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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; // 링크좌표
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
32
src/main/java/itn/let/cmm/vo/FileInfoVO.java
Normal file
32
src/main/java/itn/let/cmm/vo/FileInfoVO.java
Normal 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; // 파일 순번
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
116
src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
Normal file
116
src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
Normal 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 ]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -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
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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: 카카오 알림톡 전송)',
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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"})
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
33
src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java
Normal file
33
src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java
Normal 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; // 분할여부
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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");
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
143
src/main/java/itn/let/utl/user/service/ExcelUtil.java
Normal file
143
src/main/java/itn/let/utl/user/service/ExcelUtil.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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">
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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
|
||||||
(
|
(
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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*/
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
-
|
-
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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 영역 -->
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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){
|
||||||
|
|||||||
@ -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=""/>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -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 -->
|
||||||
@ -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>
|
||||||
|
<!-- -->
|
||||||
|
<!-- <button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button> -->
|
||||||
|
<!-- -->
|
||||||
|
<!-- <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>
|
||||||
@ -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>
|
||||||
@ -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>
|
||||||
@ -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>
|
||||||
|
|
||||||
@ -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>
|
||||||
|
|
||||||
@ -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>
|
||||||
|
|
||||||
@ -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">
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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">
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
1025
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp
Normal file
1025
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp
Normal file
File diff suppressed because it is too large
Load Diff
@ -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">
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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>
|
||||||
-
|
-
|
||||||
|
|||||||
31
src/main/webapp/WEB-INF/tld/functions.tld
Normal file
31
src/main/webapp/WEB-INF/tld/functions.tld
Normal 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>
|
||||||
@ -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) {
|
||||||
// 값과 타입 확인
|
// 값과 타입 확인
|
||||||
|
|
||||||
|
|||||||
@ -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(){
|
|||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,8 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -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";
|
||||||
|
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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; }
|
||||||
|
|||||||
BIN
src/main/webapp/publish/images/content/kakaoBg_01.png
Normal file
BIN
src/main/webapp/publish/images/content/kakaoBg_01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
@ -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> 문자<br>발송 서비스</h2>
|
<h2><span>프리미엄</span> 문자<br>발송 서비스</h2>
|
||||||
<div class="button">
|
<div class="button">
|
||||||
<a href="https://www.munjaon.co.kr">
|
<a href="https://www.munjaon.co.kr">
|
||||||
<p>문자온 바로가기 <span>(클릭)</span></p>
|
<p>문자온 바로가기 <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
Loading…
Reference in New Issue
Block a user