diff --git a/pom.xml b/pom.xml index b48c556b..bcecf078 100644 --- a/pom.xml +++ b/pom.xml @@ -564,6 +564,20 @@ system ${basedir}/src/main/webapp/WEB-INF/lib/ozsfw80.jar + + + + net.javacrumbs.shedlock + shedlock-spring + 2.5.0 + + + + + net.javacrumbs.shedlock + shedlock-provider-jdbc-template + 2.5.0 + diff --git a/src/main/java/kcc/com/cmm/util/MagicDBAPIUtil.java b/src/main/java/kcc/com/cmm/util/MagicDBAPIUtil.java index 3b2ba15e..8bbecfa1 100644 --- a/src/main/java/kcc/com/cmm/util/MagicDBAPIUtil.java +++ b/src/main/java/kcc/com/cmm/util/MagicDBAPIUtil.java @@ -1,12 +1,11 @@ package kcc.com.cmm.util; -import java.util.Calendar; -import com.dsmdb.japi.MagicDBAPI; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; + +import com.dsmdb.japi.MagicDBAPI; import kcc.kccadr.adjReqMgrPast.service.AdjReqMgrPastVO; @@ -35,13 +34,13 @@ public final class MagicDBAPIUtil { } public static String encryptOnlyOneString(String stringVal) { -// return MagicDBAPI.encrypt(POLICY_NAME, stringVal); - return stringVal; + return MagicDBAPI.encrypt(POLICY_NAME, stringVal); +// return stringVal; } public static String decryptOnlyOneString(String stringVal) { -// return MagicDBAPI.decrypt(POLICY_NAME, stringVal); - return stringVal; + return MagicDBAPI.decrypt(POLICY_NAME, stringVal); +// return stringVal; } } diff --git a/src/main/java/kcc/com/cmm/util/Snippet.java b/src/main/java/kcc/com/cmm/util/Snippet.java new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/kcc/kccadr/adjReqMgrPast/service/impl/AdjReqMgrPastServiceImpl.java b/src/main/java/kcc/kccadr/adjReqMgrPast/service/impl/AdjReqMgrPastServiceImpl.java index 1609ef50..c622f22f 100644 --- a/src/main/java/kcc/kccadr/adjReqMgrPast/service/impl/AdjReqMgrPastServiceImpl.java +++ b/src/main/java/kcc/kccadr/adjReqMgrPast/service/impl/AdjReqMgrPastServiceImpl.java @@ -223,8 +223,11 @@ public class AdjReqMgrPastServiceImpl extends EgovAbstractServiceImpl implements public ResponseEntity insertAdjReqMgrRpplReq(AdjReqMgrPastVO adjReqMgrPastVO) throws Exception{ - //조정 사건 키값 생성 및 디비 생성해주기 - String adrSeq = adrIdgenService.getNextStringId(); // 고유ID + String adrSeq = adrIdgenService.getNextStringId(); // 고유ID + try { + + + //조정 사건 키값 생성 및 디비 생성해주기 adjReqMgrPastVO.setAdrSeq(adrSeq); adjReqMgrPastVO.setReqOlCd(KccadrConstants.ADR_REQ_PAST); //과거이력 구분 코드 2 @@ -453,21 +456,29 @@ public class AdjReqMgrPastServiceImpl extends EgovAbstractServiceImpl implements } } - int adrSn = Integer.parseInt(adjReqMgrPastVO.getAdrSn()); - int cnt = 1; - while(cnt <= adrSn) + if(StringUtils.isNotEmpty(adjReqMgrPastVO.getAdrSn())) { - adjReqMgrPastVO.setPrtclSeq(idgenPrtclSeqService.getNextStringId()); // idgenPrtclSeqService - adjReqMgrPastVO.setAdrSn(Integer.toString(cnt)); - adjReqMgrPastDAO.insertAdrSnInit(adjReqMgrPastVO); - cnt++; + int adrSn = Integer.parseInt(adjReqMgrPastVO.getAdrSn()); + int cnt = 1; + while(cnt <= adrSn) + { + adjReqMgrPastVO.setPrtclSeq(idgenPrtclSeqService.getNextStringId()); // idgenPrtclSeqService + adjReqMgrPastVO.setAdrSn(Integer.toString(cnt)); + adjReqMgrPastDAO.insertAdrSnInit(adjReqMgrPastVO); + cnt++; + } + } adjReqMgrPastVO.setAdrHstrySeq(adrHstrySeqGnrService.getNextStringId()); adjReqMgrPastVO.setAdrSn("0"); adjReqMgrPastDAO.insertAdjReqRecordAjax(adjReqMgrPastVO); - + + } catch (Exception e) { + e.printStackTrace(); + // TODO: handle exception + } return ResponseEntity.ok(new RestResponse(HttpStatus.OK, "조정신청 정보 저장이 완료되었습니다.", adrSeq, LocalDateTime.now())); } @@ -974,18 +985,22 @@ public class AdjReqMgrPastServiceImpl extends EgovAbstractServiceImpl implements { if(prtclRowList.size() < 1) { - int adrSn = Integer.parseInt(prmtrAdrSn); - int cnt = 1; - logger.info(" ++ cnt : [{}] / adrSn : [{}] ", cnt, adrSn); - while(cnt <= adrSn) + if(StringUtils.isNotEmpty(prmtrAdrSn)) { + int adrSn = Integer.parseInt(prmtrAdrSn); + int cnt = 1; logger.info(" ++ cnt : [{}] / adrSn : [{}] ", cnt, adrSn); - adjReqMgrPastVO.setPrtclSeq(idgenPrtclSeqService.getNextStringId()); // idgenPrtclSeqService - adjReqMgrPastVO.setAdrSn(Integer.toString(cnt)); - adjReqMgrPastDAO.insertAdrSnInit(adjReqMgrPastVO); - cnt++; + while(cnt <= adrSn) + { + logger.info(" ++ cnt : [{}] / adrSn : [{}] ", cnt, adrSn); + adjReqMgrPastVO.setPrtclSeq(idgenPrtclSeqService.getNextStringId()); // idgenPrtclSeqService + adjReqMgrPastVO.setAdrSn(Integer.toString(cnt)); + adjReqMgrPastDAO.insertAdrSnInit(adjReqMgrPastVO); + cnt++; + } + adjReqMgrPastDAO.updateAdrSn(adjReqMgrPastVO); + } - adjReqMgrPastDAO.updateAdrSn(adjReqMgrPastVO); } } diff --git a/src/main/java/kcc/kccadr/adjReqMgrPast/web/AdjReqMgrPastController.java b/src/main/java/kcc/kccadr/adjReqMgrPast/web/AdjReqMgrPastController.java index a575a053..b23f1c7c 100644 --- a/src/main/java/kcc/kccadr/adjReqMgrPast/web/AdjReqMgrPastController.java +++ b/src/main/java/kcc/kccadr/adjReqMgrPast/web/AdjReqMgrPastController.java @@ -644,7 +644,6 @@ public class AdjReqMgrPastController { //사용자 유니크 아이디 받아오기 adjReqMgrPastVO.setFrstRegisterId(userId); adjReqMgrPastVO.setLastUpdusrId(userId); - //조정신청, 대리인, 신청인 등록 처리 return adjReqMgrPastService.insertAdjReqMgrRpplReq(adjReqMgrPastVO); } diff --git a/src/main/java/kcc/kccadr/adjst/web/AdjstReqWebController.java b/src/main/java/kcc/kccadr/adjst/web/AdjstReqWebController.java index 279e192c..3cb611c2 100644 --- a/src/main/java/kcc/kccadr/adjst/web/AdjstReqWebController.java +++ b/src/main/java/kcc/kccadr/adjst/web/AdjstReqWebController.java @@ -306,13 +306,6 @@ public class AdjstReqWebController { public String adjstReqRegistInformation(@ModelAttribute("adjstReqVO") AdjstReqVO adjstReqVO, ModelMap model) throws Exception { adjstReqVO.setStep(KccadrConstants.STEP0); - // 오라클 연동 테스트 > 여현준 -// sMSOracleService.selectOracleTest(); -// AdjReqMgrVO adjReqMgrVO = new AdjReqMgrVO(); -// adjReqMgrVO.setAdrSeq("ADR_0000000000000381"); -// adjReqMgrVO.setStatCd("104010"); -// sMSOracleService.insertSmsSend(adjReqMgrVO); - //로그인 권한정보 불러오기 // LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; // String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getUniqId()); diff --git a/src/main/java/kcc/kccadr/cmm/service/impl/SMSOracleServiceImpl.java b/src/main/java/kcc/kccadr/cmm/service/impl/SMSOracleServiceImpl.java index 8659e1e4..f913fe86 100644 --- a/src/main/java/kcc/kccadr/cmm/service/impl/SMSOracleServiceImpl.java +++ b/src/main/java/kcc/kccadr/cmm/service/impl/SMSOracleServiceImpl.java @@ -13,7 +13,6 @@ import java.net.URLEncoder; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Random; import javax.annotation.Resource; @@ -32,6 +31,8 @@ import kcc.kccadr.adjreqmgr.service.AdjReqMgrVO; import kcc.kccadr.adjreqmgr.service.impl.AdjReqMgrDAO; import kcc.kccadr.cmm.KccadrConstants; import kcc.kccadr.cmm.service.SMSOracleService; +import kcc.kccadr.message.service.KakaoAtSendDAO; +import kcc.kccadr.message.service.KakaoAtSendVO; import kcc.kccadr.msg.service.impl.MsgMgrDAO; import kcc.let.utl.fcc.service.EgovCryptoUtil; @@ -78,7 +79,10 @@ public class SMSOracleServiceImpl extends EgovAbstractServiceImpl implements SM @Resource(name = "adrSmsLogGnrService") private EgovIdGnrService idgenService; - + + //카카오 알림톡 + @Resource(name = "kakaoAtSendDAO") + private KakaoAtSendDAO kakaoAtSendDAO; // 오라클 연동 테스트 public void selectOracleTest() throws Exception { @@ -123,27 +127,53 @@ public class SMSOracleServiceImpl extends EgovAbstractServiceImpl implements SM String rpplSmsYn = (String) map.get("rpplSmsYn"); String rpplEmailYn = (String) map.get("rpplEmailYn"); - String emailResult = "N"; - if (rpplEmailYn != null && rpplEmailYn.equals("Y") && StringUtil2.isNotEmpty(rpplEmail)) { // 메일 수신여부 -// emailResult = insertEmailSend(map); - } + //전송 수단별 발송여부 + EgovMap sendTypeMap = msgMgrDAO.selectAdrSendType(); + String emailYn = (String) sendTypeMap.get("emailYn"); + String smsYn = (String) sendTypeMap.get("smsYn"); + String alrimtalkYn = (String) sendTypeMap.get("alrimtalkYn"); + + String emailResult = "N"; + + if("Y".equals(emailYn)) { + if (rpplEmailYn != null && rpplEmailYn.equals("Y") && StringUtil2.isNotEmpty(rpplEmail)) { // 메일 수신여부 +// emailResult = insertEmailSend(map); + } + } map.put("emailSendResult", emailResult); - if (rpplSmsYn != null && rpplSmsYn.equals("Y") && StringUtil2.isNotEmpty(rpplPhone)) { // 문자 수신여부 - if (bytes > 90) { - sMSOracleDAO.insertMmsSend(map); // SMS 등록 장문 > SMS DB(오라클) - adjReqMgrDAO.insertAdrMmsSend(map); // SMS 이력 등록 장문 > 전자조정 - } else { - sMSOracleDAO.insertSmsSend(map); // SMS 등록 단문 > SMS DB(오라클) - adjReqMgrDAO.insertAdrSmsSend(map); // SMS 이력 등록 단문 > 전자조정 - } - //sms 발송 관리 테이블에 저장 - msgMgrDAO.insertAdrSmsLog(map); // SMS 이력 등록 단문 > 전자조정 - } else { // 메일만 보낼시 단문테이블에라도 이력 등록 - adjReqMgrDAO.insertAdrSmsSend(map); // SMS 이력 등록 단문 > 전자조정 - //sms 발송 관리 테이블에 저장 - msgMgrDAO.insertAdrSmsLog(map); // SMS 이력 등록 단문 > 전자조정 + if("Y".equals(smsYn)) { + if (rpplSmsYn != null && rpplSmsYn.equals("Y") && StringUtil2.isNotEmpty(rpplPhone)) { // 문자 수신여부 + if (bytes > 90) { + sMSOracleDAO.insertMmsSend(map); // SMS 등록 장문 > SMS DB(오라클) + adjReqMgrDAO.insertAdrMmsSend(map); // SMS 이력 등록 장문 > 전자조정 + } else { + sMSOracleDAO.insertSmsSend(map); // SMS 등록 단문 > SMS DB(오라클) + adjReqMgrDAO.insertAdrSmsSend(map); // SMS 이력 등록 단문 > 전자조정 + } + //sms 발송 관리 테이블에 저장 + msgMgrDAO.insertAdrSmsLog(map); // SMS 이력 등록 단문 > 전자조정 + } else { // 메일만 보낼시 단문테이블에라도 이력 등록 + adjReqMgrDAO.insertAdrSmsSend(map); // SMS 이력 등록 단문 > 전자조정 + //sms 발송 관리 테이블에 저장 + msgMgrDAO.insertAdrSmsLog(map); // SMS 이력 등록 단문 > 전자조정 + } + } + + //카카오 알림톡 DB 저장 + KakaoAtSendVO apiVO = new KakaoAtSendVO(); + + //msgTy별 템플릿 코드 가져오기 + String msgTy = (String) map.get("msgTy"); + String templateCode = msgMgrDAO.selectMsgMgrTemplateCode(msgTy); + + apiVO.setSendTo(rpplPhone); + apiVO.setTemplateCode(templateCode); + apiVO.setMessage(sendMsg); + + if("Y".equals(alrimtalkYn)) { +// kakaoAtSendDAO.insertKakaoAtSendBatch(apiVO); } result = "succ"; @@ -606,6 +636,18 @@ public class SMSOracleServiceImpl extends EgovAbstractServiceImpl implements SM } + //카카오 알림톡 DB 저장 + KakaoAtSendVO apiVO = new KakaoAtSendVO(); + + //msgTy별 템플릿 코드 가져오기 + String msgTy = (String) map.get("msgTy"); + String templateCode = msgMgrDAO.selectMsgMgrTemplateCode(msgTy); + + apiVO.setSendTo(rpplPhone); + apiVO.setTemplateCode(templateCode); + apiVO.setMessage(sendMsg); + + kakaoAtSendDAO.insertKakaoAtSendBatch(apiVO); result = "succ"; diff --git a/src/main/java/kcc/kccadr/kccadrCom/service/impl/KccadrMgrUdtServiceImpl.java b/src/main/java/kcc/kccadr/kccadrCom/service/impl/KccadrMgrUdtServiceImpl.java index 33565430..c5900fcc 100644 --- a/src/main/java/kcc/kccadr/kccadrCom/service/impl/KccadrMgrUdtServiceImpl.java +++ b/src/main/java/kcc/kccadr/kccadrCom/service/impl/KccadrMgrUdtServiceImpl.java @@ -71,8 +71,21 @@ public class KccadrMgrUdtServiceImpl implements KccadrMgrUdtService{ int rs = _updateAdrMgrUdt(adjReqMgrVO, ""); + + // 알림(SMS) 전송 - 운영서버에서만 알림발송이 되도록 처리함 + if ("real".equals(prodIsLocal)) { + //sMSOracleService.selectOracleTest(); // 연동 테스트. 콘솔 로그 확인 + sMSOracleService.insertSmsSend(adjReqMgrVO); + + }else {// 개발서버에서 테스트의 경우 로그만 디비에 기록되도록 수정함 + + sMSOracleService.insertSmsSendLocalTest(adjReqMgrVO); + + } + return rs; + /* // 필수값 체크 if (StringUtil2.isEmpty(adjReqMgrVO.getAdrSeq()) @@ -117,17 +130,6 @@ public class KccadrMgrUdtServiceImpl implements KccadrMgrUdtService{ // } - // 알림(SMS) 전송 - 운영서버에서만 알림발송이 되도록 처리함 -// if ("real".equals(prodIsLocal)) { -// //sMSOracleService.selectOracleTest(); // 연동 테스트. 콘솔 로그 확인 -// sMSOracleService.insertSmsSend(adjReqMgrVO); -// -// }else {// 개발서버에서 테스트의 경우 로그만 디비에 기록되도록 수정함 -// -// sMSOracleService.insertSmsSendLocalTest(adjReqMgrVO); -// -// } - // 조정상태변경 - 비프로세스 인 경우 master에 남기지 않는다. //his에는 남겨야 하기 때문에 해당 process는 태운다. @@ -136,7 +138,6 @@ public class KccadrMgrUdtServiceImpl implements KccadrMgrUdtService{ // }else { // return adjReqMgrDAO.updateAdrMgrMasterStatus(adjReqMgrVO); // } - } @Override diff --git a/src/main/java/kcc/kccadr/message/SchedulerUtil.java b/src/main/java/kcc/kccadr/message/SchedulerUtil.java new file mode 100644 index 00000000..adae3b6b --- /dev/null +++ b/src/main/java/kcc/kccadr/message/SchedulerUtil.java @@ -0,0 +1,89 @@ +package kcc.kccadr.message; + +import java.net.InetAddress; +import java.util.List; + +import javax.annotation.Resource; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import kcc.kccadr.message.service.KakaoAtSendService; +import kcc.kccadr.message.service.KakaoAtSendVO; +import kcc.kccadr.message.web.KakaoAtSendAPI; +import net.javacrumbs.shedlock.core.LockProvider; +import net.javacrumbs.shedlock.core.SchedulerLock; +import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider; +import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; + + +@Service("SchedulerUtil") +@EnableScheduling +@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") // Scheduler Lock 사용 가능 설정 (기본 30초동안 Lock) +public class SchedulerUtil { + + @Value("#{globalSettings['Globals.BizPpurio.siteUrl']}") + private String apiUrl; + + @Value("#{globalSettings['Globals.prod.islocal']}") + private String isLocal; + + @Resource (name = "KakaoAtSendService") + private KakaoAtSendService kakaoAtSendService; + + private static final String ONE_MIN = "PT1M"; // 1분동안 LOCK + + //로컬 테스트용 아이피 허용 + private String myLocalIp = "192.168.0.40"; + + //운영 외부망 WAS1 + private String dmzIp1 = "222.231.43.66"; + //운영 외부망 WAS2 + private String dmzIp2 = "222.231.43.69"; + + //10분마다 실행 + @Scheduled(cron = "0 0/10 * * * *") + @SchedulerLock(name = "kakaoAtSendPrcs", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) + public void kakaoAtSendPrcs() throws Exception { + + String ip = null; + + try { + ip = InetAddress.getLocalHost().getHostAddress(); + + if(ip.equals(myLocalIp) || ip.equals(dmzIp1) || ip.equals(dmzIp2) ) { + //접속 서버 별 분기처리 필요 + + List list = kakaoAtSendService.selectKakaoAtList(); + + int listSize = list.size(); + + for(int i=0; i selectKakaoAtList() throws Exception{ + return (List) list("kakaoAtSendDAO.selectKakaoAtList"); + } + + public void insertKakaoAtSendBatch(KakaoAtSendVO kakaoAtSendVO) throws Exception{ + insert("kakaoAtSendDAO.insertKakaoAtSendBatch", kakaoAtSendVO); + } + + public void updateKakaoAtDetail(KakaoAtSendVO kakaoAtSendVO) throws Exception{ + update("kakaoAtSendDAO.updateKakaoAtDetail", kakaoAtSendVO); + } + +} diff --git a/src/main/java/kcc/kccadr/message/service/KakaoAtSendService.java b/src/main/java/kcc/kccadr/message/service/KakaoAtSendService.java new file mode 100644 index 00000000..6774a394 --- /dev/null +++ b/src/main/java/kcc/kccadr/message/service/KakaoAtSendService.java @@ -0,0 +1,13 @@ +package kcc.kccadr.message.service; + +import java.util.List; + +public interface KakaoAtSendService { + + List selectKakaoAtList() throws Exception; + + void updateKakaoAtDetail(KakaoAtSendVO kakaoAtSendVO) throws Exception; + + void insertKakaoAtSendBatch(KakaoAtSendVO kakaoAtSendVO) throws Exception; + +} diff --git a/src/main/java/kcc/kccadr/message/service/KakaoAtSendVO.java b/src/main/java/kcc/kccadr/message/service/KakaoAtSendVO.java new file mode 100644 index 00000000..460d4033 --- /dev/null +++ b/src/main/java/kcc/kccadr/message/service/KakaoAtSendVO.java @@ -0,0 +1,229 @@ +package kcc.kccadr.message.service; + +public class KakaoAtSendVO { + + //token + private String accessToken; + private String type; + private String expired; + + //공통 + private String sendFrom; + private String sendTo; + private String country; + private String content; + private String refkey; + private String userinfo; + private String resend; + private String recontent; + private String resellercode; + private String sendtime; + + //알림톡 + private String message; + private String senderkey; + private String templateCode; + private String quickreply; + private String title; + private String header; + private String kakaoAtSeq; + private String sendFlag; + private String sendTime; + + //global + private String isLocal; + private String apiUrl; + + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getExpired() { + return expired; + } + + public void setExpired(String expired) { + this.expired = expired; + } + public String getSendFrom() { + return sendFrom; + } + + public void setSendFrom(String sendFrom) { + this.sendFrom = sendFrom; + } + + public String getSendTo() { + return sendTo; + } + + public void setSendTo(String sendTo) { + this.sendTo = sendTo; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getRefkey() { + return refkey; + } + + public void setRefkey(String refkey) { + this.refkey = refkey; + } + + public String getUserinfo() { + return userinfo; + } + + public void setUserinfo(String userinfo) { + this.userinfo = userinfo; + } + + public String getResend() { + return resend; + } + + public void setResend(String resend) { + this.resend = resend; + } + + public String getRecontent() { + return recontent; + } + + public void setRecontent(String recontent) { + this.recontent = recontent; + } + + public String getResellercode() { + return resellercode; + } + + public void setResellercode(String resellercode) { + this.resellercode = resellercode; + } + + public String getSendtime() { + return sendtime; + } + + public void setSendtime(String sendtime) { + this.sendtime = sendtime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getSenderkey() { + return senderkey; + } + + public void setSenderkey(String senderkey) { + this.senderkey = senderkey; + } + + public String getTemplateCode() { + return templateCode; + } + + public void setTemplateCode(String templateCode) { + this.templateCode = templateCode; + } + + public String getQuickreply() { + return quickreply; + } + + public void setQuickreply(String quickreply) { + this.quickreply = quickreply; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getHeader() { + return header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getIsLocal() { + return isLocal; + } + + public void setIsLocal(String isLocal) { + this.isLocal = isLocal; + } + + public String getApiUrl() { + return apiUrl; + } + + public void setApiUrl(String apiUrl) { + this.apiUrl = apiUrl; + } + + public String getKakaoAtSeq() { + return kakaoAtSeq; + } + + public void setKakaoAtSeq(String kakaoAtSeq) { + this.kakaoAtSeq = kakaoAtSeq; + } + + public String getSendFlag() { + return sendFlag; + } + + public void setSendFlag(String sendFlag) { + this.sendFlag = sendFlag; + } + + public String getSendTime() { + return sendTime; + } + + public void setSendTime(String sendTime) { + this.sendTime = sendTime; + } + +} diff --git a/src/main/java/kcc/kccadr/message/service/impl/KakaoAtSendServiceImpl.java b/src/main/java/kcc/kccadr/message/service/impl/KakaoAtSendServiceImpl.java new file mode 100644 index 00000000..21749ab5 --- /dev/null +++ b/src/main/java/kcc/kccadr/message/service/impl/KakaoAtSendServiceImpl.java @@ -0,0 +1,38 @@ +package kcc.kccadr.message.service.impl; + + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import kcc.kccadr.message.service.KakaoAtSendDAO; +import kcc.kccadr.message.service.KakaoAtSendService; +import kcc.kccadr.message.service.KakaoAtSendVO; + +@Service("KakaoAtSendService") +public class KakaoAtSendServiceImpl implements KakaoAtSendService { + + @Resource(name = "kakaoAtSendDAO") + private KakaoAtSendDAO kakaoAtSendDAO; + + @Override + public List selectKakaoAtList() throws Exception { + return kakaoAtSendDAO.selectKakaoAtList(); + } + + @Override + public void insertKakaoAtSendBatch(KakaoAtSendVO kakaoAtSendVO) throws Exception { + kakaoAtSendDAO.insertKakaoAtSendBatch(kakaoAtSendVO); + } + + + @Override + public void updateKakaoAtDetail(KakaoAtSendVO kakaoAtSendVO) throws Exception { + kakaoAtSendDAO.updateKakaoAtDetail(kakaoAtSendVO); + } + + + +} diff --git a/src/main/java/kcc/kccadr/message/web/KakaoAtSendAPI.java b/src/main/java/kcc/kccadr/message/web/KakaoAtSendAPI.java new file mode 100644 index 00000000..cd4f0ba9 --- /dev/null +++ b/src/main/java/kcc/kccadr/message/web/KakaoAtSendAPI.java @@ -0,0 +1,215 @@ +package kcc.kccadr.message.web; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Base64; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.json.JSONObject; + +import kcc.kccadr.message.service.KakaoAtSendVO; + + + +/** + * @Class Name : KakaoAtSendAPI.java + * @Description : 카카오알림톡 API Class + * @Modification Information + * @ + * @ 수정일 수정자 수정내용 + * @ --------- --------- ------------------------------- + * @ 2022.11.29 안주영 최초생성 + * + * @author An Joo Young + * @version 1.0 + * @see + * + * + */ + +public class KakaoAtSendAPI{ + + private static KakaoAtSendAPI bizPpurioAPI = null; + + private String tokenUrl = "/v1/token"; + private String msgUrl = "/v3/message"; + + private String senderkey = "b734cce3d7e2349286ea2ab70804bcb2283facb5"; + + private String input = null; + + StringBuffer result = null; + + URL url = null; + + KakaoAtSendVO vo = new KakaoAtSendVO(); + + + //비즈뿌리오 계정 + private static String BIZPPURIO_ACCOUNT = "adr_copyright"; + + private static String BIZPPURIO_ACCOUNT_PASSWORD = "Copy0723!"; + + + // Token 발행 + private String getAccessToken(String isLocal, String apiUrl) { + + result = new StringBuffer(); + String token = ""; + + try { + + /** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/ + if(!"real".equals(isLocal)) { + TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } } }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + url = new URL(apiUrl + tokenUrl); + + /** Connection 설정 **/ + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Accept-Charset", "UTF-8"); + + //Base64 인코딩 + String idpw = BIZPPURIO_ACCOUNT + ":" + BIZPPURIO_ACCOUNT_PASSWORD; + String authData = Base64.getEncoder().encodeToString(idpw.getBytes()); + + connection.addRequestProperty("Authorization", "Basic " + authData); + + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setConnectTimeout(15000); + + /** Request **/ + OutputStream os = connection.getOutputStream(); + os.flush(); + + + /** Response **/ + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); + + while ((input = in.readLine()) != null) { + result.append(input); + } + connection.disconnect(); + +// System.out.println("Response : " + result.toString()); + + JSONObject jObject = new JSONObject(result.toString()); + token = jObject.getString("accesstoken"); + + } catch (IOException e) { + // TODO Auto-generated catch block + } catch (KeyManagementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return token; + } + + public String sendMessage(KakaoAtSendVO vo, String isLocal, String apiUrl) { + + vo.setAccessToken(getAccessToken(isLocal,apiUrl)); + String status = ""; + + result = new StringBuffer(); + + try { + + /** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/ + if(!"real".equals(isLocal)) { + TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } } }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + url = new URL(apiUrl + msgUrl); + + /** Connection 설정 **/ + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Accept-Charset", "UTF-8"); + connection.addRequestProperty("Authorization", "Bearer " + vo.getAccessToken()); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setConnectTimeout(15000); + + + /** Request **/ + OutputStream os = connection.getOutputStream(); + + String at = "{\"account\":\""+BIZPPURIO_ACCOUNT+"\",\"refkey\":\"1234\"," + + "\"type\":\"at\",\"from\":\"0226690044\",\"to\":\""+vo.getSendTo()+"\"," + + "\"content\":{\"at\":{\"senderkey\":\""+ senderkey +"\",\"templatecode\":\""+vo.getTemplateCode()+"\",\"message\":\""+vo.getMessage()+"\"}}}"; + + os.write(at.getBytes("UTF-8")); + os.flush(); + + /** Response **/ + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); + while ((input = in.readLine()) != null) { + result.append(input); + } + connection.disconnect(); + + System.out.println("Response : " + result.toString()); + + JSONObject jObject = new JSONObject(result.toString()); + status = jObject.getString("description"); + + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (KeyManagementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return status; + } + + public static KakaoAtSendAPI getInstance() + { + if(bizPpurioAPI==null) + { + bizPpurioAPI = new KakaoAtSendAPI(); + } + return bizPpurioAPI; + } + + private KakaoAtSendAPI() {} + +} diff --git a/src/main/java/kcc/kccadr/message/web/KakaoAtSendController.java b/src/main/java/kcc/kccadr/message/web/KakaoAtSendController.java new file mode 100644 index 00000000..d8f36753 --- /dev/null +++ b/src/main/java/kcc/kccadr/message/web/KakaoAtSendController.java @@ -0,0 +1,58 @@ +package kcc.kccadr.message.web; + +import java.util.List; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import kcc.kccadr.message.service.KakaoAtSendService; +import kcc.kccadr.message.service.KakaoAtSendVO; +import kcc.kccadr.msg.service.MsgMgrService; + +@Controller +public class KakaoAtSendController { + + // 발송문구 관리 서비스단 + @Resource(name = "MsgMgrService") + private MsgMgrService msgMgrService; + + @Resource (name = "KakaoAtSendService") + private KakaoAtSendService kakaoAtSendService; + + @Value("#{globalSettings['Globals.BizPpurio.siteUrl']}") + private String apiUrl; + + @Value("#{globalSettings['Globals.prod.islocal']}") + private String isLocal; + + + /** + * 알림톡 배치 수동 실행 + */ + @RequestMapping(value = "/kccadr/message/kakaoAtSendPrcsTest.do") + public ModelAndView kakaoAtSendPrcsTest(HttpServletRequest request) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + List list = kakaoAtSendService.selectKakaoAtList(); + + int listSize = list.size(); + + for(int i=0; i + + + + + diff --git a/src/main/resources/egovframework/sqlmap/kccadr/message/KakaoAtSend_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/kccadr/message/KakaoAtSend_SQL_Mysql.xml new file mode 100644 index 00000000..0b5d47e1 --- /dev/null +++ b/src/main/resources/egovframework/sqlmap/kccadr/message/KakaoAtSend_SQL_Mysql.xml @@ -0,0 +1,53 @@ + + + + + + + + + INSERT INTO adr_kakao_at_batch + ( + template_code + ,send_to + ,message + ) + VALUES + ( + #templateCode# + ,#sendTo# + ,#message# + + ) + + + + + + + + + + UPDATE + adr_kakao_at_batch + SET + send_flag = 'Y' + ,send_time = NOW() + WHERE + kakao_at_seq = #kakaoAtSeq# + + + + diff --git a/src/main/resources/egovframework/sqlmap/kccadr/msg/Msg_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/kccadr/msg/Msg_SQL_Mysql.xml index ec9698ef..c905ff1c 100644 --- a/src/main/resources/egovframework/sqlmap/kccadr/msg/Msg_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/kccadr/msg/Msg_SQL_Mysql.xml @@ -31,7 +31,8 @@ FRST_REGISTER_ID AS frstRegisterId, TO_CHAR ( FRST_REGIST_PNTTM, 'YYYY/MM/DD' ) AS frstRegistPnttm, TO_CHAR ( LAST_UPDT_PNTTM, 'YYYY/MM/DD' ) AS lastUpdtPnttm, - LAST_UPDUSR_ID AS lastUpdusrId + LAST_UPDUSR_ID AS lastUpdusrId, + TEMPLATE_CODE AS templateCode FROM ADR_MSG_MGR WHERE 1=1 @@ -60,12 +61,24 @@ FRST_REGISTER_ID AS frstRegisterId, FRST_REGIST_PNTTM AS frstRegistPnttm, LAST_UPDT_PNTTM AS lastUpdtPnttm, - LAST_UPDUSR_ID AS lastUpdusrId + LAST_UPDUSR_ID AS lastUpdusrId, + TEMPLATE_CODE AS templateCode FROM ADR_MSG_MGR WHERE MSG_SEQ = #msgSeq# + + + @@ -262,4 +275,13 @@ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/kccadr/adjReqMgrPast/adjReqMgrPastBasicRegist.jsp b/src/main/webapp/WEB-INF/jsp/kccadr/adjReqMgrPast/adjReqMgrPastBasicRegist.jsp index 4f4fc177..259e8817 100644 --- a/src/main/webapp/WEB-INF/jsp/kccadr/adjReqMgrPast/adjReqMgrPastBasicRegist.jsp +++ b/src/main/webapp/WEB-INF/jsp/kccadr/adjReqMgrPast/adjReqMgrPastBasicRegist.jsp @@ -1506,6 +1506,10 @@ function fn_btnLoad(adrSeq){
" />
+ +
" method="post"> + +
diff --git a/src/main/webapp/js/kccadr/adjReqMgrPast/event.js b/src/main/webapp/js/kccadr/adjReqMgrPast/event.js index 385f2921..64f14e80 100644 --- a/src/main/webapp/js/kccadr/adjReqMgrPast/event.js +++ b/src/main/webapp/js/kccadr/adjReqMgrPast/event.js @@ -121,6 +121,7 @@ function openExampleAdminPop(exmpCd) { } + if(reqPerTotCnt >= 5){ alert("피신청인은 최대 5명까지 등록이 가능합니다."); @@ -145,10 +146,10 @@ function openExampleAdminPop(exmpCd) { onKeyUpBizNo($("[name='adjReqMgrVoList["+ num +"].rpplBizNo']")); // 개인사업자번호 자동맞춤 //추가 피신청인 카운트 늘려주기 - $('#reqPerTotCnt').val(reqPerTotCnt + 1); + $('#reqPerTotCnt').val(reqPerTotCnt); } - + }); diff --git a/src/main/webapp/js/kccadr/adjReqMgrPast/init.js b/src/main/webapp/js/kccadr/adjReqMgrPast/init.js index 28271b67..697e7a88 100644 --- a/src/main/webapp/js/kccadr/adjReqMgrPast/init.js +++ b/src/main/webapp/js/kccadr/adjReqMgrPast/init.js @@ -18,8 +18,13 @@ - var reqTy = ''; // 조정신청 유형 - var rpplTy = ''; // 조정신청 대상 +// var reqTy = ''; // 조정신청 유형 +// var rpplTy = ''; // 조정신청 대상 + var reqTy = $('input[name=reqTy]:checked').val();; // 조정신청 유형 + var rpplTy = $('input[name=rpplTy]:checked').val();; // 조정신청 유형 + + console.log('reqTy : ', reqTy); + console.log('rpplTy : ', rpplTy); //대리인 정보 처리해주기 if (rpplTy == "30") { diff --git a/src/main/webapp/js/kccadr/adjReqMgrPast/value.js b/src/main/webapp/js/kccadr/adjReqMgrPast/value.js index 5f6765a1..cf84b6b9 100644 --- a/src/main/webapp/js/kccadr/adjReqMgrPast/value.js +++ b/src/main/webapp/js/kccadr/adjReqMgrPast/value.js @@ -402,8 +402,8 @@ $(".popBtnChk").text("수정"); $(".popBtn").show(); - - fn_btnLoad(data.dataSub); + fn_goDetail(data.dataSub); +// fn_btnLoad(data.dataSub); // $('#nextGoPageForm').submit(); } else if(data.status == 'Unauthorized' || data.status == 'BAD_REQUEST') @@ -415,4 +415,13 @@ }); } - } \ No newline at end of file + } + + + function fn_goDetail(adrSeq){ + + var goForm = document.goForm; + goForm.adrSeq.value = adrSeq; + goForm.submit(); + } + \ No newline at end of file