diff --git a/src/main/java/itn/com/cmm/util/MsgSendUtils.java b/src/main/java/itn/com/cmm/util/MsgSendUtils.java index cabf82ca..cc29dcc7 100644 --- a/src/main/java/itn/com/cmm/util/MsgSendUtils.java +++ b/src/main/java/itn/com/cmm/util/MsgSendUtils.java @@ -338,6 +338,19 @@ public final class MsgSendUtils { setImagePathsForMsgSendVO(mjonMsgVO, sendVO); + + + + + + + + + // 지연 여부 처리 + if ("Y".equalsIgnoreCase(mjonMsgVO.getDelayYn())) { + calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸 + } + // 예약 여부 확인 if ("Y".equalsIgnoreCase(mjonMsgVO.getReserveYn())) { // 분할 발송일 경우 @@ -356,6 +369,20 @@ public final class MsgSendUtils { } + + + + + + + + + + + + + + // 전송사 코드 셋팅 String agentCode = "00".equals(mjonMsgVO.getAgentCode()) ? MsgSendUtils.assignAgentBasedOnCount(agentSendCounts, sendRateList) @@ -367,10 +394,13 @@ public final class MsgSendUtils { } // Group TB에 넣어줄 제목 // 치환안된 sms 데이터로 넣어야함 - mjonMsgVO.setMmsSubject(getMmsgSubject(smsTxtTemp, msgKind)); + log.info(" mjonMsgSendListVO size :: [{}]", mjonMsgSendListVO.size()); + if (LONG_MSG_TYPE.equals(mjonMsgSendListVO.get(0).getMsgType())){ + mjonMsgVO.setMmsSubject(getMmsgSubject(smsTxtTemp, msgKind)); + } return true; - + } /** @@ -402,17 +432,29 @@ public final class MsgSendUtils { private static void checkSpamAndSetStatus(MjonMsgVO mjonMsgVO, String personalizedSmsTxt, List resultSpamTxt) throws Exception { String resultParser = ComGetSpamStringParser.getSpamTextParse(personalizedSmsTxt).trim(); int spmCnt = 0; + String spmFilterTxt = ""; for (String spmTxt : resultSpamTxt) { String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim(); if (resultParser.contains(parserStr)) { spmCnt++; + spmFilterTxt += spmTxt + ","; } } if (spmCnt > 0) { // 스팸 문자가 포함된 경우 - System.out.println("++++++++++++++ spam smsTxt ::: " + resultParser); + + if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) { + // 처음부터 idx 만큼 잘라낸 나머지 글자 + spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1); + + } + log.info(" + spmFilterTxt :: [{}]", spmFilterTxt); + log.info(" + resultParser :: [{}]", resultParser); + +// mjonMsgVO.setSpamKeyword(spmFilterTxt); mjonMsgVO.setSpamStatus("Y"); + mjonMsgVO.setDelayYn("Y"); }else {mjonMsgVO.setSpamStatus("N");} } @@ -487,7 +529,7 @@ public final class MsgSendUtils { - private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { + public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) { statusResponse.setStatus(httpStatus); statusResponse.setMessage(msg); diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 5979cde6..a78c727b 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -2,24 +2,112 @@ package itn.let.mjo.mjocommon; import java.io.IOException; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; +import java.util.List; +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.mysql.jdbc.StringUtils; +import itn.com.cmm.MjonMsgSendVO; +import itn.com.cmm.OptimalMsgResultDTO; +import itn.com.cmm.util.MsgSendUtils; import itn.let.kakao.kakaoComm.KakaoVO; +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.event.service.MjonEventService; +import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; +import itn.let.mjo.msgholiday.service.MsgHolidayService; +import itn.let.mjo.msgholiday.service.MsgHolidayVO; +import itn.let.sym.site.service.EgovSiteManagerService; +import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uss.umt.service.EgovUserManageService; +import itn.let.uss.umt.service.UserManageVO; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Service("MjonCommon") public class MjonCommon { - //Slack Web Hook URL - private String url = "https://hooks.slack.com/services/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"; + + /** userManageService */ + @Resource(name = "userManageService") + private EgovUserManageService userManageService; + + /** 사이트 설정 */ + @Resource(name = "egovSiteManagerService") + EgovSiteManagerService egovSiteManagerService; + + @Resource(name = "MjonEventService") + private MjonEventService mjonEventService; + + @Resource(name = "MsgHolidayService") + private MsgHolidayService msgHolidayService; + + @Value("#{globalSettings['Globals.slack.hooks.url']}") + private String SLACK_URL; + + /** xpedite 솔루션 ID*/ + @Value("#{globalSettings['Globals.slack.channel.name']}") + private String SLACK_CHANNEL; + + + + + + /** + * @methodName : getAdminSandSlack + * @author : 이호영 + * @date : 2024.12.04 + * @description : 기존 메소드 리펙토링 + * @param mjonMsgVO + */ + public void getAdminSandSlack(MjonMsgVO mjonMsgVO) { + + HttpClient client = new HttpClient(); + PostMethod post = new PostMethod(SLACK_URL); + + try { + // 메시지 내용 설정 + String smsTxt = formatSmsText(mjonMsgVO); + String sandName = formatSandName(mjonMsgVO); + + // Slack 메시지 생성 + JSONObject json = new JSONObject(); + json.put("channel", SLACK_CHANNEL); + json.put("text", smsTxt); + json.put("username", sandName); + + // Slack 요청 + post.addParameter("payload", json.toString()); + post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + + // Slack 응답 처리 + int responseCode = client.executeMethod(post); + if (responseCode != HttpStatus.SC_OK) { + log.warn("Slack 메시지 전송 실패. Response: {}", post.getResponseBodyAsString()); + } + + } catch (IllegalArgumentException e) { + log.error("Slack 메시지 전송 중 IllegalArgumentException 발생", e); + } catch (IOException e) { + log.error("Slack 메시지 전송 중 IOException 발생", e); + } catch (Exception e) { + log.error("Slack 메시지 전송 중 Exception 발생", e); + } finally { + post.releaseConnection(); + } + } /** * @throws Exception @@ -28,8 +116,7 @@ public class MjonCommon { * @작성자 : WYH * @Method 설명 : slack 메시지 전송 */ - @SuppressWarnings("unchecked") - public void getAdminSandSlack(MjonMsgVO mjonMsgVO) { + /*public void getAdminSandSlack(MjonMsgVO mjonMsgVO) { HttpClient client = new HttpClient(); PostMethod post = new PostMethod(url); @@ -43,6 +130,7 @@ public class MjonCommon { String reservSmsTxt = ""; String smisingSmsTxt = ""; //예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리 + if(reserveYn.equals("Y")) { if(smishingYn.equals("Y") || delayYn.equals("Y")) { @@ -52,6 +140,8 @@ public class MjonCommon { } smsTxt = reservSmsTxt; + System.out.println("smishingYn : "+ smishingYn); + System.out.println("delayYn : "+ delayYn); }else if(smishingYn.equals("Y") || delayYn.equals("Y")) { smisingSmsTxt = "[스미싱의심]" + smsTxt; @@ -75,7 +165,8 @@ public class MjonCommon { } } } - sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType; +// sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType; + sandName = "[개발테스트]"+"[" + userId + "]" + "[" + sandName + "]" + msgType; json.put("channel", "mjon메시지"); json.put("text", smsTxt); @@ -92,15 +183,18 @@ public class MjonCommon { } } catch (IllegalArgumentException e) { System.out.println("IllegalArgumentException posting to Slack " + e); - } catch (IOException e) { + } + catch (IOException e) { System.out.println("IOException posting to Slack " + e); - } catch (Exception e) { + } + catch (Exception e) { System.out.println("Exception posting to Slack " + e); + e.printStackTrace(); } finally { post.releaseConnection(); } - } + }*/ /** @@ -113,11 +207,11 @@ public class MjonCommon { public void sendSimpleSlackMsg(String msg) { HttpClient client = new HttpClient(); - PostMethod post = new PostMethod(url); + PostMethod post = new PostMethod(SLACK_URL); JSONObject json = new JSONObject(); try { - json.put("channel", "mjon메시지"); + json.put("channel", SLACK_CHANNEL); //json.put("channel", "C04DNV4FYP6"); //개발 서버용 json.put("text", msg); @@ -254,7 +348,7 @@ public class MjonCommon { public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) { HttpClient client = new HttpClient(); - PostMethod post = new PostMethod(url); + PostMethod post = new PostMethod(SLACK_URL); JSONObject json = new JSONObject(); try { @@ -289,7 +383,7 @@ public class MjonCommon { } sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType; - json.put("channel", "mjon메시지"); + json.put("channel", SLACK_CHANNEL); json.put("text", smsTxt); json.put("username", sandName); @@ -347,5 +441,179 @@ public class MjonCommon { return returnId; } + + + +private String formatSmsText(MjonMsgVO mjonMsgVO) { + String smsTxt = mjonMsgVO.getSmsTxt(); + String reserveYn = safeGetString(mjonMsgVO.getReserveYn()); + String delayYn = safeGetString(mjonMsgVO.getDelayYn()); + String smishingYn = safeGetString(mjonMsgVO.getSmishingYn()); + + // 예약 문자와 스미싱 의심 처리 + if ("Y".equals(reserveYn)) { + smsTxt = ("Y".equals(smishingYn) || "Y".equals(delayYn)) ? "[스미싱의심][예약]" + smsTxt : "[예약]" + smsTxt; + } else if ("Y".equals(smishingYn) || "Y".equals(delayYn)) { + smsTxt = "[스미싱의심]" + smsTxt; + } + + // 그림 문자 처리 + int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0); + if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isNullOrEmpty(smsTxt)) { + smsTxt = "그림문자 " + smsTxt; + } + + return smsTxt; +} + +private String formatSandName(MjonMsgVO mjonMsgVO) { + String userId = mjonMsgVO.getUserId(); + String callFrom = mjonMsgVO.getCallFrom(); + String msgType = getMessageTypeLabel(mjonMsgVO); + + return String.format("[%s][%s]%s", userId, callFrom, msgType); +} + +private String getMessageTypeLabel(MjonMsgVO mjonMsgVO) { + String msgType = mjonMsgVO.getMsgType(); + int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0); + + switch (msgType) { + case "4": + return "[단문]"; + case "6": + return fileCount == 0 ? "[장문]" : "[그림]"; + default: + return ""; + } +} + + +private int parseIntOrDefault(String value, int defaultValue) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } +} + + + + + + // 전체 로직 처리 (한 번에 모든 필요한 정보 반환) + public boolean processUserAndCheckSms(MjonMsgVO mjonMsgVO, String userId) throws Exception { + UserManageVO userManageVO = getUserManageInfo(userId); + + // 기본값 처리된 사용자 정보와 문자 상태 + String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn(); + String smishingYn = userManageVO.getSmishingYn(); + String spamStatus = safeGetString(mjonMsgVO.getSpamStatus()); + + // 조건 체크 + if ("Y".equals(adminSmsNoticeYn) || "Y".equals(spamStatus) || "Y".equals(smishingYn)) { + mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정 + + // 스미싱 알림 처리 + return handleSmishingAlert(mjonMsgVO); // 알림 처리 결과 반환 + } + + return false; // 알림 처리되지 않음 + } + + // 사용자 정보 조회 및 기본값 처리 + private UserManageVO getUserManageInfo(String userId) throws Exception { +// UserManageVO userManageVO = new UserManageVO(); +// userManageVO.setAdminSmsNoticeYn("Y"); // 기본값 +// userManageVO.setSmishingYn("N"); // 기본값 +// + return userManageService.selectAdminSmsNoticeYn(new UserManageVO(userId)); + } + + // 스미싱 알림 처리 + private boolean handleSmishingAlert(MjonMsgVO mjonMsgVO) throws Exception { + JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) || + !"Y".equals(joinSettingVO.getSlackNoti())) { + return false; // 알림 조건 미충족 + } + + // 알림 조건 충족 시 추가 작업 + List alarmList = getAlarmSettings(); + List holidayList = getHolidayList(); + boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus(alarmList, holidayList); + + // 알림 발송 + if (!isNotificationAllowed) { + getAdminSandSlack(mjonMsgVO); + return true; // 알림 발송 성공 + } + + return false; // 알림 발송 조건 미충족 + } + + // 안전하게 문자열 가져오기 + private String safeGetString(String value) { + return value == null ? "" : value; + } + + // 알림 설정 조회 + private List getAlarmSettings() throws Exception { + MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO(); + msgAlarmSetVO.setUseYn("Y"); + msgAlarmSetVO.setFirstIndex(0); + return msgHolidayService.selectAlarmSettingList(msgAlarmSetVO); + } + + // 공휴일 정보 조회 + private List getHolidayList() throws Exception { + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + + MsgHolidayVO msgHolidayVO = new MsgHolidayVO(); + msgHolidayVO.setFirstIndex(0); + msgHolidayVO.setRecordCountPerPage(100); + msgHolidayVO.setSearchHoliYear(Integer.toString(year)); + return msgHolidayService.selectMsgHolidayList(msgHolidayVO); + } + + // 이벤트 메시지 처리 + public StatusResponse processEventMessages(String userId, MjonMsgVO mjonMsgVO, + List mjonMsgSendVOList) throws Exception { + StatusResponse statusResponse = new StatusResponse(); + + try { + // 이벤트 정보 가져오기 + MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo_advc(userId); + if (eventMberInfo == null || "E".equals(eventMberInfo.getEventStatus())) { + return statusResponse; // 이벤트 상태가 종료인 경우 처리하지 않음 + } + + // 최적화된 메시지 리스트 및 이벤트 정보 가져오기 + OptimalMsgResultDTO result = MsgSendUtils.getOptimalMsgList(eventMberInfo, mjonMsgSendVOList); + List optimalMsgList = result.getOptimalMsgList(); + MjonEventVO returnEventMberInfo = result.getEventInfo(); + + // 이벤트 발송 내역이 있으면 + if (CollectionUtils.isNotEmpty(optimalMsgList)) { + mjonMsgVO.setEventYn("Y"); // 그룹에 이벤트 발송 여부 설정 + mjonMsgSendVOList.addAll(optimalMsgList); // 기존 리스트와 병합 + } + + // 이벤트 상태 종료 시 업데이트 + if (returnEventMberInfo != null && "E".equals(returnEventMberInfo.getEventStatus())) { + returnEventMberInfo.setMberId(userId); + mjonEventService.updateEventEndStatus(returnEventMberInfo); + } + + } catch (IllegalArgumentException e) { + + // 메시지 타입 에러 처리 + MsgSendUtils.statusResponseSet(statusResponse, org.springframework.http.HttpStatus.BAD_REQUEST, "이벤트 데이터 처리 중 오류가 발생하였습니다.\n관리자에게 문의해 주세요."); + + } + + return statusResponse; + } } diff --git a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java index 2196bebb..809414c0 100644 --- a/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java +++ b/src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java @@ -145,7 +145,7 @@ public class MjonMsgVO extends ComDefaultVO{ private String spamKeyword; //스팸 키워드 private String spamMsgGroupId; //스팸문자 문자전송 아이디 - private String spamStatus; //스팸문자 유무 (Y/N) + private String spamStatus="N"; //스팸문자 유무 (Y/N) private String vipYn; //VIP 유무 (Y/N) private String approvalPnttm; // 승인일자 private String atchFiles; // 그림문자 파일정보 diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index 5f9000aa..bc7b56b5 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -53,6 +53,7 @@ import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.msgdata.service.MjonMsgDataVO; import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; +import itn.let.mjo.msgholiday.service.MsgHolidayService; import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO; import itn.let.mjo.pay.service.MjonPayService; @@ -60,11 +61,13 @@ import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.impl.MjonPayDAO; import itn.let.mjo.spammsg.service.MjonSpamMsgService; import itn.let.module.base.PriceAndPoint; +import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; +import itn.let.uss.umt.service.UserManageVO; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -130,9 +133,20 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M @Resource(name = "mjonSpamMsgService") private MjonSpamMsgService mjonSpamMsgService; + /** 사이트 설정 */ + @Resource(name = "egovSiteManagerService") + EgovSiteManagerService egovSiteManagerService; + + + @Resource(name = "MsgHolidayService") + private MsgHolidayService msgHolidayService; + @Autowired private PriceAndPoint priceAndPoint; + + @Autowired + private MjonCommon mjonCommon; public List selectCcmCmmCodeList() throws Exception { @@ -3988,6 +4002,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M @Override public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception { + log.info("mjonMsgVO [{}]" , mjonMsgVO.getMjonMsgSendVOList().get(0).getPhone()); log.info(" :: sendMsgData_advc :: "); Map returnMap = new HashMap<>(); @@ -4004,7 +4019,6 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M //발신번호가 등록된 유효한 번호인지 확인 int sendCallFromCnt = mjonMsgDAO.selectCallFromNumberChk(mjonMsgVO); - System.out.println("sendCallFromCnt : "+ sendCallFromCnt); if(sendCallFromCnt < 1) { return new StatusResponse(HttpStatus.BAD_REQUEST, "등록된 발신번호를 찾을 수 없습니다."); } @@ -4056,6 +4070,10 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 수신거부 목록 returnMap.put("resultBlockSts", deletedCount); + if(mjonMsgSendVOList.size() < 1) { + return new StatusResponse(HttpStatus.BAD_REQUEST, "수신거부와 매칭되는 번호 제거 후 \n발송 가능한 수신목록이 존재하지 않습니다."); + } + @@ -4087,7 +4105,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M mjonMsgVO.setAgentCode(hotlineAgentCode); - // smstxt 치환 및 스팸체크 후 mjonMsgSendVOList 에 add() + // 스팸관련 키워드 select List resultSpamTxt = mjonMsgDataService.selectSpamKeywordList(); // msgGroupId 생성 String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId(); @@ -4141,38 +4159,12 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M * => optimalMsgList로 데이터 이동 * 이동하면서 이벤트 금액으로 설정 */ - MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo_advc(userId); - OptimalMsgResultDTO result = null; - List optimalMsgList = new ArrayList<>(); - - if (eventMberInfo != null && !"E".equals(eventMberInfo.getEventStatus())) { - try { - result = MsgSendUtils.getOptimalMsgList(eventMberInfo, mjonMsgSendVOList); - optimalMsgList = result.getOptimalMsgList(); - MjonEventVO returnEventMberInfo = result.getEventInfo(); + // mjonCommon 호출 + statusResponse = mjonCommon.processEventMessages(userId, mjonMsgVO, mjonMsgSendVOList); - // 이벤트 list에 내역에 있으면 - if(CollectionUtils.isNotEmpty(optimalMsgList)) - { - // group tb에 이벤트 발송인지 Y 입력해야함 - mjonMsgVO.setEventYn("Y"); - // 기존 리스트로 병합 - // 따로 분기 후 병합 하는 이유는 유지보수 및 기능 분리르 위함 - mjonMsgSendVOList.addAll(optimalMsgList); - } - - // 이벤트 금액이 끝났거나 종료상태로 전환되면 update해야함 - if (returnEventMberInfo != null && "E".equals(returnEventMberInfo.getEventStatus())) { - returnEventMberInfo.setMberId(userId); - mjonEventService.updateEventEndStatus(returnEventMberInfo); - } - - } catch (IllegalArgumentException e) { - // 메시지 타입 에러에 대한 응답 처리 - statusResponse.setStatus(HttpStatus.BAD_REQUEST); - statusResponse.setMessage("이벤트 데이터 처리 중 오류가 발생하였습니다.\n관리자에게 문의해 주세요."); - return statusResponse; - } + if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) { + log.error("이벤트 처리 중 오류 발생: {}", statusResponse.getMessage()); + return statusResponse; } @@ -4192,6 +4184,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // Batch 시작 시간 측정 long insetStartTime = System.currentTimeMillis(); // 총 발송 건수 = DB insert +// int instCnt = 0; int instCnt = this.insertMsgData_advc(mjonMsgSendVOList); // Batch 종료 시간 측정 및 실행 시간 계산 @@ -4217,12 +4210,25 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M , "SMS 문자 총 " + mjonMsgVO.getMjonMsgSendVOList().size() + "건 중 " + instCnt + "건 발송" , mjonMsgVO.getMsgGroupId() ); + + // 스팸 데이터가 있으면 MJ_SPAM_MSG_GROUP_DATA 테이블에 insert + handleSpamMsg_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); + } + - //TODO : group tb insert 후 처리 -// handleSpamMsg_advc(mjonMsgVO, mjonMsgSendVOList.get(0)); + + + // 한 줄 호출 + boolean isNotified = mjonCommon.processUserAndCheckSms(mjonMsgVO, userId); + + if (isNotified) { + System.out.println("스미싱 알림이 처리되었습니다."); + } else { + System.out.println("알림 조건을 충족하지 않았습니다."); + } @@ -4551,28 +4557,21 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M } } - private void handleSpamMsg_advc(MjonMsgVO mjonMsgVO, MjonMsgSendVO mjonMsgSendVO) { - try { + private void handleSpamMsg_advc(MjonMsgVO mjonMsgVO, MjonMsgSendVO mjonMsgSendVO) throws Exception{ if ("Y".equals(mjonMsgVO.getSpamStatus())) { MjonMsgVO mjonSpamMsgVO = mjonMsgVO; - mjonSpamMsgVO.setCallFrom(mjonMsgSendVO.getCallFrom()); - mjonSpamMsgVO.setMsgGroupCnt(mjonMsgSendVO.getMsgGroupId()); - mjonSpamMsgVO.setSubject(null); - mjonSpamMsgVO.setReqDate(null); - mjonSpamMsgVO.setMsgType(null); - mjonSpamMsgVO.setMsgType(null); - mjonSpamMsgVO.setEachPrice(null); - + mjonSpamMsgVO.setSubject(mjonSpamMsgVO.getMmsSubject()); + mjonSpamMsgVO.setEachPrice(mjonMsgSendVO.getEachPrice()); + mjonSpamMsgVO.setFilePath1(mjonMsgSendVO.getFilePath1()); + mjonSpamMsgVO.setFilePath2(mjonMsgSendVO.getFilePath2()); + mjonSpamMsgVO.setFilePath3(mjonMsgSendVO.getFilePath3()); int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO); System.out.println("스팸 문구 발송 내용 등록: " + resultCnt); } - } catch (Exception e) { - System.err.println("스팸 문구 처리 중 오류 발생: " + e.getMessage()); - } } // 예약 문자인 경우 처리하는 메서드 diff --git a/src/main/java/itn/let/uss/umt/service/UserManageVO.java b/src/main/java/itn/let/uss/umt/service/UserManageVO.java index 96e590c4..be544c1f 100644 --- a/src/main/java/itn/let/uss/umt/service/UserManageVO.java +++ b/src/main/java/itn/let/uss/umt/service/UserManageVO.java @@ -1,5 +1,10 @@ package itn.let.uss.umt.service; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + /** * 업무사용자VO클래스로서 업무사용자관리 비지니스로직 처리용 항목을 구성한다. * @author 공통서비스 개발팀 조재영 @@ -17,6 +22,10 @@ package itn.let.uss.umt.service; * * */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor public class UserManageVO extends UserDefaultVO{ /** @@ -209,538 +218,14 @@ public class UserManageVO extends UserDefaultVO{ private String nextPayMethod; private float paymentCash; //이전달에 실제 사용한 캐시 정보 - public String getNextPayMethod() { - return nextPayMethod; - } - public void setNextPayMethod(String nextPayMethod) { - this.nextPayMethod = nextPayMethod; - } - public String getSpamYn() { - return spamYn; - } - public void setSpamYn(String spamYn) { - this.spamYn = spamYn; - } - public String getAtSmishingYn() { - return atSmishingYn; - } - public void setAtSmishingYn(String atSmishingYn) { - this.atSmishingYn = atSmishingYn; - } - public String getBlineCode() { - return blineCode; - } - public void setBlineCode(String blineCode) { - this.blineCode = blineCode; - } - public String getRecommendId() { - return recommendId; - } - public void setRecommendId(String recommendId) { - this.recommendId = recommendId; - } - public float getCash() { - return cash; - } - public void setCash(float cash) { - this.cash = cash; - } - public String getMberNm() { - return mberNm; - } - public void setMberNm(String mberNm) { - this.mberNm = mberNm; - } - - public String getSmishingYn() { - return smishingYn; - } - public void setSmishingYn(String smishingYn) { - this.smishingYn = smishingYn; - } - - public float getNowChargeCash() { - return nowChargeCash; - } - public void setNowChargeCash(float nowChargeCash) { - this.nowChargeCash = nowChargeCash; - } - public String getPrePaymentYn() { - return prePaymentYn; - } - public void setPrePaymentYn(String prePaymentYn) { - this.prePaymentYn = prePaymentYn; - } - public int getAutoCash() { - return autoCash; - } - public void setAutoCash(int autoCash) { - this.autoCash = autoCash; - } - - public String getMberId() { - return mberId; - } - - public void setMberId(String mberId) { - this.mberId = mberId; - } - - public String getAdminSmsNoticeYn() { - return adminSmsNoticeYn; - } - - public void setAdminSmsNoticeYn(String adminSmsNoticeYn) { - this.adminSmsNoticeYn = adminSmsNoticeYn; - } - - public String getMobilePwsaveYn() { - return mobilePwsaveYn; - } - - public void setMobilePwsaveYn(String mobilePwsaveYn) { - this.mobilePwsaveYn = mobilePwsaveYn; - } - - public String getOldPassword() { - return oldPassword; - } - - public void setOldPassword(String oldPassword) { - this.oldPassword = oldPassword; - } - - public String getSbscrbDe() { - return sbscrbDe; - } - - public void setSbscrbDe(String sbscrbDe) { - this.sbscrbDe = sbscrbDe; - } - - public String getUniqId() { - return uniqId; - } - - public void setUniqId(String uniqId) { - this.uniqId = uniqId; - } - - public String getUserTy() { - return userTy; - } - - public void setUserTy(String userTy) { - this.userTy = userTy; - } - - public String getAreaNo() { - return areaNo; - } - - public void setAreaNo(String areaNo) { - this.areaNo = areaNo; - } - - public String getBrth() { - return brth; - } - - public void setBrth(String brth) { - this.brth = brth; - } - - public String getDetailAdres() { - return detailAdres; - } - - public void setDetailAdres(String detailAdres) { - this.detailAdres = detailAdres; - } - - public String getEmailAdres() { - return emailAdres; - } - - public void setEmailAdres(String emailAdres) { - this.emailAdres = emailAdres; - } - - public String getEmplNo() { - return emplNo; - } - - public void setEmplNo(String emplNo) { - this.emplNo = emplNo; - } - - public String getEmplyrId() { - return emplyrId; - } - - public void setEmplyrId(String emplyrId) { - this.emplyrId = emplyrId; - } - - public String getEmplyrIdDec() { - return emplyrIdDec; - } - - public void setEmplyrIdDec(String emplyrIdDec) { - this.emplyrIdDec = emplyrIdDec; - } - - public String getEmplyrNm() { - return emplyrNm; - } - - public void setEmplyrNm(String emplyrNm) { - this.emplyrNm = emplyrNm; - } - - public String getEmplyrSttusCode() { - return emplyrSttusCode; - } - - public void setEmplyrSttusCode(String emplyrSttusCode) { - this.emplyrSttusCode = emplyrSttusCode; - } - - public String getEmplyrSttusCodeTxt() { - return emplyrSttusCodeTxt; - } - - public void setEmplyrSttusCodeTxt(String emplyrSttusCodeTxt) { - this.emplyrSttusCodeTxt = emplyrSttusCodeTxt; - } - - public String getFxnum() { - return fxnum; - } - - public void setFxnum(String fxnum) { - this.fxnum = fxnum; - } - - public String getGroupId() { - return groupId; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public String getHomeadres() { - return homeadres; - } - - public void setHomeadres(String homeadres) { - this.homeadres = homeadres; - } - - public String getHomeendTelno() { - return homeendTelno; - } - - public void setHomeendTelno(String homeendTelno) { - this.homeendTelno = homeendTelno; - } - - public String getHomemiddleTelno() { - return homemiddleTelno; - } - - public void setHomemiddleTelno(String homemiddleTelno) { - this.homemiddleTelno = homemiddleTelno; - } - - public String getIhidnum() { - return ihidnum; - } - - public void setIhidnum(String ihidnum) { - this.ihidnum = ihidnum; - } - - public String getInsttCode() { - return insttCode; - } - - public void setInsttCode(String insttCode) { - this.insttCode = insttCode; - } - - public String getMberTy() { - return mberTy; - } - - public void setMberTy(String mberTy) { - this.mberTy = mberTy; - } - - public String getMoblphonNo() { - return moblphonNo; - } - - public void setMoblphonNo(String moblphonNo) { - this.moblphonNo = moblphonNo; - } - - public String getOfcpsNm() { - return ofcpsNm; - } - - public void setOfcpsNm(String ofcpsNm) { - this.ofcpsNm = ofcpsNm; - } - public String getOffmTelno() { - return offmTelno; - } - - public void setOffmTelno(String offmTelno) { - this.offmTelno = offmTelno; - } - - public String getOrgnztId() { - return orgnztId; - } - - public void setOrgnztId(String orgnztId) { - this.orgnztId = orgnztId; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPasswordCnsr() { - return passwordCnsr; - } - - public void setPasswordCnsr(String passwordCnsr) { - this.passwordCnsr = passwordCnsr; - } - - public String getPasswordHint() { - return passwordHint; - } - - public void setPasswordHint(String passwordHint) { - this.passwordHint = passwordHint; - } - - public String getSbscrbDeBegin() { - return sbscrbDeBegin; - } - - public void setSbscrbDeBegin(String sbscrbDeBegin) { - this.sbscrbDeBegin = sbscrbDeBegin; - } - - public String getSbscrbDeEnd() { - return sbscrbDeEnd; - } - - public void setSbscrbDeEnd(String sbscrbDeEnd) { - this.sbscrbDeEnd = sbscrbDeEnd; - } - - public String getSexdstnCode() { - return sexdstnCode; - } - - public void setSexdstnCode(String sexdstnCode) { - this.sexdstnCode = sexdstnCode; - } - - public String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - public String getSubDn() { - return subDn; - } - - public void setSubDn(String subDn) { - this.subDn = subDn; - } - - public String getPartIdx() { - return partIdx; - } - - public void setPartIdx(String partIdx) { - this.partIdx = partIdx; - } - - public String getPartIdxTxt() { - return partIdxTxt; - } - - public void setPartIdxTxt(String partIdxTxt) { - this.partIdxTxt = partIdxTxt; - } - - public String getAuthorCode() { - return authorCode; - } - - public void setAuthorCode(String authorCode) { - this.authorCode = authorCode; - } - - public String getAuthorNm() { - return authorNm; - } - - public void setAuthorNm(String authorNm) { - this.authorNm = authorNm; - } - - public String getRsaPasswd() { - return rsaPasswd; - } - - public void setRsaPasswd(String rsaPasswd) { - this.rsaPasswd = rsaPasswd; - } - - public String getEsntlId() { - return esntlId; - } - - public void setEsntlId(String esntlId) { - this.esntlId = esntlId; - } - - public String getSearchWord() { - return searchWord; - } - - public void setSearchWord(String searchWord) { - this.searchWord = searchWord; - } - - public String getUserNm() { - return userNm; - } - - public void setUserNm(String userNm) { - this.userNm = userNm; - } - - public String getUserWork() { - return userWork; - } - - public void setUserWork(String userWork) { - this.userWork = userWork; - } - - public String getLocInfoId() { - return locInfoId; - } - - public void setLocInfoId(String locInfoId) { - this.locInfoId = locInfoId; - } - - public String getSort() { - return sort; - } - - public void setSort(String sort) { - this.sort = sort; - } - - public String getCheckNo() { - return checkNo; - } - - public void setCheckNo(String checkNo) { - this.checkNo = checkNo; - } - - public String getFindType() { - return findType; - } - - public void setFindType(String findType) { - this.findType = findType; - } - - public String getEmailSendYN() { - return emailSendYN; - } - - public void setEmailSendYN(String emailSendYN) { - this.emailSendYN = emailSendYN; - } - - public String getMbtlSendYN() { - return mbtlSendYN; - } - - public void setMbtlSendYN(String mbtlSendYN) { - this.mbtlSendYN = mbtlSendYN; - } - - public String getPasswordOverlapCheck() { - return passwordOverlapCheck; - } - - public void setPasswordOverlapCheck(String passwordOverlapCheck) { - this.passwordOverlapCheck = passwordOverlapCheck; - } - - public String getUserSe() { - return userSe; - } - - public void setUserSe(String userSe) { - this.userSe = userSe; - } - - public String getCrtfcDnValue() { - return crtfcDnValue; - } - - public void setCrtfcDnValue(String crtfcDnValue) { - this.crtfcDnValue = crtfcDnValue; - } - - public String getOuterCertYn() { - return outerCertYn; - } - - public void setOuterCertYn(String outerCertYn) { - this.outerCertYn = outerCertYn; - } - public String getVipYn() { - return vipYn; - } - public void setVipYn(String vipYn) { - this.vipYn = vipYn; - } - public float getPaymentCash() { - return paymentCash; - } - public void setPaymentCash(float paymentCash) { - this.paymentCash = paymentCash; + public UserManageVO(String userId) { + this.mberId = userId; + // TODO Auto-generated constructor stub } - } \ No newline at end of file diff --git a/src/main/resources/egovframework/egovProps/globals_dev.properties b/src/main/resources/egovframework/egovProps/globals_dev.properties index 1ee51c85..961086a7 100644 --- a/src/main/resources/egovframework/egovProps/globals_dev.properties +++ b/src/main/resources/egovframework/egovProps/globals_dev.properties @@ -115,3 +115,7 @@ Globals.pay.kgm.bank.payMode=00 #MOBILE Globals.pay.kgm.mobile.mcSvcid=170622040674 Globals.pay.kgm.mobile.payMode=00 + +#Slack +Globals.slack.hooks.url=https://hooks.slack.com/services/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 +Globals.slack.channel.name=\ud14c\uc2a4\ud2b8_mjon\uba54\uc2dc\uc9c0 diff --git a/src/main/resources/egovframework/egovProps/globals_local.properties b/src/main/resources/egovframework/egovProps/globals_local.properties index 4812a29c..67e26b5c 100644 --- a/src/main/resources/egovframework/egovProps/globals_local.properties +++ b/src/main/resources/egovframework/egovProps/globals_local.properties @@ -116,3 +116,12 @@ Globals.pay.kgm.bank.payMode=00 #MOBILE Globals.pay.kgm.mobile.mcSvcid=170622040674 Globals.pay.kgm.mobile.payMode=00 + +#Slack +Globals.slack.hooks.url=https://hooks.slack.com/services/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 +Globals.slack.channel.name=\ud14c\uc2a4\ud2b8_mjon\uba54\uc2dc\uc9c0 + + + + + diff --git a/src/main/resources/egovframework/egovProps/globals_prod.properties b/src/main/resources/egovframework/egovProps/globals_prod.properties index f32e62f1..6a7fbd2a 100644 --- a/src/main/resources/egovframework/egovProps/globals_prod.properties +++ b/src/main/resources/egovframework/egovProps/globals_prod.properties @@ -102,4 +102,8 @@ Globals.pay.kgm.bank.raSvcid=230510133362 Globals.pay.kgm.bank.payMode=10 #MOBILE Globals.pay.kgm.mobile.mcSvcid=220613125202 -Globals.pay.kgm.mobile.payMode=10 \ No newline at end of file +Globals.pay.kgm.mobile.payMode=10 + +#Slack +Globals.slack.hooks.url=https://hooks.slack.com/services/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 +Globals.slack.channel.name=mjon\uba54\uc2dc\uc9c0 \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp index 9e940098..79175789 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp @@ -1016,7 +1016,7 @@ $(document).ready(function (){ const numbers = textarea.val().split('\n') .map(num => num.trim()) .filter(num => num !== ""); - + console.log('입력된 번호들 : ', numbers); // 현재 테이블에 있는 데이터 가져오기 @@ -1028,13 +1028,19 @@ $(document).ready(function (){ // 각 번호를 테이블에 추가 (중복 검사 및 포맷팅 포함) numbers.forEach(number => { +// const formattedNumber = formatPhoneNumber(number); // 번호 표준화 + const formattedNumber = formatPhoneNumber(number); // 번호 표준화 + console.log('formattedNumber : ', formattedNumber); // console.log('number : ', number) // console.log('formattedNumber : ', formattedNumber) const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김 + console.log('cleanedNumber : ', cleanedNumber); + console.log('cleanedNumber : ', cleanedNumber); if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크 if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사 - tableL.addRow({ phone: formattedNumber }); // 표준화된 번호로 추가 +// tableL.addRow({ phone: formattedNumber }); // 표준화된 번호로 추가 + tableL.addRow({ phone: cleanedNumber }); // 하이픈 제거된 번호로 추가 existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가 } else { // alert(`유효하지 않은 번호 형식: ${number}`); diff --git a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp index af1803ed..f8f43c56 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp @@ -1081,6 +1081,7 @@ function fn_sendMsgData(){ } } + if(!confirm("문자를 전송하시겠습니까?")){ return false; @@ -1236,6 +1237,23 @@ function fn_sendMsgData(){ } +// 선택된 데이터의 길이에 따라 예상 시간 계산 함수 +function calculateEstimatedTime(selectedCount) { + //기준값 + // const processTimePerBatch = 130; // 130초 + + + const processTimePerBatch = 260; // 260초 + const batchSize = 300000; // 30만 건 + + // 1건당 처리 시간 + const timePerRecord = processTimePerBatch / batchSize; + + // 예상 시간 계산 + const estimatedTimeInSeconds = selectedCount * timePerRecord; + + return estimatedTimeInSeconds.toFixed(2); +} @@ -1268,6 +1286,12 @@ function sendMsgAjax_advc(){ // 시작 시간 const startTime = new Date(); + + // 프로그래스파 시간을 위한 계산 + var estimtedTime = calculateEstimatedTime($selectedData.length); + console.log('estimtedTime : ', estimtedTime); + + $.ajax({ type: "POST", url: url, @@ -1275,6 +1299,7 @@ function sendMsgAjax_advc(){ contentType: 'application/json', dataType: 'json', success: function (data) { + // 요청 종료 시간 및 경과 시간 계산 const endTime = new Date(); const elapsed = (endTime - startTime) / 1000; // 밀리초 -> 초로 변환 @@ -1345,12 +1370,19 @@ function sendMsgAjax_advc(){ }, beforeSend : function(xmlHttpRequest) { + // 프로그래스 바 실행 + // 프로그래스 바 실행 + progressStart(estimtedTime); //로딩창 show - $('.loading_layer').addClass('active'); +// $('.loading_layer').addClass('active'); }, complete : function(xhr, textStatus) { - //로딩창 hide - $('.loading_layer').removeClass('active'); + + // 프로그래스 바 종료 + // 프로그래스 바 종료 + progressComplete();; +// 로딩창 hide +// $('.loading_layer').removeClass('active'); }, error: function (e) { alert("문자 발송에 실패하였습니다."); console.log("ERROR : ", e); } }); @@ -1359,6 +1391,14 @@ function sendMsgAjax_advc(){ //폼 유효성 검사 함수 function validateForm(form) { + + // 타블레이터 호출 + var $selectedData = tableL.getData(); // 데이터 가져오기 + if($selectedData.length < 1){ + alert("받는사람 내역을 입력해주세요."); + return false; + } + if(form.callFromList.value == ""){ @@ -1390,7 +1430,7 @@ function validateForm(form) { } if (imgFilePath.length === 0 && !form.smsTxtArea.value) { - alert("문자 내용을 입력해 주세요."); + alert("문자내용을 입력해 주세요."); return false; } return true; diff --git a/src/main/webapp/publish/js/content.js b/src/main/webapp/publish/js/content.js index 15344c8d..53732136 100644 --- a/src/main/webapp/publish/js/content.js +++ b/src/main/webapp/publish/js/content.js @@ -1587,7 +1587,7 @@ function fn_excelLoadRemoveActive(){ // 프로그레스바 var start, change; -let progressInterval = null; // 전역 변수로 타이머 ID 관리 +var progressInterval = null; // 전역 변수로 타이머 ID 관리 function progressStart(time) { // 기존 타이머 정지 및 초기화 @@ -1644,52 +1644,12 @@ function resetProgressBar() { - -/* -function progressStart(time) { - - // 초기셋팅 - $(".time_text").text("0%"); - $(".change_bar").css("width", "0"); - $(".time_text").removeClass("animation"); - - $(".progress_bar_wrap").css("display", "flex"); - - var timeText = document.querySelector(".time_text"); - var bar = document.querySelector(".change_bar"); - - var width = 1; - var totalTime = time * 1000; // 시간 - var cmpWid = totalTime / 100; // width 증가하는 시간 - - start = setInterval(changeWidth, cmpWid); // 프로그레스바 시작 - - function changeWidth() { - if (width >= 100) { - // width 100% 됐을 때 - clearInterval(start); // 프로그래스바 멈춤 - - timeText.innerHTML = "100%"; - setTimeout(function () { - // 100%되고 1초 후 잠시만 기다려주세요 변경 및 애니메이션 추가 - timeText.innerHTML = "잠시만 기다려주세요..."; - $(".time_text").addClass("animation"); - }, 1000) - - - } else { - // width 증가 및 text 변경 - width++; - bar.style.width = width + "%"; - timeText.innerHTML = width + "%"; - } - } -}*/ - // 프로그레스바 완료 function progressComplete() { // var width = parseInt($(".time_text").text().replace('%', '')) || 0; // 현재 width 가져오기 + $(".progress_bar_wrap").hide(); + /* var widthText = $(".change_bar").attr("style"); var width = widthText.replace(/[width:%;overfloen]/ig, ""); // width 값 퍼센트로 가져오기 var currentText = $(".time_text").text().trim(); // 현재 텍스트 가져오기 @@ -1725,7 +1685,7 @@ function progressComplete() { $(".time_text").text(width + "%"); $(".change_bar").css("width", width + "%"); } - }, 10); // DOM 업데이트 간격 (10ms) + }, 10); // DOM 업데이트 간격 (10ms)*/ } /*// 프로그레스바 완료