diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java index 714bd229..93d49f51 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java @@ -16,8 +16,10 @@ public class MjonMsgDetailSentVO extends UserDefaultVO{ private String msgGroupId; private String reqDate; + private String regDate; private String msgGroupCnt; private String reserveYn; + private String reserveCYn; private String callFrom; private String userId; private String smsTxt; @@ -25,6 +27,7 @@ public class MjonMsgDetailSentVO extends UserDefaultVO{ private String msgType; private String fileCnt; private String msgKind; + private String eachPrice; private String sentDate; private String filePath1; private String filePath2; @@ -33,6 +36,24 @@ public class MjonMsgDetailSentVO extends UserDefaultVO{ private String callTo; private String statusTxt; private String addrNm; + + + private String resultSValue; + private String resultFValue; + private String resultWValue; + + private String successPct; + private String failedPct; + private String waitingPct; + + + + + + private String statusCd; // 진행상태 코드 + private String divideYN; + private int diffMin; + private String totPrice; // FileInfo 리스트 필드 추가 diff --git a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java index 8b1e893d..4d6571ea 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java @@ -4,11 +4,17 @@ import java.util.Date; import java.util.List; import itn.let.uss.umt.service.UserDefaultVO; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MjonMsgSentVO extends UserDefaultVO{ private static final long serialVersionUID = 1L; diff --git a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java index b78666a8..9e044cfe 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java @@ -127,7 +127,6 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements Map resultMap = new HashMap(); System.out.println("mjonMsgSentVO.getSearchConditionSite() :: "+ mjonMsgSentVO.getSearchConditionSite()); - // 목록 List resultList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO); @@ -136,36 +135,11 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements resultList = makeDetailFunction(resultList); - // 공통코드 ITN057에 대한 코드화 진행 /* - * CODE_ID CODE CODE_NM CODE_DC - * ITN057 01 진행중 진행중 - * ITN057 02 완료 완료출해야함 - * ITN057 03 예약대기 예약대기(발송전) 버튼으로 노출해야함 - * ITN057 04 - 예약취소 ( - 으로 노출 ) + * 진행상태 코드화 * */ resultList.stream().forEach(t->{ - - String code; - - log.info(" + t.getDiffMin() :: [{}]", t.getDiffMin()); - log.info(" + t.getDiffMin() :: [{}]", t.getDiffMin() > -5); - if ("Y".equals(t.getReserveCYn())) { - code = "04"; // 예약취소 코드 - } else if ( - "Y".equals(t.getReserveYn()) - && "N".equals(t.getReserveCYn()) - && t.getMsgGroupCnt().equals(t.getResultWValue()) - && t.getDiffMin() < -5 // 예약 시간이 5분 이상인 것들만 - ) { - code = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 ) - } else if (t.getMsgGroupCnt().equals(t.getResultSValue()) || t.getMsgGroupCnt().equals(t.getResultFValue())) { - code = "02"; // 완료 코드 - } else { - code = "01"; // 진행중 코드 - } - - + String code = getStatusCode(t); t.setStatusCd(code); }); @@ -187,25 +161,61 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements Map resultMap = new HashMap(); // 목록 - MjonMsgDetailSentVO result = mjonMsgSentDAO.selectAllMsgSentDetailView(mjonMsgDetailSentVO); + MjonMsgDetailSentVO resultVO = mjonMsgSentDAO.selectAllMsgSentDetailView(mjonMsgDetailSentVO); + + + // 성공 대기 실패 발송금액 분할여부 + MjonMsgSentVO updatedVO = getDetailFunction(resultVO.getMsgGroupId(), resultVO.getEachPrice()); + resultVO.setResultSValue(updatedVO.getResultSValue()); // 성공건수 + resultVO.setResultWValue(updatedVO.getResultWValue()); // 대기건수 + resultVO.setResultFValue(updatedVO.getResultFValue()); // 실패건수 + resultVO.setTotPrice(updatedVO.getTotPrice()); + resultVO.setDivideYN(updatedVO.getDivideYN()); + + + // 퍼센트 계산 실행 + Map returnMap = calculatePercentages(resultVO); + resultVO.setSuccessPct(returnMap.get("successPct")); + resultVO.setWaitingPct(returnMap.get("waitingPct")); + resultVO.setFailedPct(returnMap.get("failedPct")); + + + // 진행상태 코드화 + String statusCode = getStatusCode(MjonMsgSentVO.builder() + .reserveCYn(resultVO.getReserveCYn()) + .reserveYn(resultVO.getReserveYn()) + .msgGroupCnt(resultVO.getMsgGroupCnt()) + .resultSValue(resultVO.getResultSValue()) + .resultWValue(resultVO.getResultWValue()) + .resultFValue(resultVO.getResultFValue()) + .diffMin(resultVO.getDiffMin()) + .build()); + log.info(" ++ statusCode :: [{}]" ,statusCode); + resultVO.setStatusCd(statusCode); + + // 결과 출력 + System.out.println("성공률: " + returnMap.get("successPct")); + System.out.println("대기율: " + returnMap.get("waitingPct")); + System.out.println("실패율: " + returnMap.get("failedPct")); + // 광고일떄 (광고)와 줄바꿈+무료거부 0808800858 삭제 - if("A".equals(result.getMsgKind())) { - result.setSmsTxt(result.getSmsTxt().replace("(광고)", "") + if("A".equals(resultVO.getMsgKind())) { + resultVO.setSmsTxt(resultVO.getSmsTxt().replace("(광고)", "") .replaceAll("\\s*무료거부 0808800858", "")); } - if(StringUtils.isNotEmpty(result.getFileCnt()) && Integer.parseInt(result.getFileCnt()) > 0) + if(StringUtils.isNotEmpty(resultVO.getFileCnt()) && Integer.parseInt(resultVO.getFileCnt()) > 0) { - List fileInfos = getFileInfo(result); - result.setFileInfos(fileInfos); + List fileInfos = getFileInfo(resultVO); + resultVO.setFileInfos(fileInfos); } - resultMap.put("result", result); + resultMap.put("result", resultVO); return resultMap; } @@ -428,11 +438,11 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements //예약 관리 리스트 불러오기 List resultAllSentList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO); - long startTime = System.nanoTime(); // 시작 시간 측정 +// long startTime = System.nanoTime(); // 시작 시간 측정 resultAllSentList = makeDetailFunction(resultAllSentList); - long endTime = System.nanoTime(); // 끝난 시간 측정 - double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0; - System.out.println("Execution time: " + executionTimeInSeconds + " seconds"); +// long endTime = System.nanoTime(); // 끝난 시간 측정 +// double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0; +// System.out.println("Execution time: " + executionTimeInSeconds + " seconds"); SXSSFWorkbook workbook = null; // SXSSFWorkbook 변수 선언 try{ @@ -658,41 +668,122 @@ public class MjonMsgSentServiceImpl extends EgovAbstractServiceImpl implements } + /** + * @methodName : makeDetailFunction + * @author : 이호영 + * @date : 2025.02.04 + * @description : 발송결과 성공건수, 실패건수, 대기건수, 분할발송여부, 총 발송금액 구하기 + * @param resultList + * @return + */ private List makeDetailFunction(List resultList) { resultList.stream().forEach(t->{ - MjonMsgSWFDTO mjonMsgSWFDTO = mjonMsgSentDAO.findBySWF(t.getMsgGroupId()); - t.setResultSValue(String.valueOf(mjonMsgSWFDTO.getResultSValue())); // 성공건수 - t.setResultFValue(String.valueOf(mjonMsgSWFDTO.getResultFValue())); // 실패건수 - t.setResultWValue(String.valueOf(mjonMsgSWFDTO.getResultWValue())); // 대기건수 - t.setDivideYN(mjonMsgSWFDTO.getDivideYN()); - - - // TotPrice : 성공건수에 대한 금액 곱하기 - BigDecimal eachPrice = new BigDecimal(t.getEachPrice()); - BigDecimal resultSValue = new BigDecimal(mjonMsgSWFDTO.getResultSValue()); - BigDecimal totalPrice = eachPrice.multiply(resultSValue); - // 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장 - // RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림 - BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP); + MjonMsgSentVO updatedVO = getDetailFunction(t.getMsgGroupId(), t.getEachPrice()); - // roundedTotalPrice가 0인지 확인 - // BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드 - // 결과: - // - 반환 값이 0이면 두 값이 같음 - // - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음 - // - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼 - if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) { - // roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정 - t.setTotPrice("-"); - } else { - // roundedTotalPrice 값이 0이 아닌 경우 - // 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정 - // toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환 - t.setTotPrice(roundedTotalPrice.toPlainString()); - } + t.setResultSValue(updatedVO.getResultSValue()); + t.setResultFValue(updatedVO.getResultFValue()); + t.setResultWValue(updatedVO.getResultWValue()); + t.setDivideYN(updatedVO.getDivideYN()); + t.setTotPrice(updatedVO.getTotPrice()); }); return resultList; } + private MjonMsgSentVO getDetailFunction(String p_msgGroupId, String p_eachPrice) { + + + MjonMsgSentVO returnVO = new MjonMsgSentVO(); + + MjonMsgSWFDTO mjonMsgSWFDTO = mjonMsgSentDAO.findBySWF(p_msgGroupId); + returnVO.setResultSValue(String.valueOf(mjonMsgSWFDTO.getResultSValue())); // 성공건수 + returnVO.setResultFValue(String.valueOf(mjonMsgSWFDTO.getResultFValue())); // 실패건수 + returnVO.setResultWValue(String.valueOf(mjonMsgSWFDTO.getResultWValue())); // 대기건수 + returnVO.setDivideYN(mjonMsgSWFDTO.getDivideYN()); + + + // TotPrice : 성공건수에 대한 금액 곱하기 + BigDecimal eachPrice = new BigDecimal(p_eachPrice); + BigDecimal resultSValue = new BigDecimal(mjonMsgSWFDTO.getResultSValue()); + BigDecimal totalPrice = eachPrice.multiply(resultSValue); + // 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장 + // RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림 + BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP); + + // roundedTotalPrice가 0인지 확인 + // BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드 + // 결과: + // - 반환 값이 0이면 두 값이 같음 + // - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음 + // - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼 + if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) { + // roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정 + returnVO.setTotPrice("-"); + } else { + // roundedTotalPrice 값이 0이 아닌 경우 + // 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정 + // toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환 + returnVO.setTotPrice(roundedTotalPrice.toPlainString()); + } + log.info(" + returnVO.getTotPrice() :: [{}]", returnVO.getTotPrice()); + return returnVO; + + + } + + + + private Map calculatePercentages(MjonMsgDetailSentVO result) { + int total = Integer.parseInt(result.getMsgGroupCnt()); // 전체 건수 + int success = Integer.parseInt(result.getResultSValue()); // 성공 건수 + int waiting = Integer.parseInt(result.getResultWValue()); // 대기 건수 + int failed = Integer.parseInt(result.getResultFValue()); // 실패 건수 + + // 퍼센트 계산 (0으로 나누는 경우 대비) + String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%"; + String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%"; + String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%"; + + // 결과 맵에 저장 + Map percentages = new HashMap<>(); + percentages.put("successPct", successPct); + percentages.put("waitingPct", waitingPct); + percentages.put("failedPct", failedPct); + + return percentages; + + } + + // 공통코드 ITN057에 대한 코드화 진행 + /* + * CODE_ID CODE CODE_NM CODE_DC + * ITN057 01 진행중 진행중 + * ITN057 02 완료 완료출해야함 + * ITN057 03 예약대기 예약대기(발송전) 버튼으로 노출해야함 + * ITN057 04 - 예약취소 ( - 으로 노출 ) + * */ + private String getStatusCode(MjonMsgSentVO result) { + + String returnCode; + + if ("Y".equals(result.getReserveCYn())) { + returnCode = "04"; // 예약취소 코드 + } else if ( + "Y".equals(result.getReserveYn()) + && "N".equals(result.getReserveCYn()) + && result.getMsgGroupCnt().equals(result.getResultWValue()) + && result.getDiffMin() < -5 // 예약 시간이 5분 이상인 것들만 + ) { + returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 ) + } else if (result.getMsgGroupCnt().equals(result.getResultSValue()) + || result.getMsgGroupCnt().equals(result.getResultFValue())) { + returnCode = "02"; // 완료 코드 + } else { + returnCode = "01"; // 진행중 코드 + } + + + return returnCode; + + } } diff --git a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java index 99466ac6..1f0213a8 100644 --- a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java +++ b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java @@ -164,13 +164,21 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll /** * 발송관리 화면 * @param searchVO - * @param model + * @param model/web/user/login/login.do * @return "/web/mjon/msgtxt/selectMsgTxtView.do" * @throws Exception */ @RequestMapping(value= {"/web/mjon/msgsent/msgSentDetailView.do"}) - public String selectMsgSentDetailView(@ModelAttribute("searchVO") MjonMsgDetailSentVO mjonMsgDetailSentVO, - RedirectAttributes redirectAttributes, ModelMap model) throws Exception{ + public String selectMsgSentDetailView(@ModelAttribute("searchVO") MjonMsgDetailSentVO mjonMsgDetailSentVO + , ModelMap model) throws Exception{ + + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + if(loginVO == null) { + return "redirect:/web/user/login/login.do"; + } Map resultMap = mjonMsgSentService.selectAllMsgSentDetailView(mjonMsgDetailSentVO); model.addAttribute("result", resultMap.get("result")); diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml index 5daaacd7..204ff38f 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml @@ -354,18 +354,22 @@ MGD.MSG_GROUP_ID as msgGroupId , MGD.MSG_GROUP_CNT as msgGroupCnt , MGD.RESERVE_YN as reserveYn + , MGD.RESERVE_C_YN as reserveCYn , MGD.CALL_FROM as callFrom , MGD.USER_ID as userId , MGD.SMS_TXT as smsTxt , MGD.SUBJECT as subject - , MGD.REQ_DATE as reqdate + , DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %H:%i') as reqDate + , DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %H:%i') as regDate , MGD.MSG_TYPE as msgType , MGD.MSG_KIND as msgKind - , MD.SENT_DATE as sentDate + , MGD.EACH_PRICE as eachPrice + , DATE_FORMAT(MD.SENT_DATE, '%Y-%m-%d %H:%i') as sentDate , MD.FILE_CNT as fileCnt , MD.FILE_PATH1 as filePath1 , MD.FILE_PATH2 as filePath2 , MD.FILE_PATH3 as filePath3 + , TIMESTAMPDIFF(minute, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin from MJ_MSG_GROUP_DATA MGD inner join MJ_MSG_DATA MD on diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp index 071eaa74..512cae4d 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp @@ -3,9 +3,25 @@ <%@ 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" %> + + +
@@ -144,95 +250,136 @@ function fn_setData(data){
- -
-
-
-

발송정보

-

+ +
+
+
+

발송정보

+

+
+
+
+
발송일시
+
+ ${result.reqDate} +
+
+ +
+
등록일시
+
${result.regDate }
+
+
+
+
제목
+
${result.subject }
+
+
+
형태
+
+ ${result.msgType == '4' + ? '단문' + : (result.fileCnt == '0' + ? '장문' + : '그림')} +
+
+
+
발송건수
+
+
+
+
발신번호
+
${result.callFrom }
+
+
+
진행상황 + + +
+
예약
+ + +
+ +
+ 100,000건35분 간격 +
+
+
+
+
+ +
+ + +
+ + + + + + +

+
+
+ + + +
+ +
+
+
+
+
발송요금
+
78,100
+ +
+
+
-
-
-
발송일시
-
2024-07-18 15:25
-
-
-
형태
-
그림
-
-
-
발송건수
-
100
-
-
-
발신번호
-
010-1234-5678
-
-
-
예약관리
- -
- -
+ + +
+
+
+

상세결과

+

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

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

+
-
-
-
발송요금
-
100
- -
-
-
-
- - -
-
-
-

상세결과

-

-
-
-
-
-
전체건수
-
101건(100%)
-
-
-
-
-
성공건수
-
100건(100%)
-
-
-
-
-
-
-
대기건수
-
0건(0%)
-
-
-
-
-
실패건수
-
1건(100%)
-
-
-
-
-
- + -
-
- - -
-
-

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

-
-
@@ -294,12 +441,12 @@ function fn_setData(data){
-

(광고)

+

(광고)

-

무료 거부 080-0000-0000

+

무료 거부 080-0000-0000

@@ -327,7 +474,7 @@ function fn_setData(data){
-