From 220b9852bd0200e896064206681666220620c0cc Mon Sep 17 00:00:00 2001 From: rosewiper Date: Thu, 29 Aug 2024 14:01:52 +0900 Subject: [PATCH 01/14] =?UTF-8?q?=EC=95=8C=EB=A6=BC=ED=86=A1=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=201=EC=B0=A8=20=EC=9E=91=EC=97=85=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/KakaoAlimTalkSendController.java | 242 ++++++++++++++++++ .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 2 + src/main/webapp/js/kakao/at/alimtalkExcel.js | 118 +++++++++ 3 files changed, 362 insertions(+) diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index ca1678bf..998feea0 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -18,12 +18,22 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFDataFormat; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; @@ -31,15 +41,20 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import itn.com.cmm.EgovMessageSource; +import itn.com.cmm.JsonResult; import itn.com.cmm.LoginVO; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.util.MJUtil; +import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; import itn.let.kakao.kakaoComm.KakaoReturnVO; import itn.let.kakao.kakaoComm.KakaoSendUtil; @@ -200,6 +215,233 @@ public class KakaoAlimTalkSendController { return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView"; } + + + /* + * 엑셀 파일 처리 + * + * */ + @RequestMapping(value = "/web/mjon/alimtalk/sendAlimtalkExelFilePhoneNumAjax.do") + @ResponseBody + public Object sendAlimtalkExelFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception { + + JsonResult jr = new JsonResult(); + jr.setSuccess(false); + jr.setMessage("엑셀 파일만 업로드할 수 있습니다."); + + try { + + //final Map files = multiRequest.getFileMap(); + List files = (List) multiRequest.getFiles("file0"); + + // 파일명에 .이 있을경우 오류 => Ex) 테스트6.20.xlsx + int fileNameSplitCnt = 0; + + if(!files.isEmpty()) { + fileNameSplitCnt = files.get(0).getOriginalFilename().split("[.]").length; + + if (files.get(0).getSize() > 0 + && (files.get(0).getContentType().indexOf("spreadsheetml") > -1) + || files.get(0).getContentType().indexOf("ms-excel") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xlsx") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xls") > -1) { + + // 엑셀 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생 + long fileSize = multiRequest.getFile("file0").getSize(); + + String Ext = files.get(0).getOriginalFilename().split("[.]")[1]; + String errMessage = ""; + String cellValue = ""; + String errPhoneLine = ""; + int errPhoneCnt = 0; + + //String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$"; + String phoneRegExp = "^(050[2345678]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; + + if(Ext.equals("xls")) { + + HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream()); + HSSFSheet sheet = workbook.getSheetAt(0); + + /*if(sheet.getLastRowNum() > 500) { // + errMessage = "500건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; + jr.setSuccess(false); + jr.setMessage(errMessage); + return jr; + }*/ + + for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) + HSSFRow row = sheet.getRow(i); //열읽기 + if(null == row) { + continue; + } + + HashMap jm = new HashMap<>(); + // 행의 두번째 열(이름부터 받아오기) + HSSFCell cell = null; + boolean errSts = true; + for(int j = 0 ; j < 1; j++){ //행읽기(첫번째 컬럼만 필요) + + cellValue = ""; + cell = row.getCell(j); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 + if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 + if(j == 1) { + if (sheet.getLastRowNum() == i) { + continue; + } + + break; + } + + } + if(null != cell){ + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + + System.out.println("cellValue ::: "+cellValue); + } + + } + } + + }else {//xlsx 확장자 처리 + + OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream()); + XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); + XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기 + opcPackage.close(); + + int totRowDataCnt = 0; + for(int r=1; r 20000) { // + /*if(totRowDataCnt > 500) { // + errMessage = "500건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; + jr.setSuccess(false); + jr.setMessage(errMessage); + return jr; + }*/ + + List> json = new ArrayList>(); + + for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) + XSSFRow row = sheet.getRow(i); //열읽기 + if(null == row) { + continue; + } + + HashMap jm = new HashMap<>(); + // 행의 두번째 열(이름부터 받아오기) + XSSFCell cell = null; + boolean errSts = true; + + for(int j = 0 ; j < 1; j++){ //행읽기(첫번째 컬럼만 필요) + + cellValue = ""; + cell = row.getCell(j); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 + if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 + //System.out.println("Cell 데이터가 없습니다."); + if(j == 1) { + if (sheet.getLastRowNum() == i) { + continue; + } + + break; + + } + } + if(null != cell){ + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + } + + if(j == 0) { + + System.out.println("cellValue ::: "+cellValue); + + if(cellValue.matches(phoneRegExp) && errSts) { + jm.put("phone", cellValue); + }else { + errPhoneCnt++; + errPhoneLine += (i+1) + "행 "; + errSts = false; + break; + } + + } + + } + + if(null != jm.get("phone") && errSts) { + json.add(jm); + } + + } + + int resultErrCnt = errPhoneCnt; + + jr.setData(json); + jr.setSuccess(true); + + if(resultErrCnt > 0) { + if (errPhoneCnt <= 10) { + if (StringUtils.isNotEmpty(errPhoneLine.trim())) { + errPhoneLine = "[" + errPhoneLine.trim() + "]"; + } + } + else { + errPhoneLine = ""; + } + + jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건" + errPhoneLine.trim() + " 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); + }else { + jr.setMessage(""); + } + + + } + + + } + } + + //jr.setMessage("엑셀 불러오기가 완료 되었습니다."); + //jr.setSuccess(true); + + } catch (Exception e) { + // TODO: handle exception + System.out.println("+++++++++++++++++ sendAlimtalkExelFilePhoneNumAjax Controller Error !!! "+e); + jr.setSuccess(false); + jr.setMessage("엑셀 데이터에 오류가 있습니다. 엑셀 데이터를 확인해 주세요."); + return jr; + } + + return jr; + } // 카카오 템플릿 목록 조회 diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp index 61dccc54..b97d1372 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp @@ -1736,6 +1736,7 @@ function checkNumber(event) { +

* 첨부된 파일은 [추가]버튼을 클릭하셔야 받는 사람에 등록됩니다.

@@ -1743,6 +1744,7 @@ function checkNumber(event) { diff --git a/src/main/webapp/js/kakao/at/alimtalkExcel.js b/src/main/webapp/js/kakao/at/alimtalkExcel.js index 23cd2d77..34794030 100644 --- a/src/main/webapp/js/kakao/at/alimtalkExcel.js +++ b/src/main/webapp/js/kakao/at/alimtalkExcel.js @@ -48,6 +48,124 @@ function excelAdd(){ } } +/* + * 신규 엑셀 파일 불러오기 + * 기존 json 처리가 아닌 POI 방식으로 처리하기 위함 + * + * */ + +function excelExport00(){ + + var data = new FormData(document.excelToolTipForm); + //data.append("file0", $('#excelFile01').prop('files')[0]); + + var fileValue = $("#excelFile01").val().split("\\"); + var fileName = fileValue[fileValue.length-1]; + + var fileExt = fileName.split('.').pop().toLowerCase(); + + console.log("fileName ::: "+fileName); + console.log("fileExt ::: "+fileExt); + + if(fileExt.length > 0){ + if($.inArray(fileExt, ['xls','xlsx']) == -1) { + + alert('xls, xlsx 파일만 업로드 할수 있습니다.'); + return false; + + } + + } + fn_viewDataInit02(); + $('#excelNm01').val(fileName); + +} + +function excelAdd1(){ + + var data = new FormData(document.excelToolTipForm); + data.append("file0", $('#excelFile01').prop('files')[0]); + + var url = "/web/mjon/alimtalk/sendAlimtalkExelFilePhoneNumAjax.do"; + + $.ajax({ + type: "POST", + enctype: 'multipart/form-data', + url: url, + data: data, + dataType:'json', + async: true, + processData: false, + contentType: false, + cache: false, + //timeout: 600000, + success: function (returnData, status) { + if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 + + if(returnData.success){ + + var data = returnData.data; + var message = returnData.message; + + if(message != '' ){ + alert(returnData.message); + } + + if(data != null){ + + /*$.each(data, function(i, item){ + + if(checkHpNum(item.phone)){ + + excelAddr.push({phone: item.phone, name: item.name, rep1: item.replace1, rep2: item.replace2, rep3: item.replace3, rep4: item.replace4}); + + } else{ + + alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다."); + excelAddr = []; //엑셀 데이터 저장 변수 초기화 + $("#excelFile").val(""); //첨부파일 input 초기화 + $("#excelNm").val(""); // 첨부파일 명 초기화 + fileName = ""; + return; + + } + + });*/ + + } + + }else{ + alert(returnData.message); +// alert("첨부파일 불러오는 중 오류가 발생하였습니다."); + excelAddr = []; //엑셀 데이터 저장 변수 초기화 + $("#excelFile01").val(""); //첨부파일 input 초기화 + $("#excelNm01").val(""); // 첨부파일 명 초기화 + fileName = ""; + return; + + } + } else if(status== 'fail'){ + alert("첨부파일 불러오는 중 오류가 발생하였습니다.1"); + console.log("status : fail ~"); + } + }, + error: function (e) { + alert("첨부파일 불러오는 중 오류가 발생하였습니다2."); + console.log("ERROR : ", e); + }, + beforeSend : function(xmlHttpRequest) { + //로딩창 show + $('.loading_layer').addClass('active'); + }, + complete : function(xhr, textStatus) { + //로딩창 hide + $('.loading_layer').removeClass('active'); + } + }); + +} + + /** * 엑셀 파일 불러오기 */ From 1aebdb9a080dfb490814649d36b8a2397cdf6520 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Thu, 29 Aug 2024 15:51:19 +0900 Subject: [PATCH 02/14] =?UTF-8?q?=EC=95=8C=EB=A6=BC=ED=86=A1=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EC=97=91=EC=85=80=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20POI=20=EB=B0=A9=EC=8B=9D=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/KakaoAlimTalkSendController.java | 50 ++++++++++++++----- .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 7 ++- src/main/webapp/js/kakao/at/alimtalkExcel.js | 46 +++++++++++++---- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index 998feea0..112758f1 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -218,7 +218,9 @@ public class KakaoAlimTalkSendController { /* - * 엑셀 파일 처리 + * 20240829 신규 추가 우영두 + * 기존 Script에서 처리하던 방식 변경 + * 카카오 알림톡 엑셀 불러오기 엑셀 처리 * * */ @RequestMapping(value = "/web/mjon/alimtalk/sendAlimtalkExelFilePhoneNumAjax.do") @@ -255,7 +257,7 @@ public class KakaoAlimTalkSendController { String errPhoneLine = ""; int errPhoneCnt = 0; - //String phoneRegExp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$"; + //수신번호 유효성 체크 String phoneRegExp = "^(050[2345678]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; if(Ext.equals("xls")) { @@ -270,6 +272,7 @@ public class KakaoAlimTalkSendController { return jr; }*/ + List> json = new ArrayList>(); for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) HSSFRow row = sheet.getRow(i); //열읽기 if(null == row) { @@ -301,12 +304,43 @@ public class KakaoAlimTalkSendController { } cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; - System.out.println("cellValue ::: "+cellValue); + if(cellValue.matches(phoneRegExp) && errSts) { + jm.put("phone", cellValue); + }else { + errPhoneCnt++; + errPhoneLine += (i+1) + "행 "; + errSts = false; + break; + } } + } + + if(null != jm.get("phone") && errSts) { + json.add(jm); } } + int resultErrCnt = errPhoneCnt; + + jr.setData(json); + jr.setSuccess(true); + + if(resultErrCnt > 0) { + if (errPhoneCnt <= 10) { + if (StringUtils.isNotEmpty(errPhoneLine.trim())) { + errPhoneLine = "[" + errPhoneLine.trim() + "]"; + } + } + else { + errPhoneLine = ""; + } + + jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건" + errPhoneLine.trim() + " 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); + }else { + jr.setMessage(""); + } + }else {//xlsx 확장자 처리 OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream()); @@ -333,9 +367,6 @@ public class KakaoAlimTalkSendController { } - System.out.println("+++++++++++++++++ totRowDataCnt ::: "+totRowDataCnt); - - //if(sheet.getLastRowNum() > 20000) { // /*if(totRowDataCnt > 500) { // errMessage = "500건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; jr.setSuccess(false); @@ -381,8 +412,6 @@ public class KakaoAlimTalkSendController { if(j == 0) { - System.out.println("cellValue ::: "+cellValue); - if(cellValue.matches(phoneRegExp) && errSts) { jm.put("phone", cellValue); }else { @@ -422,16 +451,11 @@ public class KakaoAlimTalkSendController { jr.setMessage(""); } - } - } } - //jr.setMessage("엑셀 불러오기가 완료 되었습니다."); - //jr.setSuccess(true); - } catch (Exception e) { // TODO: handle exception System.out.println("+++++++++++++++++ sendAlimtalkExelFilePhoneNumAjax Controller Error !!! "+e); diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp index b97d1372..10250746 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp @@ -284,11 +284,14 @@ function fn_viewDataInit01(){ /** * 먼저 불러온 DATA가 있으면 삭제 * !! 화면에 보이는 data만 삭제 !! + * 총건수, 중복건수 데이터 0으로 초기화 * 엑셀 불러오기 데이터 */ function fn_viewDataInit02(){ $('.excelBody').remove(); $('#excelHead').empty(); + $('#rowTotCnt').text("0"); + $('#rowDupCnt').text("0"); } /* @@ -1735,7 +1738,7 @@ function checkNumber(event) {
- + @@ -1743,7 +1746,7 @@ function checkNumber(event) {
diff --git a/src/main/webapp/js/kakao/at/alimtalkExcel.js b/src/main/webapp/js/kakao/at/alimtalkExcel.js index 34794030..af8ad88f 100644 --- a/src/main/webapp/js/kakao/at/alimtalkExcel.js +++ b/src/main/webapp/js/kakao/at/alimtalkExcel.js @@ -53,20 +53,15 @@ function excelAdd(){ * 기존 json 처리가 아닌 POI 방식으로 처리하기 위함 * * */ - -function excelExport00(){ +function excelExportAjax(){ var data = new FormData(document.excelToolTipForm); - //data.append("file0", $('#excelFile01').prop('files')[0]); var fileValue = $("#excelFile01").val().split("\\"); var fileName = fileValue[fileValue.length-1]; var fileExt = fileName.split('.').pop().toLowerCase(); - console.log("fileName ::: "+fileName); - console.log("fileExt ::: "+fileExt); - if(fileExt.length > 0){ if($.inArray(fileExt, ['xls','xlsx']) == -1) { @@ -81,7 +76,7 @@ function excelExport00(){ } -function excelAdd1(){ +function excelAddAjax(){ var data = new FormData(document.excelToolTipForm); data.append("file0", $('#excelFile01').prop('files')[0]); @@ -113,11 +108,37 @@ function excelAdd1(){ if(data != null){ - /*$.each(data, function(i, item){ + //수신목록 Html 태그 + var addHtml = '
' + +'\t
' + +'\t\t' + +'\t\t' + +'\t
' + +'\t
' + +'\t\t

$PHONE$

' + +'\t
' + /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ + /*+'\t
' + +'\t\t

$NAME$

' + +'\t
'*/ + +'
'; + + var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보 + var $excelBody = $('#wrap01_body'); + var phoneNum; + + $.each(data, function(i, item){ if(checkHpNum(item.phone)){ - excelAddr.push({phone: item.phone, name: item.name, rep1: item.replace1, rep2: item.replace2, rep3: item.replace3, rep4: item.replace4}); + phoneNum = removeDash(item.phone); + + if(!phoneDupl(phoneNum)) + /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ +// $excelBody.append(addHtml.replace('$PHONE$', phoneNum).replace('$NAME$', jsonData[bodyIndex]['이름'] ??= '')); + $excelBody.append(addHtml.replace('$PHONE$', phoneNum)); + else + totalDuplCnt++; } else{ @@ -130,7 +151,12 @@ function excelAdd1(){ } - });*/ + }); + + $('#rowDupCnt').text(totalDuplCnt); + $("#excelFile01").val(""); //첨부파일 input 초기화 + $("#excelNm01").val(""); // 첨부파일 명 초기화 + updateTotCnt(); } From 20dad44b26d595beff75797f9203d553fce26468 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Thu, 29 Aug 2024 16:39:36 +0900 Subject: [PATCH 03/14] =?UTF-8?q?=EC=97=91=EC=85=80=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20=EC=B5=9C=EB=8C=80=20=EA=B1=B4=EC=88=98=20?= =?UTF-8?q?500=EA=B1=B4=EA=B9=8C=EC=A7=80=20=EB=93=B1=EB=A1=9D=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakaoAt/web/KakaoAlimTalkSendController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index 112758f1..242a7511 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -265,12 +265,12 @@ public class KakaoAlimTalkSendController { HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream()); HSSFSheet sheet = workbook.getSheetAt(0); - /*if(sheet.getLastRowNum() > 500) { // - errMessage = "500건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; + if(sheet.getLastRowNum() > 501) { + errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다."; jr.setSuccess(false); jr.setMessage(errMessage); return jr; - }*/ + } List> json = new ArrayList>(); for(int i=2; i< sheet.getLastRowNum() + 2; i++){ //먼저 밸리데이션 체크(1줄은 생략) @@ -354,9 +354,9 @@ public class KakaoAlimTalkSendController { XSSFRow tmpRow = sheet.getRow(r); //System.out.println("=================r:"+r); XSSFCell cell = null; - if(tmpRow.getCell(1) != null) { + if(tmpRow.getCell(0) != null) { - cell = tmpRow.getCell(1); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 + cell = tmpRow.getCell(0); //이름/핸드폰/변환1/변환2/변환3/변환4/변환5 if(cell != null && !cell.toString().trim().equals("")) { //System.out.println("value-" + r + ":" +cell.getStringCellValue()); totRowDataCnt++; @@ -367,12 +367,12 @@ public class KakaoAlimTalkSendController { } - /*if(totRowDataCnt > 500) { // - errMessage = "500건 이상의 업로드는 데이터 부하로 업로드 할수 없습니다."; + if(totRowDataCnt > 501) { // + errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다."; jr.setSuccess(false); jr.setMessage(errMessage); return jr; - }*/ + } List> json = new ArrayList>(); From 78a4cdcaf8f8b6944c41ee645024e2558f31f115 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Fri, 30 Aug 2024 16:10:15 +0900 Subject: [PATCH 04/14] =?UTF-8?q?1.=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=A0=84=EC=86=A1=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=2030=EB=B6=84=20=EB=94=9C=EB=A0=88=EC=9D=B4=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1=EC=8A=B9=EC=9D=B8/=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=82=A0=EC=A7=9C=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=09-=20=EA=B8=B0=EC=A1=B4=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=8B=9C=EA=B0=84=20=EB=B9=84=EA=B5=90=EA=B0=80=20?= =?UTF-8?q?24=EC=8B=9C=EA=B0=84=20=EB=8B=A8=EC=9C=84=EB=A1=9C=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EC=96=B4=20=EC=9E=88=EC=96=B4=2024=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EB=8B=A8=EC=9C=84=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20=09-=20yy?= =?UTF-8?q?yyMMddhhmm=20-->=20yyyyMMddHHmm=20=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2. 카카오 알림톡 발송 화면 #{변수명} 설정파일 첨부기능 변경 - 기존 자바스크립트로 처리되고 있어 한셀 엑셀파일로 저장된 경우 오류 발생 - 컨트롤러에서 POI방식으로 처리되도록 로직 변경 --- .../web/KakaoAlimTalkSendController.java | 312 ++++++++++++++++++ .../WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp | 4 +- .../msgdata/at/KakaoAlimtalkMsgDataView.jsp | 9 +- src/main/webapp/js/kakao/at/alimtalkExcel.js | 203 +++++++++++- 4 files changed, 523 insertions(+), 5 deletions(-) diff --git a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java index 242a7511..c0295a74 100644 --- a/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java +++ b/src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java @@ -466,6 +466,318 @@ public class KakaoAlimTalkSendController { return jr; } + + + /* + * 20240829 신규 추가 우영두 + * 기존 Script에서 처리하던 방식 변경 + * 카카오 알림톡 엑셀 불러오기 엑셀 처리 + * + * */ + @RequestMapping(value = "/web/mjon/alimtalk/sendAlimtalkExelVarFilePhoneNumAjax.do") + @ResponseBody + public Object sendAlimtalkExelVarFilePhoneNumAjax(final MultipartHttpServletRequest multiRequest) throws Exception { + + JsonResult jr = new JsonResult(); + jr.setSuccess(false); + jr.setMessage("엑셀 파일만 업로드할 수 있습니다."); + + + try { + + //final Map files = multiRequest.getFileMap(); + List files = (List) multiRequest.getFiles("file0"); + + // 파일명에 .이 있을경우 오류 => Ex) 테스트6.20.xlsx + int fileNameSplitCnt = 0; + int excelVarCnt = Integer.parseInt(multiRequest.getParameter("excelVarCnt"));// 알림톡 템플릿 변수 갯수 데이터 + String [] excelVarArr = multiRequest.getParameter("excelVarList").split(","); + + + if(!files.isEmpty()) { + fileNameSplitCnt = files.get(0).getOriginalFilename().split("[.]").length; + + if (files.get(0).getSize() > 0 + && (files.get(0).getContentType().indexOf("spreadsheetml") > -1) + || files.get(0).getContentType().indexOf("ms-excel") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xlsx") > -1 + || files.get(0).getOriginalFilename().split("[.]")[fileNameSplitCnt-1].indexOf("xls") > -1) { + + // 엑셀 파일 용량 3MB이상 시 10만건 이상으로 서버가 다운되는 증상 발생 + long fileSize = multiRequest.getFile("file0").getSize(); + + String Ext = files.get(0).getOriginalFilename().split("[.]")[1]; + String errMessage = ""; + String cellValue = ""; + String errPhoneLine = ""; + int errPhoneCnt = 0; + + //수신번호 유효성 체크 + String phoneRegExp = "^(050[2345678]{1}|01[016789]{1})-?[0-9]{3,4}-?[0-9]{4}$"; + + if(Ext.equals("xls")) { + HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream()); + HSSFSheet sheet = workbook.getSheetAt(0); + + if(sheet.getLastRowNum() > 501) { + errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다."; + jr.setSuccess(false); + jr.setMessage(errMessage); + return jr; + } + + List> json = new ArrayList>(); + for(int i=1; i< sheet.getLastRowNum() + 1; i++){ //먼저 밸리데이션 체크(1줄은 생략) + HSSFRow row = sheet.getRow(i); //열읽기 + if(null == row) { + continue; + } + + HashMap jm = new HashMap<>(); + // 행의 두번째 열(이름부터 받아오기) + HSSFCell cell = null; + boolean errSts = true; + String rtnValueStr = ""; + for(int j = 0 ; j < excelVarCnt + 1; j++){ //행읽기(변수갯수 +1 개 만큼 컬럼을 읽음 수신번호 + 변수들) + + cellValue = ""; + cell = row.getCell(j); //수신번호 , 변수들 + if(null == cell || "".equals(cell.toString().trim())) { //수신번호 셀에 값이 없으면 + if(j == 0) { + if (sheet.getLastRowNum() == i) { + continue; + } + + break; + } + + } + + if(j == 0) { + + if(null != cell){ + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + + if(cellValue.matches(phoneRegExp) && errSts) { + jm.put("phone", cellValue); + }else { + errPhoneCnt++; + errPhoneLine += (i+1) + "행 "; + errSts = false; + break; + } + } + }else { + + if(cell != null) { + + if(j <= excelVarCnt) {//등록 변수 갯수 까지만 입력 + + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + + if(cellValue != null && !cellValue.equals("")) { + rtnValueStr += cellValue + "§"; + }else {//변ㅅ + rtnValueStr += "" + "§"; + } + + } + + }else { + rtnValueStr += "" + "§"; + + } + + } + + } + + jm.put("varVal", rtnValueStr.replaceFirst(".$", ""));//변수 데이터 추가 + if(null != jm.get("phone") && errSts) { + json.add(jm); + } + } + + int resultErrCnt = errPhoneCnt; + + jr.setData(json); + jr.setSuccess(true); + + if(resultErrCnt > 0) { + if (errPhoneCnt <= 10) { + if (StringUtils.isNotEmpty(errPhoneLine.trim())) { + errPhoneLine = "[" + errPhoneLine.trim() + "]"; + } + } + else { + errPhoneLine = ""; + } + + jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건" + errPhoneLine.trim() + " 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); + }else { + jr.setMessage(""); + } + + }else {//xlsx 엑셀 자료 처리 + + OPCPackage opcPackage = OPCPackage.open(files.get(0).getInputStream()); + XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); + XSSFSheet sheet = workbook.getSheetAt(0); // 첫번째 시트 불러오기 + opcPackage.close(); + + int totRowDataCnt = 0; + for(int r=1; r 501) { // + errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다."; + jr.setSuccess(false); + jr.setMessage(errMessage); + return jr; + } + + List> json = new ArrayList>(); + + for(int i=1; i< sheet.getLastRowNum() + 1; i++){ //먼저 밸리데이션 체크(1줄은 생략) + XSSFRow row = sheet.getRow(i); //열읽기 + if(null == row) { + continue; + } + + HashMap jm = new HashMap<>(); + // 행의 두번째 열(이름부터 받아오기) + XSSFCell cell = null; + boolean errSts = true; + String rtnValueStr = ""; + for(int j = 0 ; j < excelVarCnt + 1; j++){ //행읽기(변수갯수 +1 개 만큼 컬럼을 읽음 수신번호 + 변수들) + + cellValue = ""; + cell = row.getCell(j); //수신번호 , 변수들 + if(null == cell || "".equals(cell.toString().trim())) { //셀에 값이 없으면 + //System.out.println("Cell 데이터가 없습니다."); + if(j == 1) { + if (sheet.getLastRowNum() == i) { + continue; + } + + break; + + } + } + if(null != cell){ + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + } + + if(j == 0) {//수신번호 추가 + + if(cellValue.matches(phoneRegExp) && errSts) { + jm.put("phone", cellValue); + }else { + errPhoneCnt++; + errPhoneLine += (i+1) + "행 "; + errSts = false; + break; + } + + }else {//변수 데이터 추가 + + if(cell != null) { + + if(j <= excelVarCnt) {//등록 변수 갯수 까지만 입력 + + switch(cell.getCellType()){ //숫자타임을 문자로 변환 + case Cell.CELL_TYPE_NUMERIC: + cell.setCellType(Cell.CELL_TYPE_STRING); + } + cellValue = StringUtil.getString(cell.getStringCellValue().trim()) ; + + if(cellValue != null && !cellValue.equals("")) { + rtnValueStr += cellValue + "§"; + }else { + rtnValueStr += "" + "§"; + } + + } + + }else { + rtnValueStr += "" + "§"; + + } + + } + + } + + jm.put("varVal", rtnValueStr.replaceFirst(".$", ""));//변수 데이터 추가 + if(null != jm.get("phone") && errSts) { + json.add(jm); + } + + } + + int resultErrCnt = errPhoneCnt; + + jr.setData(json); + jr.setSuccess(true); + + if(resultErrCnt > 0) { + if (errPhoneCnt <= 10) { + if (StringUtils.isNotEmpty(errPhoneLine.trim())) { + errPhoneLine = "[" + errPhoneLine.trim() + "]"; + } + } + else { + errPhoneLine = ""; + } + + jr.setMessage("유효하지 않은 형식의 전화번호 "+ errPhoneCnt +"건" + errPhoneLine.trim() + " 있습니다.\n해당 건을 제외하고 문자 발송됩니다."); + }else { + jr.setMessage(""); + } + + } + + } + } + + } catch (Exception e) { + // TODO: handle exception + System.out.println("+++++++++++++++++ sendAlimtalkExelVarFilePhoneNumAjax Controller Error !!! "+e); + jr.setSuccess(false); + jr.setMessage("엑셀 데이터에 오류가 있습니다. 엑셀 데이터를 확인해 주세요."); + return jr; + + } + + return jr; + } // 카카오 템플릿 목록 조회 diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp index 7721272e..279072ae 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp @@ -781,9 +781,9 @@ function fn_SpamMberUpdt(userId, p_mberSttus, p_smiMemo, p_confirm_msg) {
- + - + diff --git a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp index 10250746..f97124a8 100644 --- a/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp @@ -1355,7 +1355,8 @@ function checkNumber(event) {
- + +
@@ -1754,7 +1755,11 @@ function checkNumber(event) {
- +
+ + + +
diff --git a/src/main/webapp/js/kakao/at/alimtalkExcel.js b/src/main/webapp/js/kakao/at/alimtalkExcel.js index af8ad88f..8d4e5538 100644 --- a/src/main/webapp/js/kakao/at/alimtalkExcel.js +++ b/src/main/webapp/js/kakao/at/alimtalkExcel.js @@ -192,6 +192,208 @@ function excelAddAjax(){ } +/* + * 신규 변수명 설정 엑셀 파일 불러오기 + * 기존 json 처리가 아닌 POI 방식으로 처리하기 위함 + * + * */ +function excelExportVarAjax(){ + + var data = document.getElementById('excelFile').files; + + var fileValue = $("#excelFile").val().split("\\"); + var fileName = fileValue[fileValue.length-1]; + + var fileExt = fileName.split('.').pop().toLowerCase(); + + if(fileExt.length > 0){ + if($.inArray(fileExt, ['xls','xlsx']) == -1) { + + alert('xls, xlsx 파일만 업로드 할수 있습니다.'); + return false; + + } + + } + fn_viewDataInit01(); + excelAddVarAjax(); +} + +function excelAddVarAjax(){ + + var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g); + + var form = document.excelVarFileForm; + form.excelVarCnt.value = varList.length; + form.excelVarList.value = varList; + + var data = new FormData(form); + data.append("file0", $('#excelFile').prop('files')[0]); + + var url = "/web/mjon/alimtalk/sendAlimtalkExelVarFilePhoneNumAjax.do"; + + $.ajax({ + type: "POST", + enctype: 'multipart/form-data', + url: url, + data: data, + dataType:'json', + async: true, + processData: false, + contentType: false, + cache: false, + //timeout: 600000, + success: function (returnData, status) { + if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나 + + if(returnData.success){ + + var data = returnData.data; + var message = returnData.message; + + if(message != '' ){ + alert(returnData.message); + } + + if(data != null){ + + //수신목록 Html 태그 + // 엑셀 헤더 + var excelTitleHeadText ='
' + +'\t

$HEADTITLE$

' + +'
'; + + // 바디 row 수신자 tag + var excelBodyRowTextIndex00 ='
' + +'\t\t

$ROWTEXT$

' + +'\t
'; + + // 바디 row tag + var excelBodyRowTextIndex01 ='
' + +'\t\t

$ROWTEXT$

' + +'\t
'; + + //맨 앞에 수신번호 배열 추가 + varList.unshift('수신번호'); + //변수 문자열 중복 제거 + var newList = Array.from(new Set(varList)); + + //엑셀헤더 selector + var $excelHead = $('#excelHead'); + //엑셀바디 selector + var $excelBody = $('#excelBody02'); + + // 엑셀 헤더 부분 + $.each(newList, function(headerIndex, value) { + $excelHead.append(excelTitleHeadText.replace('$HEADTITLE$', value)); + }); + + var totalDuplCnt = $('#rowDupCnt').text();//중복 건수 정보 + var $excelBody = $('#excelBody02'); + var bodyData; + var addDiv = ""; + var phoneNum; + + //입력데이터를 역정렬해준다. + data.reverse(); + + //변수명 추출해주기 + var varListArr = []; + varListArr = form.excelVarList.value.split(","); + + $.each(data, function(i, item){ + + if(checkHpNum(item.phone)){ + + phoneNum = removeDash(item.phone); + + if(!phoneDupl(phoneNum)){ + var varVal = item.varVal; + var lengthCheck =true; + /*23.04.06 이름제거 요청으로인한 화면 이름 제거*/ + var excelBody = '
'; + + //수신번호 화면 태그 생성 + excelBody += excelBodyRowTextIndex00.replace('$ROWTEXT$', removeDash(phoneNum)); + + //변수 데이터 태그 생성 + var varValArr = [] + varValArr = varVal.split("§"); + for(var i=0; i < varValArr.length; i++){ + + var bodyData = varValArr[i]; + + // 기타변수는 50자리 까지 입력 + if(bodyData.length > 100 || bodyData.length == 0){ + alert("등록 변수[ "+varListArr[i]+" ] \n기타변수의 입력 값이 없거나 100자리를 초과하는 내용이 포함되어 해당 내용 제외되었습니다."); + lengthCheck = false; + break; + } + excelBody += excelBodyRowTextIndex01.replace('$ROWTEXT$', bodyData); + + } + + excelBody += '
'; + + if(lengthCheck){ + addDiv += excelBody; + } + + } + + else + totalDuplCnt++; + + } else{ + + alert("엑셀 파일 데이터의 형식이 맞지 않는 부분이 있습니다."); + excelAddr = []; //엑셀 데이터 저장 변수 초기화 + $("#excelFile").val(""); //첨부파일 input 초기화 + $("#excelNm").val(""); // 첨부파일 명 초기화 + fileName = ""; + return; + + } + + }); + + //화면에 수신번호 및 변수 데이터 추가해 주기 + $excelBody.append(addDiv); + + } + + }else{ + alert(returnData.message); +// alert("첨부파일 불러오는 중 오류가 발생하였습니다."); + excelAddr = []; //엑셀 데이터 저장 변수 초기화 + $("#excelFile01").val(""); //첨부파일 input 초기화 + $("#excelNm01").val(""); // 첨부파일 명 초기화 + fileName = ""; + return; + + } + } else if(status== 'fail'){ + alert("첨부파일 불러오는 중 오류가 발생하였습니다."); + console.log("status : fail ~"); + } + }, + 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'); + } + }); + +} + + /** * 엑셀 파일 불러오기 */ @@ -481,7 +683,6 @@ function phoneDupl(data){ var resultBoo = true; data = removeDash(data); - /* * 중복체크 * 기존 데이터 배열화 From ebee77d5702416a3bd70d3733ae243238969ddd0 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Fri, 30 Aug 2024 16:35:21 +0900 Subject: [PATCH 05/14] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=ED=86=A1=20=EA=B4=80=EB=A6=AC=20>=20=EC=B1=84?= =?UTF-8?q?=EB=84=90=EC=95=84=EC=9D=B4=EB=94=94=EB=AA=A9=EB=A1=9D=20>=20?= =?UTF-8?q?=EC=B1=84=EB=84=90=EB=93=B1=EB=A1=9D=EC=9D=BC=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=EC=A0=95=EB=A0=AC=20=EC=95=84=EC=9D=B4=EC=BD=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=20=20-=20=EC=B1=84=EB=84=90=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EC=9D=BC(=EB=AC=B8=EC=9E=90=EC=98=A8=EC=97=90=20ID=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=9D=BC)=20=EC=98=A4=EB=A6=84/=EB=82=B4?= =?UTF-8?q?=EC=9D=BC=EC=B0=A8=EC=88=98=20=EC=A0=95=EB=A0=AC=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp index 0e8e298e..bd264762 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/KakaoATChannelIDList.jsp @@ -205,7 +205,7 @@ function fnSelectMber(mberId) { 채널명 등록상태 채널생성일 - 채널등록일 + 채널등록일 삭제여부 From 959ee7b79f79c0c791207e9a65edbc51fed134a4 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Fri, 30 Aug 2024 17:57:35 +0900 Subject: [PATCH 06/14] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=ED=86=A1=20=EA=B4=80=EB=A6=AC=20>=20=EC=B1=84?= =?UTF-8?q?=EB=84=90=20=EC=95=84=EC=9D=B4=EB=94=94=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=A0=95=EB=A0=AC=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=20=20-=20=EC=B1=84=EB=84=90=EB=93=B1=EB=A1=9D=EC=9D=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD(=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EC=B1=84=EB=84=90=EC=95=84=EC=9D=B4=EB=94=94=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=A0=95=EB=A0=AC=EC=9D=B4=EC=97=88?= =?UTF-8?q?=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java index 31e926c3..fc5bfecd 100644 --- a/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java +++ b/src/main/java/itn/let/kakao/admin/kakaoAt/web/MjonKakaoATController.java @@ -768,7 +768,7 @@ public class MjonKakaoATController { channelIDVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); if("".equals(channelIDVO.getSearchSortCnd())){ //최초조회시 최신것 조회List - channelIDVO.setSearchSortCnd("profileId"); + channelIDVO.setSearchSortCnd("lastUpdtPnttm"); channelIDVO.setSearchSortOrd("desc"); } From 01646e86c3811999913a35efa494e06a772326f2 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Mon, 2 Sep 2024 11:29:40 +0900 Subject: [PATCH 07/14] =?UTF-8?q?=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20>=20=EB=B0=9C=EC=8B=A0=EB=B2=88=ED=98=B8=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EB=B0=9C?= =?UTF-8?q?=EC=8B=A0=EB=B2=88=ED=98=B8=20=EC=8B=A0=EC=B2=AD=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=EC=A0=95=EC=A7=80,=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EC=9D=80=20=EC=8B=A0=EC=B2=AD=EC=9D=B4=20?= =?UTF-8?q?=EC=95=88=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/uat/uia/web/EgovMypageController.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java index af841586..f0ed2d97 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java @@ -1532,12 +1532,30 @@ public class EgovMypageController { public String sendNumberManageRegister( @ModelAttribute MberManageVO mberManageVO , HttpServletRequest request + , RedirectAttributes redirectAttributes , ModelMap model) throws Exception { /*LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();*/ 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"; + }else { + + /** + * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 + * 현재 로그인 세션도 만료 처리함 + * */ + boolean mberSttus = userManageService.selectUserStatusInfo(userId); + + if(!mberSttus) { + + request.getSession().invalidate(); + redirectAttributes.addFlashAttribute("message", "현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 발신번호 등록을 할 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다."); + + RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/web/main/mainPage.do"); + return redirectUrlMaker.getRedirectUrl(); + } + } model.addAttribute("loginVO", loginVO); model.addAttribute("pageTab", "sendNumberManage"); From ea870b66d01cf5141eeff36e6222d4b2a9697833 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Mon, 2 Sep 2024 14:13:00 +0900 Subject: [PATCH 08/14] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=2030=EB=B6=84?= =?UTF-8?q?=20=EB=94=9C=EB=A0=88=EC=9D=B4=20=EA=B4=80=EB=A0=A8=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=20=EC=9D=B4=EC=9A=A9=EC=A0=95=EC=A7=80=EC=8B=9C=20?= =?UTF-8?q?=EC=A0=95=EC=A7=80=20=EC=82=AC=EC=9C=A0=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp | 2 +- .../webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp | 2 +- src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp index b72619d0..1a52cfed 100644 --- a/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp +++ b/src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp @@ -1535,7 +1535,7 @@ function fn_MsgDelayCancel_after(){ var mberSttus = $('#mberSttus').val(); mberSttus = "B"; //이용자 정지 처리 var smiMemo = $('#smiContents').val(); - smiMemo = "관리자가 최근 문자 지연 내역에서 스미싱의심으로 판단하여 발송취소를 한 후 이용자 정지 처리함"; + smiMemo = "시스템 스팸 필터링에 의한 이용정지"; fn_SpamMberUpdt(mberSttus, smiMemo, "이용자 정지를 진행하시겠습니까?"); /* diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp index a0b1316a..e763479d 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/kakaoat/SendKakaoATList.jsp @@ -476,7 +476,7 @@ function kakaoATDelayCancel(msgGroupId, userId){ function fn_MsgDelayCancel_after(userId){ var mberSttus = $('#mberSttus').val(); mberSttus = "B"; //이용자 정지 처리 - var smiMemo = "관리자가 최근 문자 지연 내역에서 스미싱의심으로 판단하여 발송취소를 한 후 이용자 정지 처리함"; + var smiMemo = "시스템 스팸 필터링에 의한 이용정지"; fn_SpamMberUpdt(userId, mberSttus, smiMemo, "이용자 정지를 진행하시겠습니까?"); } diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp index 279072ae..55ab57ed 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/msg/SendMsgList.jsp @@ -499,11 +499,11 @@ function fnMsgDelayCancelArray(msgGroupId, userId) { function fn_MsgDelayCancel_after(userId){ var mberSttus = $('#mberSttus').val(); mberSttus = "B"; //이용자 정지 처리 - var smiMemo = "관리자가 최근 문자 지연 내역에서 스미싱의심으로 판단하여 발송취소를 한 후 이용자 정지 처리함"; + var smiMemo = "시스템 스팸 필터링에 의한 이용정지"; fn_SpamMberUpdt(userId, mberSttus, smiMemo, "이용자 정지를 진행하시겠습니까?"); } - + //회원 이용정지 처리 function fn_SpamMberUpdt(userId, p_mberSttus, p_smiMemo, p_confirm_msg) { url = "/uss/umt/user/EgovGnrlUpdateUserMsttusAjax.do"; From be8286da2b562162dcd2801f75de205993a3ea70 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Mon, 2 Sep 2024 17:20:18 +0900 Subject: [PATCH 09/14] =?UTF-8?q?=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=97=91=EC=85=80=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EB=B0=8F=20=EC=84=B1=EA=B3=B5,=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mjo/msgsent/service/MjonMsgSentVO.java | 15 +++++++++++++ .../msgsent/web/MjonMsgSentController.java | 21 ++++++++++++++++--- .../sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml | 4 ++++ 3 files changed, 37 insertions(+), 3 deletions(-) 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 ece24751..93b00b18 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java @@ -84,6 +84,9 @@ public class MjonMsgSentVO extends UserDefaultVO{ private String msgSentType; private String successCount; + private String resultSValue; + private String resultWFValue; + public String getSuccessCount() { return successCount; } @@ -458,5 +461,17 @@ public class MjonMsgSentVO extends UserDefaultVO{ public void setSendKind(String sendKind) { this.sendKind = sendKind; } + public String getResultSValue() { + return resultSValue; + } + public void setResultSValue(String resultSValue) { + this.resultSValue = resultSValue; + } + public String getResultWFValue() { + return resultWFValue; + } + public void setResultWFValue(String resultWFValue) { + this.resultWFValue = resultWFValue; + } } 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 e615bec6..e0a1667f 100644 --- a/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java +++ b/src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java @@ -1280,7 +1280,7 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll cell.setCellStyle(style); cell = row.createCell(10); - cell.setCellValue("실패"); + cell.setCellValue("실패/대기"); cell.setCellStyle(style); cell = row.createCell(11); @@ -1380,11 +1380,26 @@ private static final Logger logger = LoggerFactory.getLogger(MjonMsgSentControll double eachPrice = Float.parseFloat(resultAllSentList.get(i).getEachPrice()); + int resultSValue = 0; + int resultWFValue = 0; + + if(resultAllSentList.get(i).getResultSValue() != null) { + resultSValue = Integer.parseInt(resultAllSentList.get(i).getResultSValue()); + }else { + resultSValue = 1; + } + + if(resultAllSentList.get(i).getResultWFValue() != null) { + resultWFValue = Integer.parseInt(resultAllSentList.get(i).getResultWFValue()); + }else { + resultWFValue = 1; + } + if("S".equals(resultAllSentList.get(i).getMsgResult())) { - resSucCnt = 1; + resSucCnt = resultSValue; } else { - resFailCnt = 1; + resFailCnt = resultWFValue; } resSucPrice = eachPrice * resSucCnt; 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 b556d4d1..c4f5bfcd 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 @@ -256,6 +256,8 @@ , M2.msgResult , M2.sendKind , M2.msgKind + , M2.resultSValue + , M2.resultWFValue FROM ( SELECT @@ -297,6 +299,8 @@ , msgTypeName AS msgTypeName , orderByCode AS orderByCode , RESULT AS msgResult + , SUM(IF(RESULT = 'S', 1, 0 )) AS resultSValue + , SUM(IF(RESULT = 'W' OR RESULT = 'F', 1, 0 )) AS resultWFValue , sendKind AS sendKind , MSG_KIND AS msgKind FROM From a580f687274e4a6a111001f491afe280ff84240a Mon Sep 17 00:00:00 2001 From: rosewiper Date: Tue, 3 Sep 2024 10:04:04 +0900 Subject: [PATCH 10/14] =?UTF-8?q?=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=2030?= =?UTF-8?q?=EB=B6=84=20=EB=94=9C=EB=A0=88=EC=9D=B4=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=20-=20=EB=B0=9C=EC=86=A1=EA=B2=B0=EA=B3=BC=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=2030=EB=B6=84=20=EB=94=9C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=20=EB=90=98=EC=96=B4=EB=8F=84=20=EC=8B=9C=EA=B0=84=EC=9D=B4=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A7=80=EB=8A=94=EA=B2=83=EC=9D=80=20?= =?UTF-8?q?=EC=A0=95=EC=83=81=20=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A4=98=EC=95=BC=ED=95=9C=EB=8B=A4=EA=B3=A0?= =?UTF-8?q?=20=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../let/mjo/reservmsg/service/MjonResvMsgVO.java | 15 +++++++++++++++ .../sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml | 8 +++++++- .../sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml | 6 ++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java b/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java index 14331caa..4c90cde3 100644 --- a/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java +++ b/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java @@ -61,6 +61,9 @@ public class MjonResvMsgVO extends UserDefaultVO{ private String callFromComma; private String callToComma; + private String delayYn; //30분 딜레이 유무 + private String delayCompleteYn; //30분 딜레이 문자 처리 완료 유무 + public String getCallFromComma() { return callFromComma; } @@ -319,6 +322,18 @@ public class MjonResvMsgVO extends UserDefaultVO{ public void setSendKind(String sendKind) { this.sendKind = sendKind; } + 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; + } diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml index 61b93073..98dbda48 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml @@ -218,6 +218,8 @@ M2.cancelDate, M2.sendKind, M2.shipmentStatus, + M2.delayYn, + M2.delayCompleteYn, M2.orderByCode FROM ( SELECT COUNT(USER_ID) OVER() AS totMsgCnt, @@ -241,7 +243,9 @@ AGENT_CODE AS agentCode, RESERVE_C_YN AS reserveCYn, CANCELDATE AS cancelDate, - SEND_KIND as sendKind, + SEND_KIND AS sendKind, + DELAY_YN AS delayYn, + DELAY_COMPLETE_YN AS delayCompleteYn, CASE WHEN RESERVE_C_YN = 'Y' THEN '예약취소' @@ -282,6 +286,8 @@ MD.CUR_STATE, MD.RSLT_CODE, MD.RSLT_CODE2, + MGD.DELAY_YN, + MGD.DELAY_COMPLETE_YN, MGD.SEND_KIND FROM mj_msg_data MD INNER JOIN MJ_MSG_GROUP_DATA MGD 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 c4f5bfcd..75b0da36 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 @@ -258,6 +258,8 @@ , M2.msgKind , M2.resultSValue , M2.resultWFValue + , M2.delayYn + , M2.delayCompleteYn FROM ( SELECT @@ -303,6 +305,8 @@ , SUM(IF(RESULT = 'W' OR RESULT = 'F', 1, 0 )) AS resultWFValue , sendKind AS sendKind , MSG_KIND AS msgKind + , DELAY_YN AS delayYn + , DELAY_COMPLETE_YN AS delayCompleteYn FROM ( SELECT B.USER_ID @@ -328,6 +332,8 @@ , A.RSLT_CODE2 , B.SEND_KIND as sendKind , B.MSG_KIND + , B.DELAY_YN + , B.DELAY_COMPLETE_YN , CASE WHEN B.MSG_TYPE = '6' AND B.FILE_CNT > 0 From d3232e2ceb3f60792c16faca8ead86dd01546288 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Wed, 4 Sep 2024 10:16:10 +0900 Subject: [PATCH 11/14] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EA=B2=B0=EA=B3=BC,=20=EC=98=88=EC=95=BD=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EA=B2=B0=EA=B3=BC=20=ED=99=94=EB=A9=B4=2030=EB=B6=84?= =?UTF-8?q?=20=EB=94=9C=EB=A0=88=EC=9D=B4=EC=8B=9C=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=2030=EB=B6=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=90=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=91=9C=EC=8B=9C=20=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/let/mjo/msgsent/service/MjonMsgSentVO.java | 7 +++++++ .../itn/let/mjo/reservmsg/service/MjonResvMsgVO.java | 9 +++++++++ .../sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml | 1 + .../sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml | 8 ++++++++ .../WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp | 10 +++++++++- .../jsp/web/msgsent/MsgSentCompleteListAjax.jsp | 10 +++++++++- .../WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp | 10 +++++++++- .../WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp | 10 +++++++++- .../jsp/web/reservedmsg/ReservedMsgAllListAjax.jsp | 11 ++++++++++- 9 files changed, 71 insertions(+), 5 deletions(-) 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 93b00b18..f7478240 100644 --- a/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java +++ b/src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java @@ -73,6 +73,7 @@ public class MjonMsgSentVO extends UserDefaultVO{ private String msgKind; //문자종류(일반:N, 광고:A , 선거:C, 관리자:S, 이벤트:E) private String delayYn; //지연 문자 유무 private String delayCompleteYn; //지연문자 처리 완료 여부 + private Date delayOrgTime; //30분 딜레이된 발송시간에서 -30분 처리하여 원래 보내려던 발송시간 처리 private String msgId; //문자아이디 private String atchFiles; // 그림문자 파일정보 @@ -473,5 +474,11 @@ public class MjonMsgSentVO extends UserDefaultVO{ public void setResultWFValue(String resultWFValue) { this.resultWFValue = resultWFValue; } + public Date getDelayOrgTime() { + return delayOrgTime; + } + public void setDelayOrgTime(Date delayOrgTime) { + this.delayOrgTime = delayOrgTime; + } } diff --git a/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java b/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java index 4c90cde3..a926dd78 100644 --- a/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java +++ b/src/main/java/itn/let/mjo/reservmsg/service/MjonResvMsgVO.java @@ -64,6 +64,8 @@ public class MjonResvMsgVO extends UserDefaultVO{ private String delayYn; //30분 딜레이 유무 private String delayCompleteYn; //30분 딜레이 문자 처리 완료 유무 + private Date delayOrgTime; //30분 딜레이된 발송시간에서 -30분 처리하여 원래 보내려던 발송시간 처리 + public String getCallFromComma() { return callFromComma; } @@ -334,6 +336,13 @@ public class MjonResvMsgVO extends UserDefaultVO{ public void setDelayCompleteYn(String delayCompleteYn) { this.delayCompleteYn = delayCompleteYn; } + public Date getDelayOrgTime() { + return delayOrgTime; + } + public void setDelayOrgTime(Date delayOrgTime) { + this.delayOrgTime = delayOrgTime; + } + diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml index 98dbda48..e8e803dd 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgResv_SQL_mysql.xml @@ -202,6 +202,7 @@ M2.subject, M2.regdate, M2.reqdate, + IF(delayYn = 'Y' and delayCompleteYn = 'N', DATE_ADD(M2.reqdate, INTERVAL -30 MINUTE), M2.reqdate) AS delayOrgTime, M2.diffMin, M2.callFrom, FN_GETHYPHEN(M2.callFrom) AS callFromComma, 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 75b0da36..a9209770 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 @@ -233,6 +233,7 @@ , M2.subject , M2.regdate , M2.reqdate + , IF(delayYn = 'Y' and delayCompleteYn = 'N', DATE_ADD(M2.reqdate, INTERVAL -30 MINUTE), M2.reqdate) AS delayOrgTime , M2.callFrom , M2.callTo , FN_GETHYPHEN(M2.callFrom) AS callFromComma @@ -628,6 +629,7 @@ , M2.subject , M2.regdate , M2.reqdate + , IF(delayYn = 'Y' and delayCompleteYn = 'N', DATE_ADD(M2.reqdate, INTERVAL -30 MINUTE), M2.reqdate) AS delayOrgTime , M2.callFrom , M2.callTo , FN_GETHYPHEN(M2.callFrom) AS callFromComma @@ -647,6 +649,8 @@ , M2.msgId , M2.msgResult , M2.sendKind + , M2.delayYn + , M2.delayCompleteYn FROM ( SELECT @@ -667,6 +671,8 @@ , CUR_STATE AS curState , RSLT_CODE AS rsltCode , RSLT_CODE2 AS rsltCode2 + , DELAY_YN AS delayYn + , DELAY_COMPLETE_YN AS delayCompleteYn , IF( (RSLT_CODE != '0' AND RSLT_CODE != '100' AND RSLT_CODE != '101' @@ -713,6 +719,8 @@ , MD.CUR_STATE , MD.RSLT_CODE , MD.RSLT_CODE2 + , MGD.DELAY_YN + , MGD.DELAY_COMPLETE_YN , MGD.SEND_KIND AS sendKind ,() AS RESULT FROM diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp index 02541146..f0102561 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp @@ -173,7 +173,15 @@ $(document).ready(function(){ -

+ + + <%-- 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> +

+
+ +

+
+

diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp index 307c7769..1465db60 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentCompleteListAjax.jsp @@ -152,7 +152,15 @@ $(document).ready(function(){ -

+ + + <%-- 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> +

+
+ +

+
+

diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp index 9cce9597..6917b941 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentFailListAjax.jsp @@ -140,7 +140,15 @@ $(document).ready(function(){ -

+ + + <%-- 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> +

+
+ +

+
+

diff --git a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp index 4a40522e..a1803bcf 100644 --- a/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentReadyListAjax.jsp @@ -152,7 +152,15 @@ $(document).ready(function(){ -

+ + + <%-- 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> +

+
+ +

+
+

diff --git a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgAllListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgAllListAjax.jsp index 71c27302..5a9c1bdf 100644 --- a/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgAllListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/reservedmsg/ReservedMsgAllListAjax.jsp @@ -202,7 +202,16 @@ $(document).ready(function(){

-

+ + + <%-- 30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌 --%> +

+
+ +

+
+
+

From 8be39a2e4058dc1fa29b697e720f5d44dca4ce24 Mon Sep 17 00:00:00 2001 From: rosewiper Date: Fri, 6 Sep 2024 09:59:39 +0900 Subject: [PATCH 12/14] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=EA=B4=80=EB=A6=AC=20>=20=EC=9D=BC/=EC=9B=94=20?= =?UTF-8?q?=EB=A7=A4=EC=B6=9C=EC=95=A1=20=ED=99=94=EB=A9=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC,=20=EC=98=88=EC=95=BD=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=B0=9C=EC=86=A1=EC=9D=BC=EC=9E=90=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=20=EC=88=98=EC=A0=95=20=20=20-=2030=EB=B6=84?= =?UTF-8?q?=20=EC=A7=80=EC=97=B0=EB=90=9C=20=EA=B2=BD=EC=9A=B0=EC=97=90?= =?UTF-8?q?=EB=8F=84=20=EB=B0=9C=EC=86=A1=EC=8B=9C=EA=B0=84=EC=9D=80=2030?= =?UTF-8?q?=EB=B6=84=20=EB=8D=94=ED=95=B4=EC=A7=84=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EC=9B=90=EB=9E=98=20=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EB=A0=A4=ED=96=88=EB=8D=98=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=91=9C=EC=8B=9C=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD(=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=EC=97=90=EC=84=9C=EB=8A=94=2030=EB=B6=84=20=EC=A7=80=EC=97=B0?= =?UTF-8?q?=EB=90=9C=20=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=EB=90=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/let/mjo/pay/service/MjonPayVO.java | 27 ++ .../let/mjo/pay/web/MjonPayController.java | 431 +++++++++++++++++- .../sqlmap/let/pay/MjonPay_SQL_mysql.xml | 37 +- .../WEB-INF/jsp/uss/ion/pay/PayDayChart.jsp | 147 ++++-- .../WEB-INF/jsp/uss/ion/pay/PayMonthChart.jsp | 186 +++++++- .../WEB-INF/jsp/uss/ion/pay/RefundList.jsp | 4 +- 6 files changed, 775 insertions(+), 57 deletions(-) diff --git a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java index 601e1507..e61daec4 100644 --- a/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java +++ b/src/main/java/itn/let/mjo/pay/service/MjonPayVO.java @@ -207,6 +207,7 @@ public class MjonPayVO extends ComDefaultVO{ private String amtCellSum; //휴대폰 결제 금액 private String amtBankSum; //즉시이체 결제 금액 private String amtVbankSum; //전용계좌 결제 금액 + private String amtAfterPaySum; //전용계좌 결제 금액 private String amtRefundSum; //환불 금액 private String amtTotSum; //결제 금액 총액 @@ -215,6 +216,7 @@ public class MjonPayVO extends ComDefaultVO{ private String amtCellSumTot; //전체 휴대폰 결제 금액 private String amtBankSumTot; //전체 즉시이체 결제 금액 private String amtVbankSumTot; //전체 전용계좌 결제 금액 + private String amtAfterPaySumTot; //전체 전용계좌 결제 금액 private String amtRefundSumTot; //환불 금액 private String amtTotSumTot; //전체 결제 금액 총액 @@ -223,6 +225,7 @@ public class MjonPayVO extends ComDefaultVO{ private String amtCellCnt; //휴대폰 결제 수 private String amtBankCnt; //즉시이체 결제 수 private String amtVbankCnt; //전용계좌 결제 수 + private String amtAfterPayCnt; //전용계좌 결제 수 private String amtRefundCnt; //환불 수 private String amtTotCnt; //결제 수 총수 @@ -1708,6 +1711,30 @@ public class MjonPayVO extends ComDefaultVO{ public void setTrdNo(String trdNo) { this.trdNo = trdNo; } + + public String getAmtAfterPaySum() { + return amtAfterPaySum; + } + + public void setAmtAfterPaySum(String amtAfterPaySum) { + this.amtAfterPaySum = amtAfterPaySum; + } + + public String getAmtAfterPaySumTot() { + return amtAfterPaySumTot; + } + + public void setAmtAfterPaySumTot(String amtAfterPaySumTot) { + this.amtAfterPaySumTot = amtAfterPaySumTot; + } + + public String getAmtAfterPayCnt() { + return amtAfterPayCnt; + } + + public void setAmtAfterPayCnt(String amtAfterPayCnt) { + this.amtAfterPayCnt = amtAfterPayCnt; + } } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index 45abff3a..e753ea0d 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -5352,7 +5352,7 @@ public class MjonPayController { if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List mjonPayVO.setSearchSortCnd("regDate"); - mjonPayVO.setSearchSortOrd("desc"); + mjonPayVO.setSearchSortOrd("asc"); } List resultList = mjonPayService.selectPayDayChart(mjonPayVO); @@ -5363,7 +5363,7 @@ public class MjonPayController { mjonPayVO.setRecordCountPerPage(10000); if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List mjonPayVO.setSearchSortCnd("regDate"); - mjonPayVO.setSearchSortOrd("desc"); + mjonPayVO.setSearchSortOrd("asc"); } List resultList2 = mjonPayService.selectPayDayChart(mjonPayVO); @@ -5373,6 +5373,7 @@ public class MjonPayController { long amtCellSumTot = 0; //전체 휴대폰 결제 금액 long amtBankSumTot = 0; //전체 즉시이체 결제 금액 long amtVbankSumTot = 0; //전체 전용계좌 결제 금액 + long amtAfterPaySumTot = 0; //전체 전용계좌 결제 금액 long amtRefundSumTot = 0; //전체 환불 금액 long amtTotSumTot = 0; //전체 결제 금액 총액 @@ -5382,6 +5383,7 @@ public class MjonPayController { amtCellSumTot += Long.parseLong(item.getAmtCellSum()); amtBankSumTot += Long.parseLong(item.getAmtBankSum()); amtVbankSumTot += Long.parseLong(item.getAmtVbankSum()); + amtAfterPaySumTot += Long.parseLong(item.getAmtAfterPaySum()); amtRefundSumTot += Long.parseLong(item.getAmtRefundSum()); amtTotSumTot += Long.parseLong(item.getAmtTotSum()); } @@ -5391,6 +5393,7 @@ public class MjonPayController { mjonPayVO.setAmtCellSumTot(amtCellSumTot + ""); mjonPayVO.setAmtBankSumTot(amtBankSumTot + ""); mjonPayVO.setAmtVbankSumTot(amtVbankSumTot + ""); + mjonPayVO.setAmtAfterPaySumTot(amtAfterPaySumTot + ""); mjonPayVO.setAmtRefundSumTot(amtRefundSumTot + ""); mjonPayVO.setAmtTotSumTot(amtTotSumTot + ""); @@ -5402,8 +5405,217 @@ public class MjonPayController { return "/uss/ion/pay/PayDayChart"; } + + /* + * 일별 매출 통계 엑셀 다운로드 + * + * */ + @RequestMapping(value= {"/uss/ion/pay/payDayChartExcelDownload.do"}) + public void payDayChartExcelDownload( MjonPayVO mjonPayVO, + HttpServletRequest request, + HttpServletResponse response , + ModelMap model) throws Exception { + + mjonPayVO.setRecordCountPerPage(mjonPayVO.getPageUnit()); + mjonPayVO.setFirstIndex(0); + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + if(null != loginVO && !"super".equals(loginVO.getSiteId())){ + mjonPayVO.setSiteId(loginVO.getSiteId()); + } + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + SXSSFWorkbook wb = new SXSSFWorkbook(100); + CellStyle style = wb.createCellStyle(); + style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 + style.setBorderLeft(CellStyle.BORDER_THIN); + style.setBorderRight(CellStyle.BORDER_THIN); + style.setBorderTop(CellStyle.BORDER_THIN); + Font font = wb.createFont(); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold + + Cell cell = null; + Row row = null; + + String fileName ="일별 매출 통계"; + + String sheetTitle = ""; + try{ + List resultList = mjonPayService.selectPayDayChart(mjonPayVO); + { //화면 리스트 + sheetTitle = "일별 매출 통계" ; //제목 + Sheet sheet = wb.createSheet(sheetTitle); + row = sheet.createRow(0); + + cell = row.createCell(0); + cell.setCellValue("결제일"); + cell.setCellStyle(style); + + cell = row.createCell(1); + cell.setCellValue("신용카드"); + cell.setCellStyle(style); + + cell = row.createCell(2); + cell.setCellValue("휴대폰"); + cell.setCellStyle(style); + + cell = row.createCell(3); + cell.setCellValue("즉시이체"); + cell.setCellStyle(style); + + cell = row.createCell(4); + cell.setCellValue("전용계좌"); + cell.setCellStyle(style); + + cell = row.createCell(5); + cell.setCellValue("간편결제"); + cell.setCellStyle(style); + + cell = row.createCell(6); + cell.setCellValue("후불결제"); + cell.setCellStyle(style); + + cell = row.createCell(7); + cell.setCellValue("환불"); + cell.setCellStyle(style); + + cell = row.createCell(8); + cell.setCellValue("합계(VAT포함)"); + cell.setCellStyle(style); + + long amtCardSumTot = 0; //전체 신용카드 결제 금액 + long amtCellSumTot = 0; //전체 휴대폰 결제 금액 + long amtBankSumTot = 0; //전체 즉시이체 결제 금액 + long amtVbankSumTot = 0; //전체 전용계좌 결제 금액 + long amtSpaySumTot = 0; //전체 간편결제 결제 금액 + long amtAfterPaySumTot = 0; //전체 후불결제 금액 + long amtRefundSumTot = 0; //전체 환불 금액 + long amtTotSumTot = 0; //전체 결제 금액 총액 + + for(int i=0; i < resultList.size(); i++){ + row = sheet.createRow(i+1); + for(int j=0 ; j < 9 ; j++) { + cell = row.createCell(j); + cell.setCellStyle(style); + + String regDate = (resultList.get(i)).getRegDate(); + String amtCardSum = (resultList.get(i)).getAmtCardSum(); + String amtCellSum = (resultList.get(i)).getAmtCellSum(); + String amtBankSum = (resultList.get(i)).getAmtBankSum(); + String amtVbankSum = (resultList.get(i)).getAmtVbankSum(); + String amtSpaySum = (resultList.get(i)).getAmtSpaySum(); + String amtAfterPaySum = (resultList.get(i)).getAmtAfterPaySum(); + String amtRefundSum = (resultList.get(i)).getAmtRefundSum(); + String amtTotSum = (resultList.get(i)).getAmtTotSum(); + + if(j==0) cell.setCellValue(regDate); //결제월 + if(j==1) { + cell.setCellValue(amtCardSum); //신용카드 + amtCardSumTot += Long.parseLong(amtCardSum); + } + if(j==2) { + cell.setCellValue(amtCellSum); //휴대폰 + amtCellSumTot += Long.parseLong(amtCellSum); + } + if(j==3) { + cell.setCellValue(amtBankSum); //즉시이체 + amtBankSumTot += Long.parseLong(amtBankSum); + } + if(j==4) { + cell.setCellValue(amtVbankSum); //전용계좌 + amtVbankSumTot += Long.parseLong(amtVbankSum); + } + if(j==5) { + cell.setCellValue(amtSpaySum); //간편결제 + amtSpaySumTot += Long.parseLong(amtSpaySum); + } + if(j==6) { + cell.setCellValue(amtAfterPaySum); //후불결제 + amtAfterPaySumTot += Long.parseLong(amtAfterPaySum); + } + if(j==7) { + cell.setCellValue(amtRefundSum); //환불 + amtRefundSumTot += Long.parseLong(amtRefundSum); + } + if(j==8) { + cell.setCellValue(amtTotSum); //합계(VAT포함) + amtTotSumTot += Long.parseLong(amtTotSum); + } + + } + } + + //전체 합계 행 추가 + row = sheet.createRow(resultList.size()+1); + cell = row.createCell(0); + cell.setCellStyle(style); + cell.setCellValue("합계"); //결제월 + + cell = row.createCell(1); + cell.setCellStyle(style); + cell.setCellValue(amtCardSumTot); //신용카드 + + cell = row.createCell(2); + cell.setCellStyle(style); + cell.setCellValue(amtCellSumTot); //휴대폰 + + cell = row.createCell(3); + cell.setCellStyle(style); + cell.setCellValue(amtBankSumTot); //즉시이체 + + cell = row.createCell(4); + cell.setCellStyle(style); + cell.setCellValue(amtVbankSumTot); //전용계좌 + + cell = row.createCell(5); + cell.setCellStyle(style); + cell.setCellValue(amtSpaySumTot); //간편결제 + + cell = row.createCell(6); + cell.setCellStyle(style); + cell.setCellValue(amtAfterPaySumTot); //후불결제 + + cell = row.createCell(7); + cell.setCellStyle(style); + cell.setCellValue(amtRefundSumTot); //환불 + + cell = row.createCell(8); + cell.setCellStyle(style); + cell.setCellValue(amtTotSumTot); //합계(VAT포함) + + } + response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA ); + Date currentTime = new Date (); + String mTime = mSimpleDateFormat.format ( currentTime ); + fileName = fileName+"("+mTime+")"; + + response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); + wb.write(response.getOutputStream()); + + }catch(Exception e) { + response.setHeader("Set-Cookie", "fileDownload=false; path=/"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Content-Type","text/html; charset=utf-8"); + OutputStream out = null; + try { + out = response.getOutputStream(); + byte[] data = new String("fail..").getBytes(); + out.write(data, 0, data.length); + } catch(Exception ignore) { + ignore.printStackTrace(); + } finally { + if(out != null) try { out.close(); } catch(Exception ignore) {} + if(wb != null) try { wb.dispose(); wb.close(); } catch(Exception ignore) {} + } + }finally { + // 디스크 적었던 임시파일을 제거합니다. + wb.dispose(); + try { wb.close(); } catch(Exception ignore) {} + } + } + + /** - * 월별 결제 통계 + * 월별 매출 통계 * @param searchVO * @param model * @return "/uss/ion/pay/payDayChart" @@ -5434,7 +5646,7 @@ public class MjonPayController { } if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List mjonPayVO.setSearchSortCnd("regDate"); - mjonPayVO.setSearchSortOrd("desc"); + mjonPayVO.setSearchSortOrd("asc"); } mjonPayVO.setFirstIndex(0); @@ -5447,6 +5659,7 @@ public class MjonPayController { long amtCellSumTot = 0; //전체 휴대폰 결제 금액 long amtBankSumTot = 0; //전체 즉시이체 결제 금액 long amtVbankSumTot = 0; //전체 전용계좌 결제 금액 + long amtAfterPaySumTot = 0; //전체 후불결제 금액 long amtRefundSumTot = 0; //전체 환불 금액 long amtTotSumTot = 0; //전체 결제 금액 총액 @@ -5456,6 +5669,7 @@ public class MjonPayController { amtCellSumTot += Long.parseLong(item.getAmtCellSum()); amtBankSumTot += Long.parseLong(item.getAmtBankSum()); amtVbankSumTot += Long.parseLong(item.getAmtVbankSum()); + amtAfterPaySumTot += Long.parseLong(item.getAmtAfterPaySum()); amtRefundSumTot += Long.parseLong(item.getAmtRefundSum()); amtTotSumTot += Long.parseLong(item.getAmtTotSum()); } @@ -5465,6 +5679,7 @@ public class MjonPayController { mjonPayVO.setAmtCellSumTot(amtCellSumTot + ""); mjonPayVO.setAmtBankSumTot(amtBankSumTot + ""); mjonPayVO.setAmtVbankSumTot(amtVbankSumTot + ""); + mjonPayVO.setAmtAfterPaySumTot(amtAfterPaySumTot + ""); mjonPayVO.setAmtRefundSumTot(amtRefundSumTot + ""); mjonPayVO.setAmtTotSumTot(amtTotSumTot + ""); @@ -5478,6 +5693,214 @@ public class MjonPayController { return "/uss/ion/pay/PayMonthChart"; } + + /* + * 월별 매출 통계 엑셀 다운로드 + * + * */ + @RequestMapping(value= {"/uss/ion/pay/payMonthChartExcelDownload.do"}) + public void payMonthChartExcelDownload( MjonPayVO mjonPayVO, + HttpServletRequest request, + HttpServletResponse response , + ModelMap model) throws Exception { + + mjonPayVO.setRecordCountPerPage(mjonPayVO.getPageUnit()); + mjonPayVO.setFirstIndex(0); + LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser(); + if(null != loginVO && !"super".equals(loginVO.getSiteId())){ + mjonPayVO.setSiteId(loginVO.getSiteId()); + } + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + SXSSFWorkbook wb = new SXSSFWorkbook(100); + CellStyle style = wb.createCellStyle(); + style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 + style.setBorderLeft(CellStyle.BORDER_THIN); + style.setBorderRight(CellStyle.BORDER_THIN); + style.setBorderTop(CellStyle.BORDER_THIN); + Font font = wb.createFont(); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); //글씨 bold + + Cell cell = null; + Row row = null; + + String fileName ="월별 매출 통계"; + + String sheetTitle = ""; + try{ + List resultList = mjonPayService.selectPayMonthChart(mjonPayVO); + { //화면 리스트 + sheetTitle = "월별 매출 통계" ; //제목 + Sheet sheet = wb.createSheet(sheetTitle); + row = sheet.createRow(0); + + cell = row.createCell(0); + cell.setCellValue("결제월"); + cell.setCellStyle(style); + + cell = row.createCell(1); + cell.setCellValue("신용카드"); + cell.setCellStyle(style); + + cell = row.createCell(2); + cell.setCellValue("휴대폰"); + cell.setCellStyle(style); + + cell = row.createCell(3); + cell.setCellValue("즉시이체"); + cell.setCellStyle(style); + + cell = row.createCell(4); + cell.setCellValue("전용계좌"); + cell.setCellStyle(style); + + cell = row.createCell(5); + cell.setCellValue("간편결제"); + cell.setCellStyle(style); + + cell = row.createCell(6); + cell.setCellValue("후불결제"); + cell.setCellStyle(style); + + cell = row.createCell(7); + cell.setCellValue("환불"); + cell.setCellStyle(style); + + cell = row.createCell(8); + cell.setCellValue("합계(VAT포함)"); + cell.setCellStyle(style); + + long amtCardSumTot = 0; //전체 신용카드 결제 금액 + long amtCellSumTot = 0; //전체 휴대폰 결제 금액 + long amtBankSumTot = 0; //전체 즉시이체 결제 금액 + long amtVbankSumTot = 0; //전체 전용계좌 결제 금액 + long amtSpaySumTot = 0; //전체 간편결제 결제 금액 + long amtAfterPaySumTot = 0; //전체 후불결제 금액 + long amtRefundSumTot = 0; //전체 환불 금액 + long amtTotSumTot = 0; //전체 결제 금액 총액 + + for(int i=0; i < resultList.size(); i++){ + row = sheet.createRow(i+1); + for(int j=0 ; j < 9 ; j++) { + cell = row.createCell(j); + cell.setCellStyle(style); + + String regDate = (resultList.get(i)).getRegDate(); + String amtCardSum = (resultList.get(i)).getAmtCardSum(); + String amtCellSum = (resultList.get(i)).getAmtCellSum(); + String amtBankSum = (resultList.get(i)).getAmtBankSum(); + String amtVbankSum = (resultList.get(i)).getAmtVbankSum(); + String amtSpaySum = (resultList.get(i)).getAmtSpaySum(); + String amtAfterPaySum = (resultList.get(i)).getAmtAfterPaySum(); + String amtRefundSum = (resultList.get(i)).getAmtRefundSum(); + String amtTotSum = (resultList.get(i)).getAmtTotSum(); + + if(j==0) cell.setCellValue(regDate); //결제월 + if(j==1) { + cell.setCellValue(amtCardSum); //신용카드 + amtCardSumTot += Long.parseLong(amtCardSum); + } + if(j==2) { + cell.setCellValue(amtCellSum); //휴대폰 + amtCellSumTot += Long.parseLong(amtCellSum); + } + if(j==3) { + cell.setCellValue(amtBankSum); //즉시이체 + amtBankSumTot += Long.parseLong(amtBankSum); + } + if(j==4) { + cell.setCellValue(amtVbankSum); //전용계좌 + amtVbankSumTot += Long.parseLong(amtVbankSum); + } + if(j==5) { + cell.setCellValue(amtSpaySum); //간편결제 + amtSpaySumTot += Long.parseLong(amtSpaySum); + } + if(j==6) { + cell.setCellValue(amtAfterPaySum); //후불결제 + amtAfterPaySumTot += Long.parseLong(amtAfterPaySum); + } + if(j==7) { + cell.setCellValue(amtRefundSum); //환불 + amtRefundSumTot += Long.parseLong(amtRefundSum); + } + if(j==8) { + cell.setCellValue(amtTotSum); //합계(VAT포함) + amtTotSumTot += Long.parseLong(amtTotSum); + } + + } + } + + //총합계 행 추가 + row = sheet.createRow(resultList.size()+1); + cell = row.createCell(0); + cell.setCellStyle(style); + cell.setCellValue("합계"); //결제월 + + cell = row.createCell(1); + cell.setCellStyle(style); + cell.setCellValue(amtCardSumTot); //신용카드 + + cell = row.createCell(2); + cell.setCellStyle(style); + cell.setCellValue(amtCellSumTot); //휴대폰 + + cell = row.createCell(3); + cell.setCellStyle(style); + cell.setCellValue(amtBankSumTot); //즉시이체 + + cell = row.createCell(4); + cell.setCellStyle(style); + cell.setCellValue(amtVbankSumTot); //전용계좌 + + cell = row.createCell(5); + cell.setCellStyle(style); + cell.setCellValue(amtSpaySumTot); //간편결제 + + cell = row.createCell(6); + cell.setCellStyle(style); + cell.setCellValue(amtAfterPaySumTot); //후불결제 + + cell = row.createCell(7); + cell.setCellStyle(style); + cell.setCellValue(amtRefundSumTot); //환불 + + cell = row.createCell(8); + cell.setCellStyle(style); + cell.setCellValue(amtTotSumTot); //합계(VAT포함) + + } + response.setHeader("Set-Cookie", "fileDownload=true; path=/"); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA ); + Date currentTime = new Date (); + String mTime = mSimpleDateFormat.format ( currentTime ); + fileName = fileName+"("+mTime+")"; + + response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx")); + wb.write(response.getOutputStream()); + + }catch(Exception e) { + response.setHeader("Set-Cookie", "fileDownload=false; path=/"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Content-Type","text/html; charset=utf-8"); + OutputStream out = null; + try { + out = response.getOutputStream(); + byte[] data = new String("fail..").getBytes(); + out.write(data, 0, data.length); + } catch(Exception ignore) { + ignore.printStackTrace(); + } finally { + if(out != null) try { out.close(); } catch(Exception ignore) {} + if(wb != null) try { wb.dispose(); wb.close(); } catch(Exception ignore) {} + } + }finally { + // 디스크 적었던 임시파일을 제거합니다. + wb.dispose(); + try { wb.close(); } catch(Exception ignore) {} + } + } + /* @RequestMapping(value= {"/web/main/vacTest.do"}) public void vacTest() throws Exception { diff --git a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml index c0fa44ab..75d69bfc 100644 --- a/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/pay/MjonPay_SQL_mysql.xml @@ -1651,7 +1651,9 @@ ROUND(IFNULL(S6.AMT, 0)) AS amtRefundSum, IFNULL(S6.CNT, 0) AS amtRefundCnt, ROUND(IFNULL(S7.AMT, 0)) AS amtSpaySum, - IFNULL(S7.CNT, 0) AS amtSpayCnt + IFNULL(S7.CNT, 0) AS amtSpayCnt, + ROUND(IFNULL(S8.AMT, 0)) AS amtAfterPaySum, + IFNULL(S8.CNT, 0) AS amtAfterPayCnt FROM (SELECT DATE_FORMAT(t1.REG_DATE, '%Y-%m-%d') AS REG_DATE , SUM(t1.AMT) AS AMT, COUNT(0) AS CNT, @@ -1768,6 +1770,23 @@ ) S7 ON S7.REG_DATE = S1.REG_DATE + LEFT JOIN + ( SELECT DATE_FORMAT(t8.REG_DATE, '%Y-%m-%d') AS REG_DATE , + SUM(t8.AMT) AS AMT, + COUNT(0) AS CNT + FROM MJ_PG t8 + WHERE t8.PG_STATUS = 1 + AND t8.pay_method ='AFTERPAY' + + AND = #ntceBgnde# ]]> + + + AND + + GROUP BY DATE_FORMAT(t8.REG_DATE, '%Y-%m-%d') + ) + S8 + ON S8.REG_DATE = S1.REG_DATE ORDER BY 1=1 ,$searchSortCnd$ @@ -1790,7 +1809,8 @@ ROUND(IFNULL(S4.AMT, 0)) AS amtBankSum, ROUND(IFNULL(S5.AMT, 0)) AS amtVbankSum, ROUND(IFNULL(S6.AMT, 0)) AS amtRefundSum, - ROUND(IFNULL(S7.AMT, 0)) AS amtSpaySum + ROUND(IFNULL(S7.AMT, 0)) AS amtSpaySum, + ROUND(IFNULL(S8.AMT, 0)) AS amtAfterPaySum FROM (SELECT DATE_FORMAT(t1.REG_DATE, '%Y-%m') AS REG_DATE , SUM(t1.AMT) AS AMT, t1.moid AS MOID @@ -1879,6 +1899,19 @@ ) S7 ON S7.REG_DATE = S1.REG_DATE + LEFT JOIN + ( SELECT DATE_FORMAT(t8.REG_DATE, '%Y-%m') AS REG_DATE , + SUM(t8.AMT) AS AMT + FROM MJ_PG t8 + WHERE t8.PG_STATUS = 1 + AND t8.pay_method ='AFTERPAY' + + AND + + GROUP BY DATE_FORMAT(t8.REG_DATE, '%Y-%m') + ) + S8 + ON S8.REG_DATE = S1.REG_DATE ORDER BY 1=1 ,$searchSortCnd$ diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/pay/PayDayChart.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/pay/PayDayChart.jsp index d0eaef2e..73e41db8 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/pay/PayDayChart.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/pay/PayDayChart.jsp @@ -105,6 +105,44 @@ function fnSetCalMonth(val) { form.ntceEnddeYYYMMDD.value = year + "-" + month + "-" + date; } + +function fnGoPayList(payType, payDate){ + + var form = document.payParamForm; + form.searchCondition2.value = payType; + form.searchStartDate.value= payDate; + form.searchEndDate.value= payDate; + + form.action=""; + form.submit(); + +} + +function fnGoPayRefundList(refundType, refundDate){ + + var form = document.payRefParamForm; + + form.searchCondition2.value = refundType; + form.searchStartDate.value= refundDate; + form.searchEndDate.value= refundDate; + + form.action=""; + form.submit(); + +} + +function payDayExcelDownload(){ + + var form = document.payExcelDwnForm; + + $('#excelNtceBgnde').val($('#ntceBgndeYYYMMDD').val()) ; + $('#excelNtceEndde').val($('#ntceEnddeYYYMMDD').val()) ; + + form.action=""; + form.submit(); + +} +