발송결과 알림톡 성능 개선

This commit is contained in:
leejunho 2025-03-24 09:38:10 +09:00
parent 7d1cdedf03
commit a67c970812
21 changed files with 4460 additions and 1457 deletions

View File

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

View File

@ -247,6 +247,14 @@ public class KakaoVO extends MjonMsgVO{
private String successCntMonth;
private String successCntYear;
//재전송 영역
private String msgResendAllFlag;
private String msgResendAllGroupId;
private String msgResendAllTmpKey;
private String msgResendAllYellowId;
public String getSuccessDay() {
return successDay;
}
@ -1238,4 +1246,39 @@ public class KakaoVO extends MjonMsgVO{
public void setPhmType(String phmType) {
this.phmType = phmType;
}
public String getMsgResendAllFlag() {
return msgResendAllFlag;
}
public void setMsgResendAllFlag(String msgResendAllFlag) {
this.msgResendAllFlag = msgResendAllFlag;
}
public String getMsgResendAllGroupId() {
return msgResendAllGroupId;
}
public void setMsgResendAllGroupId(String msgResendAllGroupId) {
this.msgResendAllGroupId = msgResendAllGroupId;
}
public String getMsgResendAllTmpKey() {
return msgResendAllTmpKey;
}
public void setMsgResendAllTmpKey(String msgResendAllTmpKey) {
this.msgResendAllTmpKey = msgResendAllTmpKey;
}
public String getMsgResendAllYellowId() {
return msgResendAllYellowId;
}
public void setMsgResendAllYellowId(String msgResendAllYellowId) {
this.msgResendAllYellowId = msgResendAllYellowId;
}
}

View File

@ -46,6 +46,8 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
@ -216,6 +218,26 @@ public class KakaoAlimTalkSendController {
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";
}
@ -1403,4 +1425,80 @@ public class KakaoAlimTalkSendController {
return modelAndView;
}
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView_test_set.do"})
public String kakaoAlimtalkMsgDataView_test_set(ModelMap model
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
model.addAttribute("loginVO", loginVO);
/* if(userId == "") {
return "redirect:/web/user/login/login.do";
}*/
//2.사용자 개인 단가 정보 불러오기
if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
// 사용자 아이디를 이용한 발신프로필 조회
kakaoVO.setUserId(userId);
List<KakaoVO> selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("kakaoProfileList", selectKakaoProfileList);
//발신번호 불러오기
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
MJUtil mjUtil = new MJUtil();
for(String phone : resultSendPhonList) {
resultPhonList.add(mjUtil.addDash(phone));
}
model.addAttribute("resultPhonList", resultPhonList);
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
Float shortPrice = mberManageVO.getShortPrice();
Float longPrice = mberManageVO.getLongPrice();
Float picturePrice = mberManageVO.getPicturePrice();
Float picture2Price = mberManageVO.getPicture2Price();
Float picture3Price = mberManageVO.getPicture3Price();
BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
model.addAttribute("userMoney", userMoney);
//////////////////////////////////////////////////////////////////
//최근 전송 내역
MjonMsgDataVO searchVO = new MjonMsgDataVO();
Calendar cal = Calendar.getInstance();
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(now);
cal.add(Calendar.DATE, -3);
String chkDate = format.format(cal.getTime());
searchVO.setUserId(userId);
searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작
model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO));
//자주보내는 번호
model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO));
// 사용자 저으이
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
}
return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp";
}
}

View File

@ -0,0 +1,51 @@
package itn.let.kakao.user.sent.service;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class KakaoSentDetailVO extends KakaoSentVO{
private static final long serialVersionUID = 1L;
private String msgGroupId;
private String reqDate;
private String regDate;
private String msgGroupCnt;
private String reserveYn;
private String reserveCYn;
private String canceldate;
private String callFrom;
private String userId;
private String smsTxt;
private String subject;
private String subjectChkYn;
private String msgType;
private String fileCnt;
private String msgKind;
private String eachPrice;
private String filePath1;
private String filePath2;
private String filePath3;
private String callTo;
private String statusTxt;
private String addrNm;
private String successPct;
private String failedPct;
private String waitingPct;
private String statusCd; // 진행상태 코드
private String divideYn;
private String divideText;
private String totPrice;
private String yellowId;
private String msgNoticetalkTmpKey;
// FileInfo 리스트 필드 추가
// private List<FileInfoVO> fileInfos;
}

View File

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

View File

@ -4,7 +4,11 @@ import java.util.Date;
import java.util.List;
import itn.let.uss.umt.service.UserDefaultVO;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class KakaoSentVO extends UserDefaultVO{
private static final long serialVersionUID = 1L;
@ -90,6 +94,7 @@ public class KakaoSentVO extends UserDefaultVO{
private int successCount;
private int waitCount;
private int failCount;
private int allCount;
private String bizUmid;
private int kakaoResendSuccCount;
@ -103,471 +108,11 @@ public class KakaoSentVO extends UserDefaultVO{
private String atDelayCompleteYn; //알림톡 30분 지연 승인/취소 처리 여부
private Date atDelayOrgTime; //알림톡 30분 지연에 대한 원래 시간 (-30분 처리된 시간)
public String getCallToComma() {
return callToComma;
}
public void setCallToComma(String callToComma) {
this.callToComma = callToComma;
}
public String getCallFromComma() {
return callFromComma;
}
public void setCallFromComma(String callFromComma) {
this.callFromComma = callFromComma;
}
public String getAtchFiles() {
return atchFiles;
}
public void setAtchFiles(String atchFiles) {
this.atchFiles = atchFiles;
}
public String getMsgId() {
return msgId;
}
public void setMsgId(String msgId) {
this.msgId = msgId;
}
public int getSuccessCnt() {
return successCnt;
}
public void setSuccessCnt(int successCnt) {
this.successCnt = successCnt;
}
public String getMsgTypeName() {
return msgTypeName;
}
public void setMsgTypeName(String msgTypeName) {
this.msgTypeName = msgTypeName;
}
public int getOrderByCode() {
return orderByCode;
}
public void setOrderByCode(int orderByCode) {
this.orderByCode = orderByCode;
}
public String getAtchFileId() {
return atchFileId;
}
public void setAtchFileId(String atchFileId) {
this.atchFileId = atchFileId;
}
public String getFileSn() {
return fileSn;
}
public void setFileSn(String fileSn) {
this.fileSn = fileSn;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getAddrNm() {
return addrNm;
}
public void setAddrNm(String addrNm) {
this.addrNm = addrNm;
}
public String getMsgSeq() {
return msgSeq;
}
public void setMsgSeq(String msgSeq) {
this.msgSeq = msgSeq;
}
public String getMsgGroupId() {
return msgGroupId;
}
public void setMsgGroupId(String msgGroupId) {
this.msgGroupId = msgGroupId;
}
public List getMsgGroupIdList() {
return msgGroupIdList;
}
public void setMsgGroupIdList(List msgGroupIdList) {
this.msgGroupIdList = msgGroupIdList;
}
public String getSmsTxt() {
return smsTxt;
}
public void setSmsTxt(String smsTxt) {
this.smsTxt = smsTxt;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public Date getReqdate() {
return reqdate;
}
public void setReqdate(Date reqdate) {
this.reqdate = reqdate;
}
public String getCallFrom() {
return callFrom;
}
public void setCallFrom(String callFrom) {
this.callFrom = callFrom;
}
public String getCallTo() {
return callTo;
}
public void setCallTo(String callTo) {
this.callTo = callTo;
}
public List getCallToList() {
return callToList;
}
public void setCallToList(List callToList) {
this.callToList = callToList;
}
public String getTotPrice() {
return totPrice;
}
public void setTotPrice(String totPrice) {
this.totPrice = totPrice;
}
public String getEachPrice() {
return eachPrice;
}
public void setEachPrice(String eachPrice) {
this.eachPrice = eachPrice;
}
public String getDelFlag() {
return delFlag;
}
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
public String getTotMsgPrice() {
return totMsgPrice;
}
public void setTotMsgPrice(String totMsgPrice) {
this.totMsgPrice = totMsgPrice;
}
public String getRsltCode() {
return rsltCode;
}
public void setRsltCode(String rsltCode) {
this.rsltCode = rsltCode;
}
public String getRsltCode2() {
return rsltCode2;
}
public void setRsltCode2(String rsltCode2) {
this.rsltCode2 = rsltCode2;
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String msgType) {
this.msgType = msgType;
}
public String getMsgGroupCnt() {
return msgGroupCnt;
}
public void setMsgGroupCnt(String msgGroupCnt) {
this.msgGroupCnt = msgGroupCnt;
}
public String getFileCnt() {
return fileCnt;
}
public void setFileCnt(String fileCnt) {
this.fileCnt = fileCnt;
}
public String getTotMsgCnt() {
return totMsgCnt;
}
public void setTotMsgCnt(String totMsgCnt) {
this.totMsgCnt = totMsgCnt;
}
public String getCurState() {
return curState;
}
public void setCurState(String curState) {
this.curState = curState;
}
public String getReserveYn() {
return reserveYn;
}
public void setReserveYn(String reserveYn) {
this.reserveYn = reserveYn;
}
public String getReserveCYn() {
return reserveCYn;
}
public void setReserveCYn(String reserveCYn) {
this.reserveCYn = reserveCYn;
}
public String getFilePath1() {
return filePath1;
}
public void setFilePath1(String filePath1) {
this.filePath1 = filePath1;
}
public String getFilePath2() {
return filePath2;
}
public void setFilePath2(String filePath2) {
this.filePath2 = filePath2;
}
public String getFilePath3() {
return filePath3;
}
public void setFilePath3(String filePath3) {
this.filePath3 = filePath3;
}
public Date getSentDate() {
return sentDate;
}
public void setSentDate(Date sentDate) {
this.sentDate = sentDate;
}
public String getAgentCode() {
return agentCode;
}
public void setAgentCode(String agentCode) {
this.agentCode = agentCode;
}
public String getUserData() {
return userData;
}
public void setUserData(String userData) {
this.userData = userData;
}
public List getUserDataList() {
return userDataList;
}
public void setUserDataList(List userDataList) {
this.userDataList = userDataList;
}
public Date getCancelDate() {
return cancelDate;
}
public void setCancelDate(Date cancelDate) {
this.cancelDate = cancelDate;
}
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public String getSearchMsgType() {
return searchMsgType;
}
public void setSearchMsgType(String searchMsgType) {
this.searchMsgType = searchMsgType;
}
public String getTabType() {
return tabType;
}
public void setTabType(String tabType) {
this.tabType = tabType;
}
public String getStateType() {
return stateType;
}
public void setStateType(String stateType) {
this.stateType = stateType;
}
public String getListType() {
return listType;
}
public void setListType(String listType) {
this.listType = listType;
}
public String getResultType() {
return resultType;
}
public void setResultType(String resultType) {
this.resultType = resultType;
}
public String getMsgResultCnt() {
return msgResultCnt;
}
public void setMsgResultCnt(String msgResultCnt) {
this.msgResultCnt = msgResultCnt;
}
public String getMsgResultSts() {
return msgResultSts;
}
public void setMsgResultSts(String msgResultSts) {
this.msgResultSts = msgResultSts;
}
public String getAddrGrpNm() {
return addrGrpNm;
}
public void setAddrGrpNm(String addrGrpNm) {
this.addrGrpNm = addrGrpNm;
}
public int getOrderByrsltCode() {
return orderByrsltCode;
}
public void setOrderByrsltCode(int orderByrsltCode) {
this.orderByrsltCode = orderByrsltCode;
}
public String getMsgResult() {
return msgResult;
}
public void setMsgResult(String msgResult) {
this.msgResult = msgResult;
}
public String getNtceBgnde() {
return ntceBgnde;
}
public void setNtceBgnde(String ntceBgnde) {
this.ntceBgnde = ntceBgnde;
}
public String getNtceEndde() {
return ntceEndde;
}
public void setNtceEndde(String ntceEndde) {
this.ntceEndde = ntceEndde;
}
public String getMsgKind() {
return msgKind;
}
public void setMsgKind(String msgKind) {
this.msgKind = msgKind;
}
public String getDelayYn() {
return delayYn;
}
public void setDelayYn(String delayYn) {
this.delayYn = delayYn;
}
public String getDelayCompleteYn() {
return delayCompleteYn;
}
public void setDelayCompleteYn(String delayCompleteYn) {
this.delayCompleteYn = delayCompleteYn;
}
public String getBizKakaoResendYn() {
return bizKakaoResendYn;
}
public void setBizKakaoResendYn(String bizKakaoResendYn) {
this.bizKakaoResendYn = bizKakaoResendYn;
}
public String getBizKakaoResendType() {
return bizKakaoResendType;
}
public void setBizKakaoResendType(String bizKakaoResendType) {
this.bizKakaoResendType = bizKakaoResendType;
}
public String getBizKakaoResendData() {
return bizKakaoResendData;
}
public void setBizKakaoResendData(String bizKakaoResendData) {
this.bizKakaoResendData = bizKakaoResendData;
}
public String getCallStatus() {
return callStatus;
}
public void setCallStatus(String callStatus) {
this.callStatus = callStatus;
}
public String getBizKakaoAtPrice() {
return bizKakaoAtPrice;
}
public void setBizKakaoAtPrice(String bizKakaoAtPrice) {
this.bizKakaoAtPrice = bizKakaoAtPrice;
}
public String getBizKakaoFtPrice() {
return bizKakaoFtPrice;
}
public void setBizKakaoFtPrice(String bizKakaoFtPrice) {
this.bizKakaoFtPrice = bizKakaoFtPrice;
}
public String getBizSmsPrice() {
return bizSmsPrice;
}
public void setBizSmsPrice(String bizSmsPrice) {
this.bizSmsPrice = bizSmsPrice;
}
public String getDiffMin() {
return diffMin;
}
public void setDiffMin(String diffMin) {
this.diffMin = diffMin;
}
public String getBizMmsPrice() {
return bizMmsPrice;
}
public void setBizMmsPrice(String bizMmsPrice) {
this.bizMmsPrice = bizMmsPrice;
}
public int getSuccessCount() {
return successCount;
}
public void setSuccessCount(int successCount) {
this.successCount = successCount;
}
public String getBizUmid() {
return bizUmid;
}
public void setBizUmid(String bizUmid) {
this.bizUmid = bizUmid;
}
public int getKakaoResendSuccCount() {
return kakaoResendSuccCount;
}
public void setKakaoResendSuccCount(int kakaoResendSuccCount) {
this.kakaoResendSuccCount = kakaoResendSuccCount;
}
public int getKakaoResendFailCount() {
return kakaoResendFailCount;
}
public void setKakaoResendFailCount(int kakaoResendFailCount) {
this.kakaoResendFailCount = kakaoResendFailCount;
}
public int getWaitCount() {
return waitCount;
}
public void setWaitCount(int waitCount) {
this.waitCount = waitCount;
}
public int getFailCount() {
return failCount;
}
public void setFailCount(int failCount) {
this.failCount = failCount;
}
public String getAtDelayYn() {
return atDelayYn;
}
public void setAtDelayYn(String atDelayYn) {
this.atDelayYn = atDelayYn;
}
public String getAtDelayCompleteYn() {
return atDelayCompleteYn;
}
public void setAtDelayCompleteYn(String atDelayCompleteYn) {
this.atDelayCompleteYn = atDelayCompleteYn;
}
public Date getAtDelayOrgTime() {
return atDelayOrgTime;
}
public void setAtDelayOrgTime(Date atDelayOrgTime) {
this.atDelayOrgTime = atDelayOrgTime;
}
private String statusCd;
private int successPrice;
private int kakaoResendSuccPrice;
private String divideYn;
}

View File

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

View File

@ -1,7 +1,15 @@
package itn.let.kakao.user.sent.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
@ -10,6 +18,7 @@ import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
import itn.let.kakao.user.sent.service.KakaoSentService;
import itn.let.kakao.user.sent.service.KakaoSentVO;
@ -29,7 +38,8 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
try {
result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
// result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO);
} catch (Exception e) {
throw new Exception("++++++++++ ErrorService Impl :: " + e);
@ -38,30 +48,83 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
return result;
}
public Map<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{
List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>();
String listType = kakaoSentVO.getListType();
String stateType = kakaoSentVO.getStateType();
resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
if(stateType.equals("fail")) {
listType = "privateList";
}
System.out.println("listType : "+ listType);
if(listType.equals("groupList")) {//전송건별 리스트 불러오기
resultList = kakaoSentDAO.selectAllKakaoSentList(kakaoSentVO);
}else {//개인별 리스트 불러오기
resultList = kakaoSentDAO.selectAllPrivateKakaoSentList(kakaoSentVO);
}
//totPrice 계산 상태코드 set
resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList());
return resultList;
}
@ -150,4 +213,228 @@ public class KakaoSentServiceImpl extends EgovAbstractServiceImpl implements Ka
return kakaoSentDAO.selectReservKakaoSentList(kakaoSentVO);
}
@Override
public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception{
KakaoSentDetailVO resultVO = kakaoSentDAO.selectKakaoSentDetailView(kakaoSentDetailVO);
int total = Integer.parseInt(resultVO.getMsgGroupCnt()); // 전체 건수
int success = 0; // 성공 건수
int waiting = 0; // 대기 건수
int failed = 0; // 실패 건수
if("Y".equals(resultVO.getBizKakaoResendYn())) {
success = resultVO.getSuccessCount() + resultVO.getKakaoResendSuccCount();
failed = resultVO.getKakaoResendFailCount();
}else {
success = resultVO.getSuccessCount();
failed = resultVO.getFailCount();
}
waiting = resultVO.getWaitCount(); // 대기 건수
String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%";
String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%";
String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%";
resultVO.setSuccessPct(successPct);
resultVO.setFailedPct(waitingPct);
resultVO.setWaitingPct(failedPct);
resultVO.setTotPrice(this.priceProc(resultVO.getSuccessPrice(), resultVO.getKakaoResendSuccPrice()));
resultVO = this.codeProc(resultVO);
// 분할문자인 경우
if("Y".equals(resultVO.getDivideYn())) {
String divideText = calculateBatchInfo(resultVO);
resultVO.setDivideText(divideText);
}
return resultVO;
}
//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception{
return kakaoSentDAO.selectKakaoSentDetailViewPhoneAjax(kakaoSentVO);
}
// 공통코드 ITN057에 대한 코드화 진행
/*
* CODE_ID CODE CODE_NM CODE_DC
* ITN057 01 진행중 진행중
* ITN057 02 완료 완료출해야함
* ITN057 03 예약대기 예약대기(발송전) 버튼으로 노출해야함
* ITN057 04 - 예약취소 ( - 으로 노출 )
* */
private KakaoSentVO setPriceNCode(KakaoSentVO result) {
//성공 건수 세팅
KakaoSentVO eachCnt = new KakaoSentVO();
eachCnt.setMsgGroupId(result.getMsgGroupId());
try {
eachCnt = kakaoSentDAO.selectKakaoSentCntEachCnt_advc(eachCnt);
} catch (Exception e) {
System.out.println("setPriceNCode error!!");
}
result.setSuccessCount(eachCnt.getSuccessCount());
result.setWaitCount(eachCnt.getWaitCount());
result.setFailCount(eachCnt.getFailCount());
result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount());
result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount());
//완료상태 시작
result = this.codeProc(result);
//완료상태
//=======================================================
//총금액 시작
result.setTotPrice(this.priceProc(eachCnt.getSuccessPrice(), eachCnt.getKakaoResendSuccPrice()));
return result;
}
private String priceProc(int successPrice, int kakaoResendSuccPrice) {
String totPrice = "-";
//총금액 시작
//=======================================================
// TotPrice : 성공건수에 대한 금액 곱하기
BigDecimal atPrice = new BigDecimal(successPrice);
BigDecimal kakaoResendPrice = new BigDecimal(kakaoResendSuccPrice);
BigDecimal totalPrice = atPrice.add(kakaoResendPrice);
// 소수점 자리로 설정 (반올림)// totalPrice 값을 소수점 자리까지 반올림하여 roundedTotalPrice에 저장
// RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림
BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP);
// roundedTotalPrice가 0인지 확인
// BigDecimal.compareTo(BigDecimal.ZERO) 값을 비교하는 메서드
// 결과:
// - 반환 값이 0이면 값이 같음
// - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음
// - 반환 값이 양수이면 roundedTotalPrice가 0보다
if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) {
// roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정
totPrice = "-";
} else {
// roundedTotalPrice 값이 0이 아닌 경우
// 반올림된 BigDecimal 값을 toPlainString() 사용하여 문자열로 변환 totPrice에 설정
// toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환
totPrice = roundedTotalPrice.toPlainString();
}
//총금액
//=======================================================
return totPrice;
}
private KakaoSentVO codeProc(KakaoSentVO result) {
//=======================================================
String returnCode;
if ("Y".equals(result.getReserveCYn())) {
returnCode = "04"; // 예약취소 코드
} else if (
"Y".equals(result.getReserveYn())
&& "N".equals(result.getReserveCYn())
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount())
&& Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만
) {
returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 )
} else if (
//대체문자 발송 Y일때
("Y".equals(result.getBizKakaoResendYn())
//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())
//알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건
&& result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount())
)
||
//대체문자 발송 N일때
("N".equals(result.getBizKakaoResendYn())
//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()))
) {
returnCode = "02"; // 완료 코드
} else {
returnCode = "01"; // 진행중 코드
}
result.setStatusCd(returnCode);
return result;
}
private KakaoSentDetailVO codeProc(KakaoSentDetailVO result) {
//=======================================================
String returnCode;
if ("Y".equals(result.getReserveCYn())) {
returnCode = "04"; // 예약취소 코드
} else if (
"Y".equals(result.getReserveYn())
&& "N".equals(result.getReserveCYn())
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount())
&& Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만
) {
returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 )
} else if (
//대체문자 발송 Y일때
("Y".equals(result.getBizKakaoResendYn())
//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())
//알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건
&& result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount())
)
||
//대체문자 발송 N일때
("N".equals(result.getBizKakaoResendYn())
//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()))
) {
returnCode = "02"; // 완료 코드
} else {
returnCode = "01"; // 진행중 코드
}
result.setStatusCd(returnCode);
return result;
}
private String calculateBatchInfo(KakaoSentDetailVO resultVO) {
String msgGroupId = resultVO.getMsgGroupId();
List<String> requestTimes = kakaoSentDAO.findByReqDateWhereMsgGroupId(msgGroupId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
Map<LocalDateTime, Integer> timeCountMap = new LinkedHashMap<>();
// REQ_DATE 그룹화 (같은 시간대 건인지)
for (String timeStr : requestTimes) {
LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1);
}
// 가장 번째 시간 & 간격 계산
List<LocalDateTime> sortedKeys = new ArrayList<>(timeCountMap.keySet());
if (sortedKeys.size() < 2) {
return "데이터 부족 (분석 불가)";
}
int batchSize = timeCountMap.get(sortedKeys.get(0)); // 번에 보낸 건수
int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산
// int batchCount = sortedKeys.size(); // 보냈는지
// return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount);
return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes);
}
}

View File

@ -8,6 +8,7 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@ -26,6 +27,8 @@ import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
@ -43,6 +46,7 @@ import itn.let.kakao.kakaoComm.KakaoButtonVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
import itn.let.kakao.user.sent.service.KakaoSentService;
import itn.let.kakao.user.sent.service.KakaoSentVO;
@ -82,26 +86,26 @@ public class KakaoSentController {
//전체 발송 건수 통계 불러오기
kakaoSentVO.setMsgType("");
List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO);
model.addAttribute("totalMsgCnt", totalMsgCnt);
List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>();
List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>();
totalMsgCnt.forEach(t->{
if (Integer.parseInt(t.getFilePath1())>0) {
atCnt.add(t);
} else if (Integer.parseInt(t.getFilePath2())>0) {
ftCnt.add(t);
}
});
//알림톡 성공건, 실패건 불러오기
model.addAttribute("atCnt", atCnt);
//친구톡 성공건, 실패건 불러오기
model.addAttribute("ftCnt", ftCnt);
// List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO);
// model.addAttribute("totalMsgCnt", totalMsgCnt);
//
// List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>();
// List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>();
//
//
// totalMsgCnt.forEach(t->{
// if (Integer.parseInt(t.getFilePath1())>0) {
// atCnt.add(t);
// } else if (Integer.parseInt(t.getFilePath2())>0) {
// ftCnt.add(t);
// }
// });
//
// //알림톡 성공건, 실패건 불러오기
// model.addAttribute("atCnt", atCnt);
//
// //친구톡 성공건, 실패건 불러오기
// model.addAttribute("ftCnt", ftCnt);
// 검색 리스트 불러오기
if(kakaoSentVO.getPageUnit() != 10) kakaoSentVO.setPageUnit(kakaoSentVO.getPageUnit());
@ -193,7 +197,7 @@ public class KakaoSentController {
List<KakaoSentVO> resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO);
System.out.println("??");
model.addAttribute("resultAllSentList", resultAllSentList);
model.addAttribute("resultAllSentCnt", resultAllSentList.size());
// model.addAttribute("resultAllSentCnt", resultAllSentList.size());
model.addAttribute("searchKeyword", kakaoSentVO.getSearchKeyword());
paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
@ -984,5 +988,105 @@ public class KakaoSentController {
}
@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentViewTotalSumAjax.do"})
public ResponseEntity<?> selectKakaoSentViewTotalSumAjax(
KakaoSentVO kakaoSentVO
) throws Exception{
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(loginVO == null) {
// return "redirect:/web/user/login/login.do";
}
kakaoSentVO.setUserId(userId);
Map<String, Object> returnMap = kakaoSentService.selectKakaoSentCntAll_Advc(kakaoSentVO);
return new ResponseEntity<>(returnMap, HttpStatus.OK);
}
/**
* 발송관리 상세화면
* @param searchVO
* @param model
* @return "/web/kakao/sent/selectKakaoSentDetailView.do"
* @throws Exception
*/
@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailView.do"})
public String selectKakaoSentDetailView(@ModelAttribute("searchVO") KakaoSentDetailVO kakaoSentDetailVO,
RedirectAttributes redirectAttributes, ModelMap model) throws Exception{
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(loginVO == null) {
return "redirect:/web/user/login/login.do";
}
kakaoSentDetailVO.setUserId(userId);
model.addAttribute("result", kakaoSentService.selectKakaoSentDetailView(kakaoSentDetailVO));
return "web/kakao/sent/KakaoSentDetailView";
}
/**
* @methodName : selectMsgSentDetailDataAjax
* @author : 이호영
* @date : 2023.03.06
* @description : 알림톡 전송 - 내용 상세 팝업 [전송건별]
* @param mjonKakaoATVO
* @param model
* @return
* @throws Exception
*/
@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailViewPhoneAjax.do"})
public String selectKakaoSentDetailViewPhoneAjax(@ModelAttribute("searchVO") MjonKakaoATVO mjonKakaoATVO, ModelMap model) throws Exception{
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
mjonKakaoATVO.setUserId(userId);
//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO);
// 대체문자 엔터키 치환
mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt()));
model.addAttribute("resultMsgDetail", mjonKakaoATResultVO);
String msgType = mjonKakaoATResultVO.getMsgType();
if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리
// 템플릿 api 가져오기
KakaoVO kakaoVO = new KakaoVO();
kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey());
kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey());
KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
// //템플릿 api 가져오기
}else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리
//String smsTxt = mjonKakaoATResultVO.getSmsTxt();
KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO);
//kakaoTemplateInfo.setTemplateContent(smsTxt);
model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
}else {
model.addAttribute("kakaoTemplateInfo", "");
}
model.addAttribute("msgType", msgType);
return "web/kakao/sent/KakaoSentDetailPopAjax";
}
}

View File

@ -4,11 +4,13 @@
========= ======= =================================================
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">
<typeAlias alias="kakaoSentVO" type="itn.let.kakao.user.sent.service.KakaoSentVO"/>
<typeAlias alias="mjonKakaoATVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO"/>
<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">
@ -1350,4 +1352,559 @@
) M2
</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>

View File

@ -485,6 +485,9 @@
]]>
</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')

View File

@ -1076,6 +1076,62 @@ function checkNumber(event) {
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>
<div class="loading_layer">

View File

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

View File

@ -3,6 +3,7 @@
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
<%@ page import="itn.com.cmm.LoginVO" %>
<script src="/publish/js/content.js"></script>
<script src="/publish/js/popupLayer.js"></script>
@ -48,22 +49,75 @@ $(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>
<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>
<p>총 발송건수 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
<div>
<p class="cf_text c_e40000">※ 예약 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
<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>
@ -72,78 +126,68 @@ $(document).ready(function(){
</select>
</div>
</div>
<!-- 전송건별 - groupList - -->
<div class="tb_wrap" id="groupListTable">
<!-- 발송화면 개선 : 카카오톡 테이블 수정 -->
<div class="tb_wrap">
<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: 45px;">
<col style="width: 12%;">
<col style="width: 7%;">
<col style="width: 12%;">
<col style="width: auto;">
<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>
<thead>
<tr>
<th>
<th rowspan="2">
<label for="" class="label">전체 선택</label>
<input type="checkbox">
</th>
<th>
발송일시
<th rowspan="2">발송일시
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_reqdate">
</div>
</th>
<th>
형태
<th rowspan="2">형태
<div class="sort_wrap">
<input type="button" class="sort sortBtn" id="sort_msgType">
<input type="button" class="sort sortBtn" id="sort_orderByCode">
</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 rowspan="2">내용</th>
<th rowspan="2">발송건수
<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> -->
<th rowspan="2">대기</th>
<th colspan="2">카카오톡결과</th>
<th colspan="2">대체문자결과</th>
<th rowspan="2">금액(원)</th>
<th rowspan="2">진행상황</th>
</tr>
<tr>
<th>성공</th>
<th>실패</th>
<th>성공</th>
<th>실패</th>
</tr>
</thead>
</thead>
<tbody>
<c:if test="${not empty resultAllSentList}">
<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
<tr>
<td rowspan="2">
<td>
<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>>
<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">
<td>
<c:choose>
<c:when test="${resultAllSentList.atDelayYn eq 'Y' && resultAllSentList.atDelayCompleteYn eq 'N'}">
<c:choose>
@ -165,240 +209,89 @@ $(document).ready(function(){
</c:otherwise>
</c:choose>
</td>
<td rowspan="2">
<p class="c_222 fwRg">
<td>
<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 class="result_cont">
<div class="icon_wrap">
<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 rowspan="2">
<td>
<c:out value="${resultAllSentList.msgGroupCnt}"/>
</td>
<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: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 test="${resultAllSentList.statusCd ne '03' }">
<ec:code codeId="ITN057" code="${resultAllSentList.statusCd }" />
</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>
<p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${resultAllSentList.msgGroupId}'); return false;">예약취소</button></p>
</c:otherwise>
</c:choose>
</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>
<td colspan="12">발송 내역이 없습니다.</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>
<button type="button" onclick="javascript:fnDelete(); return false;" class="btnType btnType15"><i class="remove_img"></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>
<button type="button" class="excel_btn btnType"><i class="downroad"></i>발송결과 리스트</button>
</div>
</div>
<c:if test="${!empty resultAllSentList}">
<ul class="pagination">
<ui:pagination paginationInfo = "${paginationInfo}" type="imageWeb" jsFunction="linkPage" />
</ul>
</c:if>
<form id="resCancelForm" name="resCancelForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
</form>

View File

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

View File

@ -5,51 +5,33 @@
<%@ 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>
<div class="phone">
<!-- 탭스타일 -->
<div class="list_tab_wrap2 type5">
<ul class="tabType3" id="tabType" name="tabType">
<li class="tab active"><button type="button" onclick="phoneTab(this,'1');" title="선택됨">카카오톡</button></li>
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
<li class="tab"><button type="button" onclick="popupTab(this,'2');">대체문자</button></li>
<li class="tab"><button type="button" onclick="phoneTab(this,'2');">대체문자</button></li>
</c:if>
</ul><!--// tab button -->
</ul>
</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="tab_phone current" id="tab_phone_1">
<div class="phone_kakako">
<div class="phoneIn">
<p class="prev_p"><img src="/publish/images/content/kakao_prev_icon.png" alt=""><c:out value="${resultMsgDetail.yellowId}"/></p>
<!-- 텍스트 미리보기 -->
<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:when test="${msgType eq '8'}">알림톡 도착</c:when>
<c:when test="${msgType eq '9'}">친구톡 도착</c:when>
</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>
@ -60,32 +42,21 @@
<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 '채널 추가'}">
@ -99,17 +70,47 @@
</div>
</div>
</div>
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
</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 class="tab_phone" id="tab_phone_2">
<div class="phoneIn">
<div>
<p class="prev_p"><img src="/publish/images/search.png"> 문자내용</p>
<div class="text_length2 clearfix">
<c:if test="${resultMsgDetail.bizKakaoResendYn eq 'Y'}">
<c:choose>
<c:when test="${resultMsgDetail.bizKakaoResendTypeCnt > 1}">
<span class="msg_com msg_short">단문</span>
<span class="msg_com msg_long">장문</span>
</c:when>
<c:when test="${resultMsgDetail.bizKakaoResendTypeCnt < 2
&& resultMsgDetail.bizKakaoResendType eq 'SMS'}">
<span class="msg_com msg_short">단문</span>
</c:when>
<c:otherwise>
<span class="msg_com msg_long">장문</span>
</c:otherwise>
</c:choose>
</c:if>
<div>
<span>글자크기</span>
<button type="button" onclick="changeFontSize('plus');"><img src="/publish/images/content/font_plus.png"></button>
<button type="button" onclick="changeFontSize('minus');"><img src="/publish/images/content/font_minus.png"></button>
</div>
</div>
<div class="text_preview">
<div class="preview_auto">
<p class="realtime">${fn:replace(resultMsgDetail.bizKakaoResendOrgnlTxt, newLineChar, "<br/>")}</p>
</div>
</div>
</div>
</div>
<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다</p>
</div>
<!--// 문자 미리보기 -->
</div>

View File

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

View File

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

View File

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

View File

@ -0,0 +1,996 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="itn.com.cmm.LoginVO" %>
<!-- <script src="/publish/js/content.js"></script> -->
<script src="/publish/js/popupLayer.js"></script>
<script type="text/javascript">
var lastfulstday = ""; //전월 시작일
var lastfuledday = ""; //전월 마지막일
var thisfulstlday = ""; //당월 시작일
var thisfuledtlday = ""; //당원 마지막일
var threefulstday = ""; //3개월전 시작일
var threefuledday = ""; //3개월전 마지막일
$(document).ready(function(){
//초기 전체 리스트 페이지 보여주기
var form = document.searchForm;
form.listType.value = "groupList";
linkPage(1);
var date = new Date() ;
//이전달 첫날/마지막날 조회
if(date.getMonth()+1 == 1){
lastfulstday = date.getFullYear()-1 + "/12" + "/01";
lastfuledday = date.getFullYear()-1 + "/12" + "/"+new Date(date.getFullYear()-1, 12, 0).getDate()+"";
}else{
lastfulstday = date.getFullYear() + "/" ;
lastfulstday += date.getMonth() < 10 ? "0"+ (date.getMonth()) : date.getMonth()+"" ;
lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ;
lastfulstday += "/01" ;
}
//당월 첫날/마지막날 조회
thisfulstlday = date.getFullYear() + "/" ;
thisfulstlday += date.getMonth()+1 < 10 ? "0"+ (date.getMonth()+1) : date.getMonth()+1+"" ;
thisfuledtlday = thisfulstlday + "/"+ new Date(date.getFullYear(), date.getMonth()+1, 0).getDate()+"";
thisfulstlday += "/01" ;
//3개월 이전 날짜 구해오기
threefulstday = prevMonth(3);
threefuledday = today();
/* 목록 정렬 항목 아이콘 표시 */
/* var searchSortCnd = $("[name='searchSortCnd']").val();
var searchSortOrd = $("[name='searchSortOrd']").val();
if (searchSortCnd != "" && searchSortOrd != "" && searchSortCnd != undefined && searchSortOrd != undefined) {
var $sort_div = $("#sort_"+ searchSortCnd);
var sortClass = 'sortBtn' ;
if (searchSortOrd == "desc") sortClass = "sortBtnDesc";
$sort_div.replaceClass('sortBtn' , sortClass) ;
$sort_div.attr("sortOrd", searchSortOrd);
} */
// 정렬 항목 이벤트
$(document).on('click', '.sort', function (){
listSortOrd(this);
});
//목록 정렬 항목 클릭
function listSortOrd(obj){
var sortOrd = $(obj).attr("sortOrd");
var sortCnd = $(obj).attr("id");
$("[name='searchSortCnd']").val(sortCnd.substring(5)); // 구분자 제거
if (sortOrd == "desc") $("[name='searchSortOrd']").val("asc");
else $("[name='searchSortOrd']").val("desc");
linkPage('1'); //각 JSP마다 다를때 메소드 정의해 줘야됨
}
//전체선택 실행
var allChkSts = false;
$("#allCheck").click(function(){
if(!allChkSts){// 전체선택이 해제되어 있을 경우
$("input[name=msgSentDel]").prop("checked", true);
allChkSts = true;
}else{
$("input[name=msgSentDel]").prop("checked", false);
allChkSts = false;
}
});
$(document).on('change','#pageUnit', function(){
linkPage(1);
});
});
//오늘날짜 구하기
function today() {
var d = new Date();
return getDateStr(d);
}
//이전 날짜 구하기
function prevDay(days) {
var d = new Date();
var dayOfMonth = d.getDate();
d.setDate(dayOfMonth - days);
return getDateStr(d);
}
//이전 월 구하기
function prevMonth(month) {
var d = new Date();
var monthOfYear = d.getMonth();
d.setMonth(monthOfYear - month);
return getDateStr(d);
}
//날짜 받아오기
function getDateStr(myDate){
var year = myDate.getFullYear();
var month = ("0"+(myDate.getMonth()+1)).slice(-2);
var day = ("0"+myDate.getDate()).slice(-2);
return ( year + '/' + month + '/' + day );
}
//캘린더에 날짜 입력해 주기
function setCalVal(val,targetObj){
$('input[name='+targetObj+']').val(val) ;
}
//검색 버튼 실행
function linkPage(pageNo){
var form = document.searchForm;
var stateType = form.stateType.value;
form.pageIndex.value = pageNo;
var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>');
$(".msgSentAllLoad").load("/web/kakao/sent/selectKakaoSentListViewAjax.do", sendData ,function(response, status, xhr){
});
}
//선택 삭제 실행
/*
function fnDelete(){
var msgId = [];
if($("input:checkbox[name='msgSentDel']").is(":checked")==false){
alert("한 개 이상의 전송 내역을 선택하세요");
return;
}
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
msgId[index] = $(this).val();
}
});
if(msgId.length > 0){
//22.04.25 구글 독스 alert 기준으로 이지우가 수정
// if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다."))
if(confirm("선택한 목록을 삭제하시겠습니까?")){
document.searchForm.msgGroupIdList.value = msgId;
var sendData = $(document.searchForm).serializeArray();
$(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){
});
// var form = document.searchForm;
// form.action="/web/mjon/msgsent/selectMsgSentView.do";
// form.submit();
}
}else{
alert("삭제할 문자를 선택해 주세요.");
return false;
}
}
*/
//상세보기 버튼 실행
function fnRevDetailPop(msgGroupId, msgId){
document.resPopForm.msgGroupId.value = msgGroupId;
document.resPopForm.msgId.value = msgId;
var sendData = $(document.resPopForm).serializeArray();
var form = document.searchForm;
if (form.listType.value == "privateList") {
// 개인별
$("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailData2Ajax.do", sendData ,function(response, status, xhr){
$('#tooltopClick').trigger('click');
});
}
else {
// 전송건별
$("#msgSentDetailPopLoad").load("/web/kakao/sent/selectKakaoSentDetailDataAjax.do", sendData ,function(response, status, xhr){
// 상세보기 클릭때마다 툴팁 1 tab이 열리게 설정
popupTab($('#atBtn'),'1');
$('#tooltopClick').trigger('click');
});
}
}
function fnListLoad(pageType, tabNum){
var form = document.searchForm;
var $tab = $(".table_tab_wrap li").eq(tabNum); //
$tab.addClass("active");
$tab.find("button").attr("title", "선택됨");
$tab.siblings("li.tab").removeClass("active");
$tab.siblings("li.btn_tab").removeClass("active");
$tab.siblings("li.tab").find("button").removeAttr("title");
if(pageType == 'fail'){
form.listType.value = "privateList";
$(".tab_depth1").hide();
} else {
$(".tab_depth1").show();
}
form.stateType.value = pageType;
linkPage(1);
}
// 전체/단문/장문/그림 탭 선택 처리
function fnTabLoad(tabType, tabNum){
var form = document.searchForm;
form.tabType.value = tabType;
//해당 탭의 전체 리스트 내역으로 불러오기
fnListLoad('all', '0');
var n=tabNum+1;
//탭 선택 CSS 처리
var $tab = $(".list_tab_wrap2 li:nth-child("+n+")");
var $tabPrev = $(".list_tab_wrap2 li:nth-child("+n+")").prev("li")
$tab.addClass("active");
$tab.find("button").attr("title", "선택됨");
$tab.siblings("li.tab").removeClass("active");
$tab.siblings("li.tab").find("button").removeAttr("title");
$tab.siblings("li:not(li:last-child)").find("button").css("border-right","1px solid #e5e5e5");
$tabPrev.find("button").css("border-right","0");
}
function fnSearch(pageNo){
var form = document.searchForm;
form.pageIndex.value = pageNo ;
form.action="/web/kakao/sent/selectKakaoSentView.do";
form.submit();
}
function fnExcelDownLoad(pageType, listType){
var form = document.searchForm;
var loginVO = '${LoginVO}';
form.stateType.value = pageType;
form.listType.value = listType;
if(loginVO == "" || loginVO == null){
alert("로그인 후 이용이 가능합니다.");
return false;
}
if(confirm("엑셀 다운로드를 하시겠습니까?")){
form.action="/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do";
form.submit();
}
}
$(document).on('click', '.msgGgoupList', function(){
var form = document.searchForm;
form.listType.value = "groupList";
linkPage(1);
});
$(document).on('click', '.msgPrivateList', function(){
var form = document.searchForm;
form.listType.value = "privateList";
linkPage(1);
});
function fnDeleteAddrNo(listType){
var msgId = [];
if($("input:checkbox[name='msgSentDel']").is(":checked")==false){
alert("한 개 이상의 전송 내역을 선택하세요");
return;
}
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
msgId[index] = $(this).val();
}
});
if(msgId.length > 0){
//22.04.25 구글 독스 alert 기준으로 이지우가 수정
/* if(confirm("선택한 수신번호를 주소록에서 삭제하시겠습니까? 삭제된 주소록은 복구가 불가능 합니다.")){ */
if(confirm("선택하신 번호를 주소록에서 삭제하시겠습니까?")){
var form = document.searchForm;
form.msgGroupIdList.value = msgId;
form.listType.value = listType;
var data = new FormData(form);
url = "/web/mjon/msgsent/deleteAddrNoDataAjax.do";
$.ajax({
type: "POST",
url: url,
data: data,
dataType:'json',
async: false,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if("fail"==returnData.result){
alert(returnData.message);
return false;
}else if("loginFail"==returnData.result){
alert(returnData.message);
return false;
}else if(returnData.resultCnt == '0'){
alert("주소록에 삭제할 연락처가 없습니다.");
return false;
}else{
alert(returnData.message);
return false;
}
} else if(status== 'fail'){
alert(returnData.message);
}
},
error: function (e) { alert("주소록 삭제에 실패하였습니다."); console.log("ERROR : ", e); }
});
}
}else{
alert("삭제할 문자를 선택해 주세요.");
return false;
}
}
function fnAddBlockNo(listType){
var msgId = [];
if($("input:checkbox[name='msgSentDel']").is(":checked")==false){
alert("선택된 항목이 없습니다.");
return;
}
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
msgId[index] = $(this).val();
}
});
if(msgId.length > 0){
//if(confirm("선택한 수신번호를 주소록에서 삭제하시겠습니까? 삭제된 주소록은 복구가 불가능 합니다.")){
var form = document.searchForm;
form.msgGroupIdList.value = msgId;
form.listType.value = listType;
var data = new FormData(form);
url = "/web/mjon/msgsent/insertAddBlockNoDataAjax.do";
$.ajax({
type: "POST",
url: url,
data: data,
dataType:'json',
async: false,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if("fail"==returnData.result){
alert(returnData.message);
return false;
}else if("loginFail"==returnData.result){
alert(returnData.message);
return false;
}else if(returnData.resultCnt == '0'){
alert("주소록에 삭제할 연락처가 없습니다.");
return false;
}else{
alert(returnData.message);
return false;
}
} else if(status== 'fail'){
alert(returnData.message);
}
},
error: function (e) { alert("수신거부번호 등록에 실패하였습니다."); console.log("ERROR : ", e); }
});
//}
}else{
alert("수신거부번호를 등록할 문자를 선택해 주세요.");
return false;
}
}
function fnReSendMsg(){
var msgSeq = [];
if($("input:checkbox[name='msgSentDel']").is(":checked")==false){
alert("선택된 항목이 없습니다.");
return;
}
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
msgSeq[index] = $(this).val();
}
});
var form = document.reSendForm;
form.msgSeqList.value = msgSeq;
form.msgResendFlag.value = "Y";
form.action="/web/mjon/msgdata/selectMsgDataView.do";
form.submit();
}
function fnMsgSFDetailList(msgGroupId, resultType){
var form = document.resPopForm;
form.msgGroupId.value = msgGroupId;
form.resultType.value = resultType;
//만들려는 팝업의 크기
var popup_wid = '1280';
var popup_ht = '700';
var popup_left = (window.screen.width / 2) - (popup_wid / 2);
var popup_top =(window.screen.height / 2) - (popup_ht / 2);
$("#resPopForm").attr("target","msgSFDetailPop");
window.open('', 'msgSFDetailPop', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top );
$("#resPopForm").attr({"action":"/web/kakao/sent/selectKakaoSentSFDetailListAjax.do", "method":"post"}).submit();
}
/* 사용내역서 클릭 시 내역서 새창 팝업 오픈 */
function fnShowPrintPopup(tabType, type) {
//만들려는 팝업의 크기
var popup_wid = '840';
var popup_ht = '900';
var popup_left = (window.screen.width / 2) - (popup_wid / 2);
var popup_top =(window.screen.height / 2) - (popup_ht / 2);
$("#tabType").val(tabType);
$("#searchForm").attr("target","msgSentPrint");
window.open('', 'msgSentPrint', 'width='+ popup_wid +', height='+ popup_ht +', left=' + popup_left + ', top='+ popup_top +',scrollbars=1');
$("#searchForm").attr({"action":"/web/kakao/sent/printKakaoSentDataAjax.do", "method":"post"}).submit();
}
function addrGroupDuplCnt() {
document.searchForm.addrGrpNm.value = $('#grpNm').val();
var data = $('#searchForm').serialize();
//var data = new FormData(form);
var flag = true;
var url = "/web/addr/selectDuplAddrGroupNameAjax.do";
$.ajax({
async: false,
type: "post",
url: url,
data: data,
dataType:"JSON",
// contentType: false,
// processData: false,
cache: false,
success: function (returnData, status) {
if("dupl"==returnData.result1) {
flag = false;
}
},
error: function (e) {
alert("error");
console.log("ERROR : ", e);
}
});
return flag;
}
//주소록 그룹 등록 기능
function fnAddAddrNo(){
var addrGrpNm = $('#grpNm').val(); //입력 그룹 이름 불러오기
var msgId = [];
if($("input:checkbox[name='msgSentDel']").is(":checked")==false){
alert("한 개 이상의 전송 내역을 선택하세요");
return;
}
$("input:checkbox[name='msgSentDel']:checked").each(function(index){
var disabledChk = $(this).prop('disabled');
if(!disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
msgId[index] = $(this).val();
}
});
if(msgId.length > 0 && addrGrpNm != ''){
//주소록 그룹명 중복체크
if(!addrGroupDuplCnt()) {
alert("이미 등록되어있는 주소록입니다.");
return false;
}
var form = document.searchForm;
form.msgGroupIdList.value = msgId;
form.addrGrpNm.value = addrGrpNm;
var data = new FormData(form);
url = "/web/mjon/msgsent/insertAddAddrGrpDataAjax.do";
$.ajax({
type: "POST",
url: url,
data: data,
dataType:'json',
async: false,
processData: false,
contentType: false,
cache: false,
success: function (returnData, status) {
if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
if("fail"==returnData.result){
alert(returnData.message);
return false;
}else if("loginFail"==returnData.result){
alert(returnData.message);
return false;
}else if(returnData.resultCnt == '0'){
alert("주소록에 등록할 연락처가 없습니다.");
return false;
}else{
alert(returnData.message);
$('#grpNm').val(""); //입력한 그룹명 초기화
$(".tooltip-close").trigger("click");
return false;
}
} else if(status== 'fail'){
alert(returnData.message);
}
},
error: function (e) { alert("주소록 등록에 실패하였습니다."); console.log("ERROR : ", e); }
});
}else{
alert("등록할 문자를 선택해 주세요.");
return false;
}
}
/* 윈도우팝업 열기 */
function infoPop(pageUrl){
document.popForm.pageType.value = pageUrl;
document.popForm.action = "/web/pop/infoPop.do";
document.popForm.method = "post";
window.open("about:blank", 'infoPop', 'width=790, height=320, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
document.popForm.target = "infoPop";
document.popForm.submit();
}
</script>
<!-- 문자내용 팝업 data-tooltip: rev_popup01 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer kakao_rev_popup rev_popup01" tabindex="0" data-tooltip-con="rev_popup01"
data-focus="rev_popup01" data-focus-prev="rev_popup01-close" style="width: 440px;">
<div class="popup_heading">
<p>문자내용</p>
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"><img
src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<!-- 팝업 상세내용 노출 -->
<div id="msgSentDetailPopLoad" >
</div>
<div class="popup_btn_wrap2" style="justify-content: center;">
<button type="button" class="tooltip-close" data-focus="rev_popup01-close"
data-focus-next="rev_popup01">닫기</button>
</div>
</div>
</div>
</div>
<!-- //문자내용 팝업 data-tooltip: rev_popup01 -->
<!-- 그룹등록 팝업 data-tooltip:rev_popup02 -->
<div class="tooltip-wrap">
<div class="popup-com adr_layer rev_popup02" tabindex="0" data-tooltip-con="rev_popup02" data-focus="rev_popup02" data-focus-prev="rev_popup02-close" style="width: 500px;">
<div class="popup_heading">
<p>그룹등록</p>
<button type="button" class="tooltip-close" data-focus="rev_popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
</div>
<div class="layer_in">
<div class="gorup_join_cont">
<p class="adr_pop_title">선택된 발송내역 전화번호를 그룹으로 등록합니다.</p>
<div class="group_input" style="margin-top: 0;">
<div class="input_left">그룹이름</div>
<div class="input_right">
<label for="grpNm" class="label">새 그룹명 입력</label>
<input type="text" id="grpNm" name="grpNm" placeholder="새 그룹명 입력" onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명 입력'" class="inputLight">
</div>
</div>
<div class="popup_btn_wrap2">
<button type="button" onclick="javascript:fnAddAddrNo(); return false;">저장</button>
<button type="button" class="tooltip-close" data-focus="rev_popup02-close" data-focus-next="rev_popup02">취소</button>
</div>
</div>
</div>
</div>
</div>
<div class="inner">
<!-- send top -->
<div class="send_top">
<!-- 결제관리 - 요금 사용내역 -->
<div class="rev_admin_cont serv_content current">
<div class="heading">
<h2>발송결과</h2>
<button type="button" class="button info" onclick="infoPop('selectMsgSentView');">사용안내</button>
<button type="button" class="button junk" data-tooltip="popupJunk">통신사 스팸규격안내</button>
</div>
<div class="pay_tab_wrap">
<!-- tab button -->
<%@include file="/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp" %>
<!--// tab button -->
</div>
<form id="searchForm" name="searchForm" method="post">
<input type="hidden" id="pageIndex" name="pageIndex" value="1"/>
<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 -->
<input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 -->
<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
<!-- 각 통계별 총 건수 -->
<c:set var="totAllCnt" value="0"/><!-- 전체 건수 -->
<c:set var="totAtCnt" value="0"/><!-- 알림톡 건수 -->
<c:set var="totFtCnt" value="0"/><!-- 친구톡 건수 -->
<!-- 각 통계별 성공, 실패 건수 처리 -->
<c:set var="waitAllCnt" value="0"/><!-- 전체 대기 건수 -->
<c:set var="succAllCnt" value="0"/><!-- 전체 성공 건수 -->
<c:set var="failAllCnt" value="0"/><!-- 전체 실패 건수 -->
<c:set var="waitAtCnt" value="0"/><!-- 알림톡 대기 건수 -->
<c:set var="succAtCnt" value="0"/><!-- 알림톡 성공 건수 -->
<c:set var="failAtCnt" value="0"/><!-- 알림톡 실패 건수 -->
<c:set var="waitFtCnt" value="0"/><!-- 친구톡 대기 건수 -->
<c:set var="succFtCnt" value="0"/><!-- 친구톡 성공 건수 -->
<c:set var="failFtCnt" value="0"/><!-- 친구톡 실패 건수 -->
<!-- 발송대기 건수가 있으면 이것도 발송 실패건수로 일단 집계한다. -->
<c:forEach var="totalMsgCnt" items="${totalMsgCnt}" varStatus="status">
<!-- 전체 갯수 구하기 -->
<c:set var="totAllCnt" value="${totAllCnt + totalMsgCnt.msgResultCnt}"/>
<!-- 전체 대기 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'W'}">
<c:set var="waitAllCnt" value="${waitAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 성공 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'S'}">
<c:set var="succAllCnt" value="${succAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
<!-- 전체 실패 갯수 -->
<c:if test="${totalMsgCnt.msgResultSts == 'F'}">
<c:set var="failAllCnt" value="${failAllCnt + totalMsgCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 알림톡 처리 -->
<c:forEach var="atCnt" items="${atCnt}" varStatus="status">
<!-- 단문 전체 갯수 구하기 -->
<c:set var="totAtCnt" value="${totAtCnt + atCnt.msgResultCnt}"/>
<!-- 단문 대기 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'W'}">
<c:set var="waitAtCnt" value="${waitAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 성공 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'S'}">
<c:set var="succAtCnt" value="${succAtCnt + atCnt.msgResultCnt}"/>
</c:if>
<!-- 단문 실패 갯수 구하기 -->
<c:if test="${atCnt.msgResultSts == 'F'}">
<c:set var="failAtCnt" value="${failAtCnt + atCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<!-- 친구톡 처리 -->
<c:forEach var="ftCnt" items="${ftCnt}" varStatus="status">
<!-- 장문 전체 갯수 구하기 -->
<c:set var="totFtCnt" value="${totFtCnt + ftCnt.msgResultCnt}"/>
<!-- 장문 대기 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'W'}">
<c:set var="waitFtCnt" value="${waitFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 성공 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'S'}">
<c:set var="succFtCnt" value="${succFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
<!-- 장문 실패 갯수 구하기 -->
<c:if test="${ftCnt.msgResultSts == 'F'}">
<c:set var="failFtCnt" value="${failFtCnt + ftCnt.msgResultCnt}"/>
</c:if>
</c:forEach>
<div class="rev_content kakao_rev_content" id="tab5_2">
<div class="rev_admin">
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>전체</p>
<p><span><fmt:formatNumber value="${totAllCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAllCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>알림톡</p>
<p><span><fmt:formatNumber value="${totAtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failAtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div>
<%-- <div class="rev_admin_in">
<div class="rev_admin_top clearfix">
<p>친구톡</p>
<p><span><fmt:formatNumber value="${totFtCnt}" pattern="#,###"/></span> 건</p>
</div>
<div class="rev_admin_btm">
<dl>
<dt>대기</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${waitFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>성공</dt>
<dd><span class="c_002c9a"><fmt:formatNumber value="${succFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
<dl>
<dt>실패</dt>
<dd><span class="c_e40000"><fmt:formatNumber value="${failFtCnt}" pattern="#,###"/></span>건</dd>
</dl>
</div>
</div> --%>
</div>
<div class="excel_middle">
<div class="select_btnWrap clearfix">
<div class="btn_left">
<span class="cal_label">기간선택</span>
<div class="calendar_wrap">
<input type="text" class="startDate inp calendar" title="검색 시작일" id="startDate" name="startDate" value="<c:out value='${kakaoSentVO.startDate}'/>" data-datecontrol="true">
<span class="dateEtc">~</span>
<input type="text" class="endDate inp calendar" title="검색 종료일" id="endDate" name="endDate" value="<c:out value='${kakaoSentVO.endDate}'/>" data-datecontrol="true">
</div>
<!-- <button type="button">전월</button>
<button type="button">당월</button> -->
<button type="button" onclick="setCalVal(lastfulstday,'startDate');setCalVal( lastfuledday,'endDate'); return false;" class="btnType btnType19">전월</button>
<button type="button" onclick="setCalVal(thisfulstlday,'startDate');setCalVal( thisfuledtlday,'endDate'); return false;" class="btnType btnType19">당월</button>
<!-- <button type="button">3개월</button> -->
<button type="button" onclick="setCalVal(threefulstday,'startDate');setCalVal( threefuledday,'endDate'); return false;" class="btnType btnType19">3개월</button>
<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
</div>
<div class="btn_right">
<label for="searchCondition" class="label">발신번호 선택 == ${kakaoSentVO.searchCondition}</label>
<select name="searchCondition" id="searchCondition" class="selType2">
<option value="3" <c:if test="${kakaoSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option>
</select>
<div class="search">
<label for="id" class="label"></label>
<input type="text" id="searchKeyword" name="searchKeyword" value="<c:out value='${searchKeyword}'/>" placeholder="검색어를 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요.'">
<button type="button" class="btnType btnType2" onClick="javascript:fnSearch(1); return false;">검색</button>
</div>
</div>
</div>
</div>
<div class="list_tab_wrap2 type4">
<!-- tab button -->
<ul class="list_tab">
<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
<%-- <c:if test="${fn:contains(pageContext.request.requestURL , 'localhost') --%>
<%-- || fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%>
<!-- <li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li> -->
<%-- </c:if> --%>
</ul><!--// tab button -->
</div>
<!-- 예약관리 > 전체 -->
<div class="price_history_cont current" id="listTab_2">
<!-- tab button -->
<div class="table_tab_wrap">
<ul>
<li class="tab active">
<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li>
<li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li>
</ul><!--// tab button -->
<div class="tab_depth1">
<a href="#none" class="on msgGgoupList">받는사람(전송건별)</a>
<a href="#none" style="display: none;"></a>
<a href="#none" class="msgPrivateList">받는사람(개인별)</a>
<div class="on_active">받는사람(전송건별)</div>
</div>
</div>
<!-- 발송관리 리스트 -->
<div class="table_cont current msgSentAllLoad" id="tableCont_1">
</div><!-- //전체 종료 -->
<!-- table -->
</div>
</form>
</div>
</div>
</div><!--// send top -->
</div>
<form id="resPopForm" name="resPopForm" method="post">
<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
<input type="hidden" id="msgId" name="msgId" value=""/>
<input type="hidden" id="fileCnt" name="fileCnt" value=""/>
<input type="hidden" id="resultType" name="resultType" value="S"/>
</form>
<form id="reSendForm" name="reSendForm" method="post">
<input type="hidden" id="msgSeqList" name="msgSeqList" value=""/>
<input type="hidden" id="msgResendFlag" name="msgResendFlag" value="N"/>
</form>
<form name="popForm" id="popForm" method="post">
<input type="hidden" name="pageType" id="pageType" value=""/>
</form>

View File

@ -613,6 +613,7 @@ function getFilteredDataByTab() {
//주소록 그룹정보 불러오기
function getAddrGroupList() {
$.ajax({