Compare commits

...

1043 Commits

Author SHA1 Message Date
hehihoho3@gmail.com
3a3867558e 5858 사이트맵 수정 2025-12-05 14:05:29 +09:00
hehihoho3@gmail.com
89aa2f99ab Merge branch 'api_advc' 2025-12-03 14:00:44 +09:00
hehihoho3@gmail.com
3341a8ce51 api 다운로드 URL 수정 샘플_예지_e2 -> r3 2025-12-03 14:00:38 +09:00
hehihoho3@gmail.com
5da092f832 Merge branch 'api_advc' 2025-12-03 12:53:40 +09:00
hehihoho3@gmail.com
d9ee601c42 5585 관련 api 정보에서 친구톡 제거 2025-12-03 12:53:33 +09:00
hehihoho3@gmail.com
4fdb8c7811 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-12-01 11:15:10 +09:00
subsub
60af9f69dc 안드로이드 문구 갤럭시로 수정 2025-11-11 15:48:15 +09:00
subsub
dc441de569 (사용자) 폰주소록 등록 > 핸드폰 > 아이폰 추가 2025-11-11 15:24:30 +09:00
hehihoho3@gmail.com
b1a75f98ec 수신번호 하이픈 제거 2025-11-07 12:41:55 +09:00
hehihoho3@gmail.com
9ee68ddb1b 엑셀다운로드 web api 오류 수정 2025-11-06 15:07:18 +09:00
hehihoho3@gmail.com
d95ee87570 Merge branch 'master' into api_advc 2025-10-30 14:40:20 +09:00
hehihoho3@gmail.com
e0ac062274 카톡발송결과_수신자번호검색추가 2025-10-30 14:24:47 +09:00
hehihoho3@gmail.com
f1f610d0e8 Merge branch 'at_emoji' 2025-10-29 14:06:34 +09:00
hehihoho3@gmail.com
dfa0306189 Merge branch '5128_발송결과_리스트_내_수신번호_검색' 2025-10-29 14:05:26 +09:00
hehihoho3@gmail.com
11c9136f56 발송결과 수신번호 검색 2025-10-29 14:05:07 +09:00
hehihoho3@gmail.com
61ff9702bf jdbc url 수정 2025-10-28 15:04:21 +09:00
hehihoho3@gmail.com
01163c21df 알림톡 이모지 추가 2025-10-28 10:40:08 +09:00
subsub
7663b6f082 맞춤제작 요청 팝업 안내문구 추가, 제공방법 카카오톡 문구 문자로 변경 2025-10-27 11:34:23 +09:00
hehihoho3@gmail.com
3f68d808b4 api 예제 다운로드 링크 수정 2025-10-22 10:06:51 +09:00
hehihoho3@gmail.com
419c13528c 예제 다운로드 퍼블 수정 2025-10-22 10:02:54 +09:00
hehihoho3@gmail.com
324767d86d api 예제 다운로드 수정 2025-10-22 09:46:12 +09:00
hehihoho3@gmail.com
aee4527d18 시큐리티.xml 머지 완료 2025-10-22 09:36:19 +09:00
hehihoho3@gmail.com
c4107dd459 Merge branch 'cert_owner_name' 2025-10-17 18:44:34 +09:00
hehihoho3@gmail.com
5242047745 발신번호 인증 이름 2025-10-17 17:44:08 +09:00
fd7112cef8 구버전 본인인증 jar 삭제 2025-10-17 16:32:12 +09:00
hehihoho3@gmail.com
62e6fe53d8 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-17 15:29:16 +09:00
hehihoho3@gmail.com
e48922754c 카카오톡 환불 sql에 FORCE index (IDX_MJ_MSG_DATA_13) 임시 추가 2025-10-17 15:29:09 +09:00
hehihoho3@gmail.com
7e06e08294 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-17 11:29:48 +09:00
708aca25bc 카톡 환불 메소드 주기 수정 runKakaoOneTime
//	@Scheduled(cron = "0 0/3 * * * ?") 	// 3분마다 실행
	@Scheduled(cron = "0 0 0/2 * * ?") // 매시간 정각마다 실행
2025-10-17 11:29:40 +09:00
hehihoho3@gmail.com
21e0d52168 친구톡,알림톡 at_smishing_yn 데이터 null 방지 추가 2025-10-16 10:22:30 +09:00
hehihoho3@gmail.com
321bb9adeb 동보문자도 오픈 2025-10-15 18:15:02 +09:00
hehihoho3@gmail.com
523522cdd9 선거문자 임시 오픈 2025-10-15 17:50:58 +09:00
hehihoho3@gmail.com
9764781c22 Merge branch 'api_advc' of
http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into api_advc
2025-10-15 17:45:41 +09:00
hehihoho3@gmail.com
31df8725ef [임시]선거문자 접근 IP 개발서버 활성화 2025-10-15 17:44:42 +09:00
hehihoho3@gmail.com
ef7d42b187 [임시]선거문자 접근 IP 개발서버 활성화 2025-10-15 17:37:23 +09:00
hehihoho3@gmail.com
d41c503de7 Merge branch 'master' into 알림톡api 2025-10-15 10:55:33 +09:00
c1d1913882 Merge branch 'master' of http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git 2025-10-13 10:44:08 +09:00
12eaff7979 Merge branch '4608_kmc암호화모듈' into master_tolag3 2025-10-13 10:27:13 +09:00
JIWOO
f1d93cfa14 이지우 - 채널명(발신프로필) 조인 원복 2025-09-29 14:12:58 +09:00
JIWOO
f2e5c4c608 Merge branch 'master' into 카카오톡_발신프로필 2025-09-24 15:46:55 +09:00
JIWOO
f9b34066d4 이지우 - 발신프로필 중복 등록 시 alert 문구 변경 2025-09-24 15:46:04 +09:00
JIWOO
be056b1b9e 이지우 - 사용자 카카오톡 발신프로필 등록 로직 변경 2025-09-19 11:24:23 +09:00
d5425fc8de Merge branch 'master_tolag3' 2025-09-18 11:06:31 +09:00
83a5d12869 /web/user/login/usrIdCheckAjax.do
무차별대입 공격대응
2025-09-18 11:06:12 +09:00
4d04091eb7 /web/user/login/usrIdCheckAjax.do 2025-09-18 11:04:39 +09:00
hehihoho3@gmail.com
0b384934e5 api 개발가이드 완료 2025-09-16 18:26:24 +09:00
0377e75ebf http://pms.iten.co.kr:9999/issues/5419#note-10
수정
2025-09-16 12:23:09 +09:00
96583304ec 발송 기준 수정 2025-09-11 17:58:32 +09:00
hehihoho3@gmail.com
9f14958357 알림톡 스미싱오류 2025-09-11 15:26:48 +09:00
JIWOO
8edded03fb 이지우 - 사용자 > 요금 사용내역 > 검색 3개월 제한 제거 / 사용내역서 팩스 td 수정 2025-09-10 18:35:50 +09:00
ac0a3fb907 Merge branch '5419_전화번호거짓표시50건이상' into 4608_kmc암호화모듈 2025-09-10 14:53:45 +09:00
hehihoho3@gmail.com
5d6934e311 Merge branch 'master' into 알림톡api 2025-09-10 14:32:57 +09:00
hehihoho3@gmail.com
2854de838a 발송 시 MSG_RESULT 필드에 00 insert 추가 2025-09-10 14:31:45 +09:00
hehihoho3@gmail.com
d201592372 api 사용가이드 작성중 2025-09-10 14:12:43 +09:00
94c13d02ea 사용자 발송결과 > 수신번호 검색자 추가 2025-09-10 12:38:11 +09:00
bfe5f333f9 git ignore 추가 2025-09-10 11:19:15 +09:00
f4ae2dcf53 Merge branch 'master' into 4608_kmc암호화모듈 2025-09-10 11:17:55 +09:00
6f822ffa67 Merge branch 'master' into 5419_전화번호거짓표시50건이상
개발시 사용한 sysout 삭제
2025-09-10 11:13:02 +09:00
6460d95b8c Merge branch 'master' into 5419_전화번호거짓표시50건이상 2025-09-10 11:04:56 +09:00
fff68682bd 50건이상 발송시 안내문자 발송 관리자 on/off기능 추가 2025-09-10 11:03:50 +09:00
subsub
07088040fb Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-09-09 12:38:42 +09:00
subsub
db7ba618d2 요금안내 친구톡 추가 2025-09-09 12:38:23 +09:00
JIWOO
f4c137a8c7 Merge branch '알림톡api' of http://dlwldn1024@vcs.iten.co.kr:9999/hylee/mjon_git into 알림톡api 2025-09-09 09:43:59 +09:00
hehihoho3@gmail.com
715ec569d1 Merge branch 'master' into 알림톡api 2025-09-03 15:05:10 +09:00
JIWOO
b7dc7f29ae 이지우 - 개발DB 주소 변경(운영과 동일한 버전의 mariaDB) 2025-09-03 14:15:33 +09:00
hehihoho3@gmail.com
c1defb3498 api 친구톡 완료 2025-09-03 11:44:43 +09:00
JIWOO
add6ea80b1 이지우 - API 소개 페이지 작업 중 2025-09-03 09:32:29 +09:00
hehihoho3@gmail.com
054ee00b6d api 친구톡 연동 진행중 2025-09-01 16:52:51 +09:00
c664e67c59 [KISA] 전화번호 거짓표시 금지 고시 개정 관련 "대량문자 발송안내 서비스" 시스템 적용 요청
http://pms.iten.co.kr:9999/issues/5419
2025-08-29 18:03:47 +09:00
subsub
3a68edcd1b 요금 사용내역 > 친구톡 팝업 레이아웃 수정 2025-08-28 09:53:56 +09:00
JIWOO
4a68901454 이지우 - 사용자 > 요금사용내역 > 상세보기 팝업 > 대체문자 화면 수정 2025-08-27 18:10:36 +09:00
JIWOO
c2f09e6304 이지우 - 사용자 > 요금사용내역 > 친구톡 대체문자 화면 수정 2025-08-27 17:59:57 +09:00
JIWOO
b3d0419100 이지우 - 사용자 알림톡/친구톡 발송결과 상세화면 미리보기, 요금사용내역 상세보기 팝업 수정 2025-08-27 16:28:27 +09:00
3dc2bb67d9 kmc 암호화모듈 개발완료
http://pms.iten.co.kr:9999/issues/4608
2025-08-26 09:28:44 +09:00
hehihoho3@gmail.com
64818ff86d Merge branch '5102_친구톡_발송속도_개선' 2025-08-25 12:11:36 +09:00
hehihoho3@gmail.com
39f63e611b Merge branch '5102_친구톡_발송속도_개선' 2025-08-25 11:30:16 +09:00
b63aad38d2 기존 jar 삭제 2025-08-25 11:07:42 +09:00
7374d2b65d kmc 본인인증 암호화 모듈 개발중 2025-08-25 11:03:20 +09:00
hehihoho3@gmail.com
03644f7743 친구톡 스팸데이터 체크 2025-08-25 10:34:02 +09:00
JIWOO
934bb68f70 Merge branch 'master' of http://dlwldn1024@vcs.iten.co.kr:9999/hylee/mjon_git 2025-08-22 16:55:52 +09:00
JIWOO
7af9d5db72 Merge branch '5401_배포전테스트' 2025-08-22 16:55:16 +09:00
hehihoho3@gmail.com
5d97616c45 Merge branch '5102_친구톡_발송속도_개선' 2025-08-22 16:55:12 +09:00
hehihoho3@gmail.com
efbadbd71c 친구톡 스팸 체크 필터 수정 #5418 2025-08-22 16:54:55 +09:00
JIWOO
fc04270a9c 이지우 - 사용자 발송결과 > 카카오톡 미리보기 수정 2025-08-22 16:54:32 +09:00
hehihoho3@gmail.com
74cf3443fd Merge branch '5102_친구톡_발송속도_개선' 2025-08-22 15:47:42 +09:00
hehihoho3@gmail.com
64e451db1b 친구톡 스미싱처리 2025-08-22 15:46:58 +09:00
hehihoho3@gmail.com
3da88224f7 ignore 추가 2025-08-22 10:38:44 +09:00
JIWOO
07d6d01de1 이지우 - 친구톡 소개 페이지 문구 볼드 변경 2025-08-21 18:24:02 +09:00
hehihoho3@gmail.com
587f9593d9 전용계좌 입금 시 기업/개인 모두 스미싱 의심 온 + at 추가 2025-08-21 17:39:50 +09:00
hehihoho3@gmail.com
9b5d833ca5 ignore 추가 2025-08-21 17:32:15 +09:00
hehihoho3@gmail.com
317271f246 기업/개인회원 모두 스미싱 의심회원으로 수정 2025-08-21 17:32:02 +09:00
JIWOO
715cec51a5 이지우 - 사용자 친구톡 소개 페이지 생성 2025-08-21 17:01:21 +09:00
hehihoho3@gmail.com
3611dc59f0 알림톡 발송 api 진행중 2025-08-21 15:11:03 +09:00
JIWOO
73e5a05114 Merge branch 'master' of http://dlwldn1024@vcs.iten.co.kr:9999/hylee/mjon_git 2025-08-20 15:00:27 +09:00
JIWOO
25ed816a97 이지우 - 사용자 > 결제관리 > 요금 사용내역 > 친구톡 상세 팝업 > 대체문자에 첨부파일 추가 2025-08-20 15:00:13 +09:00
JIWOO
8db8aaf001 이지우 - 사용자 > 결제관리 > 요금 사용내역 > 알림톡, 친구톡 상세 팝업 수정 2025-08-20 14:54:14 +09:00
hehihoho3@gmail.com
b647c71763 ignore 추가 2025-08-20 12:41:29 +09:00
hehihoho3@gmail.com
a857fdfd8c 사이트맵 친구톡 추가 2025-08-20 12:41:12 +09:00
hehihoho3@gmail.com
93cb46a69e 알ㄹ미톡 로그 추가 2025-08-20 12:35:15 +09:00
JIWOO
4dd7d36bda 이지우 - 사용자 > 결제관리 > 요금사용내역에 친구톡 탭 추가 2025-08-20 12:09:11 +09:00
JIWOO
3e8a488f39 이지우 - 사용자 사용내역서 재수정 2025-08-20 11:19:51 +09:00
JIWOO
dddb12d677 이지우 - 사용자 사용내역서 내 비용에 소수점 한자리까지 노출되게 변경 2025-08-20 10:51:55 +09:00
JIWOO
35e7bd1d3a 이지우 - 친구톡 메뉴 노출 조건 삭제 2025-08-19 12:44:16 +09:00
JIWOO
bbf5bf2d01 Merge branch '5361_알림톡_환불수정' 2025-08-19 10:16:13 +09:00
JIWOO
846c6cec4a Merge branch '5361_알림톡_환불수정' 2025-08-19 10:00:22 +09:00
hehihoho3@gmail.com
314a9421e5 Merge branch 'master' into 알림톡api 2025-08-18 18:55:06 +09:00
hehihoho3@gmail.com
a8d0e123d4 Merge branch '5102_친구톡_발송속도_개선' 2025-08-18 18:53:15 +09:00
hehihoho3@gmail.com
4656be6275 Merge branch '5102_친구톡_발송속도_개선' 2025-08-18 18:45:41 +09:00
hehihoho3@gmail.com
ce5f79fa34 알림톡 api 진행중 2025-08-18 18:45:28 +09:00
2e9cdec24e nice pay
kmc 본인인증
샘플 페이지 접근 불가능한 경로로 이동
2025-08-18 15:55:16 +09:00
JIWOO
573a019b4b 이지우 - 카카오 환불 오류 시 슬랙 알림 추가 2025-08-18 11:45:55 +09:00
JIWOO
91a2e68ee5 이지우 - 카카오 환불 스케줄러 ON 2025-08-14 18:28:30 +09:00
JIWOO
2e09169d12 이지우 - 환불 스케줄러 소스 정리 2025-08-14 18:24:25 +09:00
JIWOO
80b97b167a 이지우 - 환불 스케줄러 소스 정리 및 스케줄러 임시 차단 2025-08-14 18:22:06 +09:00
JIWOO
4b81b2ee5a 이지우 - 스케줄유틸 오타 수정 2025-08-14 17:01:05 +09:00
JIWOO
dbc1f2335a 이지우 - 카카오 환불 수정. 트랜잭션 분리를 위하여 스케줄 Util에서 반복문으로 처리 2025-08-14 16:56:37 +09:00
JIWOO
28f520c8fa 이지우 - 카카오 환불 스케줄러 주석 후 URL 호출 테스트 작업 2025-08-13 10:38:36 +09:00
JIWOO
b7469a4c8e 이지우 - 알림톡/친구톡 환불 테스트 완료 및 스케줄러 적용 2025-08-12 17:01:07 +09:00
a53b2e0805 [사용자] 문자전송 > 주소록에 등록 시 기존 휴대폰번호 중복 정제 불가 및 등록속도 관련 확인요청
http://pms.iten.co.kr:9999/issues/5374
2025-08-11 15:28:34 +09:00
JIWOO
9384b6776c Merge branch '5102_친구톡_발송속도_개선' into 5361_알림톡_환불수정 2025-08-08 12:46:43 +09:00
JIWOO
c3a5062b05 이지우 - 알림톡, 친구톡 환불 통합 처리 완료 2025-08-08 12:44:19 +09:00
d299490086 Merge branch 'master_tolag3' 2025-08-08 09:47:44 +09:00
c081e37600 [사용자] 이용정지 회원 로그인 시 안내 내용 일부 제거
http://pms.iten.co.kr:9999/issues/5388
2025-08-08 09:47:23 +09:00
JIWOO
fd550ea580 Merge branch '5175_마이페이지_및_결제' 2025-08-08 09:36:16 +09:00
JIWOO
04baef51bb 이지우 - 헤더 보유잔액 부분 수정 2025-08-07 17:52:37 +09:00
JIWOO
7aa3476113 이지우 - 상단 보유잔액 충전 영역 간격 수정 2025-08-07 17:21:08 +09:00
JIWOO
47b8d7668a 이지우 - 사용내역 내 알림톡 상세 팝업 수정 2025-08-07 17:12:15 +09:00
JIWOO
b7a05daf5b Merge branch 'master' into 5175_마이페이지_및_결제 2025-08-07 15:34:01 +09:00
hehihoho3@gmail.com
05f13875bd Merge branch '5102_친구톡_발송속도_개선' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into 5102_친구톡_발송속도_개선 2025-08-07 12:51:10 +09:00
hehihoho3@gmail.com
d9f34eee53 친구톡 템플릿 불러오기 후 새고고침 -> 페이지 이동 친구톡 2025-08-07 12:50:53 +09:00
acd01e5651 친구톡 > 발송결과 상세
- 친구톡 발송요금이 리스트와 상이한 오류 수정
  - 대체문자 발송요금이 리스트와 상이한 오류 수정
2025-08-07 12:32:45 +09:00
hehihoho3@gmail.com
8c3e518410 친구톡 버튼명 순차적용 완료 2025-08-07 12:11:23 +09:00
JIWOO
cfbf2cc88e Merge branch 'master' into 5180_요금사용내역_및_결제내역 2025-08-07 11:19:15 +09:00
JIWOO
a3b1153049 이지우 - 환불 로직 중 null 체크 관련 오류 수정 2025-08-07 11:14:52 +09:00
JIWOO
c80bf91d85 이지우 - 알림톡 환불 프로세스 수정 및 친구톡 환불과 통합 작업 중 2025-08-06 18:20:27 +09:00
hehihoho3@gmail.com
5639c5e910 대체문자 타입별 화면 수정 2025-08-06 09:50:59 +09:00
hehihoho3@gmail.com
9bb130f3df Merge branch 'master' into 알림톡api 2025-08-04 12:40:45 +09:00
subsub
04aefabdee api 사용안내 코드 강조 플러그인 추가(/publish/js/highlight) 2025-08-04 12:39:37 +09:00
hehihoho3@gmail.com
591dfcbf52 Merge branch 'master' into 알림톡api 2025-08-04 12:39:29 +09:00
subsub
252c6655f7 api 사용안내 친구톡 탭 추가 2025-08-01 14:54:11 +09:00
subsub
7e5f744d23 API 사용안내 > 친구톡 탭 추가 2025-08-01 14:44:38 +09:00
JIWOO
5966ff97f0 Merge branch 'master' into 5180_요금사용내역_및_결제내역 2025-07-30 15:57:42 +09:00
JIWOO
b89f6af826 이지우 - 검색 기간 제한 함수 수정 2025-07-30 15:57:10 +09:00
hehihoho3@gmail.com
d1e1244cd5 친구톡 테스트 번호 삭제 및 imgLink 추가 2025-07-30 09:55:45 +09:00
JIWOO
262f7730a2 Merge branch 'master' into 5175_마이페이지_및_결제 2025-07-30 09:53:39 +09:00
JIWOO
4480ad4c27 이지우 - 사용자 헤더 영역에 단가 및 발송가능 건수 내용 추가 2025-07-30 09:52:28 +09:00
hehihoho3@gmail.com
49d01ac119 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-07-30 09:33:57 +09:00
hehihoho3@gmail.com
3e5e483d18 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-07-29 18:13:14 +09:00
hehihoho3@gmail.com
cec731273a 친구톡 발송상세 이미지 간격 수정 2025-07-29 18:12:57 +09:00
subsub
dca9f92781 무료거부 텍스트 추가 2025-07-29 18:05:17 +09:00
subsub
070315b1b0 Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-07-29 17:58:38 +09:00
subsub
22eb1975d5 친구톡 템플릿 선택 팝업 템플릿 없을 경우 추가 2025-07-29 17:58:30 +09:00
hehihoho3@gmail.com
786ddecd14 ignore 커밋 2025-07-29 17:50:26 +09:00
hehihoho3@gmail.com
95707e8965 알림톡 api 진행중 2025-07-29 17:46:53 +09:00
JIWOO
ebeddf452a Merge branch 'master' into 5175_마이페이지_및_결제 2025-07-29 12:48:37 +09:00
440c58329c Merge branch 'master_tolag3' 2025-07-29 11:28:44 +09:00
d7845ca4a0 NICE페이먼츠 도메인 인증서 G2 통신 테스트 2025-07-29 11:28:15 +09:00
subsub
1f8982d1d6 header 보유잔액 호버 시 이벤트 잔액 추가 2025-07-29 11:09:52 +09:00
hehihoho3@gmail.com
b891d82ad1 친구톡 , 버튼 , 이미지 링크 수정 2025-07-28 17:47:14 +09:00
JIWOO
b8f2aeadb2 이지우 - (기업회원) 마이페이지 > 회원정보 변경 > 이메일 필수 alert 문구 수정 2025-07-28 17:23:34 +09:00
JIWOO
8425bb72c1 Merge branch 'master' into 5180_요금사용내역_및_결제내역 2025-07-28 16:46:29 +09:00
JIWOO
0d88276068 이지우 - 사용자 > 결제관리 > 요금 결제내역/요금 사용내역 수정 2025-07-28 16:45:49 +09:00
hehihoho3@gmail.com
f82f1776ab json문자열 수정 2025-07-28 15:52:49 +09:00
hehihoho3@gmail.com
a2468cb18b 친구톡 json 문자열 생성 개선 2025-07-28 15:51:08 +09:00
hehihoho3@gmail.com
86d94c545d 친구톡 발송결과 대체분자 이미지 추가 2025-07-28 15:27:41 +09:00
JIWOO
cca291675a 이지우 - 마이페이지, 결제하기 수정 작업 2025-07-25 18:25:36 +09:00
JIWOO
846780c8c3 이지우 - 마이페이지 및 결제 작업 중 2025-07-25 16:51:25 +09:00
JIWOO
1ef82c5f3d 이지우 - 사용내역서 테이블 수정 2025-07-24 17:07:04 +09:00
JIWOO
410f14dc5e 이지우 - 사용내역서 수정 2025-07-24 16:26:32 +09:00
JIWOO
60dbb225ea 이지우 - 사용자 > 결제관리 > 요금 결제내역 / 요금 사용내역 수정 작업 2025-07-24 15:36:29 +09:00
JIWOO
bfb43ce10c Merge branch 'master' into 5255_DB트리거개선_대체문자_스케줄러 2025-07-24 12:44:34 +09:00
JIWOO
824a49b7a0 이지우 - 트리거 변경 작업(MSG_RESULT) 테스트 소스 원복 2025-07-24 12:42:41 +09:00
JIWOO
4839033257 이지우 - 결제관리 수정 작업 2025-07-24 12:13:53 +09:00
hehihoho3@gmail.com
5247ad68d7 친구톡 템플릿 불러오기 대체이미지 가능하게 수정 2025-07-23 12:37:47 +09:00
hehihoho3@gmail.com
fbececa647 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-07-22 17:50:29 +09:00
hehihoho3@gmail.com
276afbb432 이용약관 2025 추가 2025-07-22 17:26:19 +09:00
hehihoho3@gmail.com
6c83b341c2 주석제거 2025-07-22 16:32:19 +09:00
kmg
03c992be60 2025/07/22 2025 이용약관 개정 2025-07-22 16:31:03 +09:00
JIWOO
349f13ece7 Merge branch 'master' into 5180_요금사용내역_및_결제내역 2025-07-22 14:58:13 +09:00
JIWOO
0dc4539eb2 이지우 - 요금 사용내역 엑셀 수정 2025-07-22 14:52:19 +09:00
subsub
9de39bf5ec Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-07-22 14:37:55 +09:00
subsub
925b38192b 결제관리 > 요금 사용내역 > 알림톡 상세내역 팝업 마스크 오류 수정 팝업 이름 수정 2025-07-22 14:37:10 +09:00
936c71b5ed 보안로그인 본인 명의 휴대폰만보안로그인 off되도록 수정 2025-07-22 14:03:02 +09:00
JIWOO
c94d80f736 Merge branch 'master' into 5180_요금사용내역_및_결제내역 2025-07-21 17:13:57 +09:00
0ef50856df /publish/js/common.js 파일 캐시 초기화 2025-07-21 11:35:53 +09:00
JIWOO
f6802a5c4a Merge branch 'master' into 5255_DB트리거개선_대체문자_스케줄러 2025-07-21 11:21:24 +09:00
JIWOO
77fdfe926e 이지우 - 대체발송 스케줄러 수정 2025-07-21 11:16:48 +09:00
756fe95aef Merge branch 'master_tolag3'
globals 충돌수정
2025-07-21 11:11:30 +09:00
5bd4c8ba37 웹서버 교체, 세션서버 추가, 본인인증 수정
- http1.1 -> http2.0 웹서버 교체
 - valkey 추가
 - 본인인증 모듈화
2025-07-21 11:08:40 +09:00
subsub
4cea36d8fa 친구톡 > 대체문자 장문, 단문, 포토문자 일 경우 textarea height 조정 2025-07-18 18:16:46 +09:00
JIWOO
5a0ef45bf3 이지우 - 문자 발송결과 테스트용(MSG_RESULT 반영) 2025-07-18 16:53:27 +09:00
hehihoho3@gmail.com
92cd6c4041 친구톡 붙여넣기 금액 구하는 함수 추가 2025-07-18 15:16:38 +09:00
hehihoho3@gmail.com
27993053d7 환불 완료 2025-07-18 12:05:00 +09:00
hehihoho3@gmail.com
336ddd8e76 발송결과 완료 2025-07-18 11:48:32 +09:00
hehihoho3@gmail.com
936f413ac0 친구톡 환불 완료 2025-07-18 09:33:09 +09:00
JIWOO
1e639a393c 이지우 - 스케줄러 테스트 오타 수정 2025-07-17 14:04:16 +09:00
JIWOO
07b737940b 이지우 - 대체문자 스케줄러 테스트 작업 중 2025-07-16 17:51:44 +09:00
hehihoho3@gmail.com
4cba7e1885 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-07-16 17:39:42 +09:00
hehihoho3@gmail.com
00dea76c5c 개정약관 2024로 수정 2025-07-16 17:39:19 +09:00
hehihoho3@gmail.com
ffd779dd66 친구톡 환불로직 수정 2025-07-16 14:23:28 +09:00
hehihoho3@gmail.com
1f0c38b791 친구톡 환불로직 진행중 2025-07-16 11:33:05 +09:00
JIWOO
b059021dfd 이지우 - 대체문자 스케줄러 오타 수정 2025-07-15 17:21:47 +09:00
JIWOO
fa55935029 이지우 - 대체문자 처리 스케줄러 추가 2025-07-15 16:50:36 +09:00
hehihoho3@gmail.com
c7731c44d4 친구톡 대체문자 포토문자로 수정 2025-07-11 18:29:03 +09:00
subsub
ff935b0775 Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-07-11 18:28:49 +09:00
subsub
6c42092e44 템플릿명 넘어가는 오류 수정 2025-07-11 18:28:36 +09:00
hehihoho3@gmail.com
dd8524f19c Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-07-11 18:10:47 +09:00
hehihoho3@gmail.com
e3020f5e04 테스트 발송 시 스팸치크 주석 2025-07-10 14:25:49 +09:00
JIWOO
643fcfa6b1 Merge branch 'master' of http://dlwldn1024@vcs.iten.co.kr:9999/hylee/mjon_git into 5180_요금사용내역_및_결제내역 2025-07-10 14:18:04 +09:00
JIWOO
db9e04c95b 이지우 - DB 정보 원복 2025-07-10 14:06:05 +09:00
hehihoho3@gmail.com
4d1bde6f9b Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-07-09 14:31:25 +09:00
hehihoho3@gmail.com
de78c382dd gitignore 수정 2025-07-09 12:56:06 +09:00
subsub
6b38e070bc 띄어쓰기 수정 2025-07-09 12:14:54 +09:00
subsub
2dfb2fed27 카톡발송 > 카카오톡 소개 > 친구톡 소개 추가 2025-07-09 11:48:17 +09:00
hehihoho3@gmail.com
d19eddc0e4 호나불 equals 오류 수정 2025-07-04 14:49:27 +09:00
hehihoho3@gmail.com
667df023db 친구톡 발송금액 처리 완료 2025-07-04 14:25:27 +09:00
hehihoho3@gmail.com
cf249034a6 환불 금액 처리 2025-07-03 18:06:38 +09:00
JIWOO
4feb34dce7 이지우 DB 접속 정보 변경 mjon > mjon_advc(UTF8MB4) 2025-07-03 17:35:25 +09:00
JIWOO
8721b740a5 이지우 - 개발 DB 변경 mjon > mjon_advc 2025-07-03 17:26:50 +09:00
hehihoho3@gmail.com
3c9c72848f 친구톡 진행중 2025-07-03 16:25:39 +09:00
hehihoho3@gmail.com
60602a31bc api 개발가이드 진행중 2025-07-02 11:25:55 +09:00
hehihoho3@gmail.com
cef1420351 DB정보 원복 2025-06-30 12:44:04 +09:00
hehihoho3@gmail.com
84a6dcea7a Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-06-30 11:58:14 +09:00
hehihoho3@gmail.com
57a75df73d dev 디비정보 수정 2025-06-30 11:58:09 +09:00
hehihoho3@gmail.com
a68d957162 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-06-30 11:40:46 +09:00
hehihoho3@gmail.com
921cad89b1 개발서버 DB 변경 -> 테스트 임시 2025-06-30 11:40:29 +09:00
hehihoho3@gmail.com
f7e96648a8 api 발송 수정 2025-06-30 11:24:23 +09:00
JIWOO
6bc68150e3 이지우 - 문자 발송 완료 상태 조건 변경(총 건수==성공or실패 건수 -> 총 건수==성공+실패 건수) 2025-06-27 17:15:25 +09:00
hehihoho3@gmail.com
68c581abdb Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-26 14:43:57 +09:00
hehihoho3@gmail.com
78fd333cab 친구톡 사용안내 텍스트 수정 2025-06-26 14:43:39 +09:00
subsub
eca7f57a41 친구톡 템플릿 리스트 수정 2025-06-26 14:43:25 +09:00
hehihoho3@gmail.com
cef1a2688a 친구톡 5247 수정 2025-06-26 12:01:39 +09:00
hehihoho3@gmail.com
d180cf7c59 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-26 11:41:06 +09:00
hehihoho3@gmail.com
1a3088e5f5 api 리턴값 수정 2025-06-26 11:39:38 +09:00
subsub
9ce4990c55 친구톡 템플릿 타이틀 넘어가는 오류 수정 2025-06-26 11:02:43 +09:00
hehihoho3@gmail.com
681bdadb7d 수정완료 2025-06-25 14:27:02 +09:00
hehihoho3@gmail.com
179c22e6a8 api 로직 수정 2025-06-25 12:17:49 +09:00
hehihoho3@gmail.com
1a5ecf869b Merge branch 'master' into 알림톡api 2025-06-24 18:00:25 +09:00
hehihoho3@gmail.com
faedf7f75f 친구톡 오류 수정 2025-06-23 17:30:47 +09:00
hehihoho3@gmail.com
bd9a24363d Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-23 16:48:06 +09:00
hehihoho3@gmail.com
b4424b71d1 친구톡 화면 오류 수정중 2025-06-23 16:47:46 +09:00
subsub
73e769ca60 Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-06-23 14:27:02 +09:00
subsub
cfad0ac7dc 친구톡 > 템플릿 불러오기 텍스트 넘어가는 거 수정, 친구톡 > 템플릿 리스트 레이아웃 수정 2025-06-23 14:26:46 +09:00
hehihoho3@gmail.com
2a63bf5a58 Redirect /publish/maintenance.html 삭제 2025-06-22 15:32:34 +09:00
hehihoho3@gmail.com
759f7a3dc4 알림톡 faq key값 수정 2025-06-22 14:27:48 +09:00
hehihoho3@gmail.com
e64695cd12 알림톡 발송결과 대체문자 노출 오류 수정 2025-06-22 14:11:48 +09:00
hehihoho3@gmail.com
123b1c4b62 문자발송내역 무료 거부 0808800858 수정 2025-06-22 12:09:23 +09:00
hehihoho3@gmail.com
2e2d604ae2 작업 표시 url 수정 2025-06-21 22:35:24 +09:00
hehihoho3@gmail.com
bc3ded5541 Merge branch 'master' into 알림톡api 2025-06-21 22:11:25 +09:00
dfa1853f3b 문자온 DB변경으로 인한 접속 정보 변경 2025-06-21 21:34:14 +09:00
hehihoho3@gmail.com
84258d115c 문자관리 > 문자전송리스트 내 "문자" 버튼 클릭 시 안내문자 내용 수정 2025-06-20 18:32:34 +09:00
hehihoho3@gmail.com
7c5b5889c3 문자발송에 api return값 추가 2025-06-20 18:29:26 +09:00
be6ad1913c 문자온 DB이관 점검중 페이지로redirect 2025-06-20 16:40:45 +09:00
JIWOO
7bf6c4adea 이지우 - DB 정보 변경 2025-06-20 15:34:09 +09:00
hehihoho3@gmail.com
dff93fe9ad 디비 수정 Globals.Url=jdbc:mysql://192.168.0.125:3306/mjon 2025-06-20 11:58:14 +09:00
hehihoho3@gmail.com
f3daf9b012 Merge branch '5245_알림톡_이미지형_json_생성' 2025-06-20 11:40:15 +09:00
hehihoho3@gmail.com
45b4617905 advc 제거 Globals.Url=jdbc:mysql://139.150.73.12:3306/mjon 2025-06-20 11:38:16 +09:00
hehihoho3@gmail.com
5fb22eb7e8 5233 내 통신사 고객센터 정보 현행화 2025-06-19 15:44:49 +09:00
hehihoho3@gmail.com
30b475c237 이미지형 알림톡 발송 2025-06-19 15:38:53 +09:00
kmg
4a74b9aab4 2025/06/19 이용증명원 발급안내 팝업 내용 수정2 2025-06-19 15:15:23 +09:00
kmg
7264aeef6a 2025/06/19 이용증명원 발급안내 팝업 내용 수정작업 2025-06-19 15:08:54 +09:00
hehihoho3@gmail.com
f3ddd22598 친구톡 개발완료 2025-06-18 17:48:33 +09:00
hehihoho3@gmail.com
7527b7dd8a Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-18 14:56:58 +09:00
hehihoho3@gmail.com
341bce9f45 친구톡 화면 개선중 2025-06-18 14:55:44 +09:00
subsub
4a657bc6eb 친구톡 전송, 발송결과 > 친구톡 2025-06-18 14:45:25 +09:00
hehihoho3@gmail.com
6da46e1c0e Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-12 14:56:13 +09:00
hehihoho3@gmail.com
44de39c92c Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-06-12 14:55:40 +09:00
hehihoho3@gmail.com
c69157aed3 local . DB 내부IP로 수정 2025-06-12 14:55:23 +09:00
hehihoho3@gmail.com
2d824883c8 친구톡개선중 2025-06-12 14:54:53 +09:00
subsub
96a01408d5 알림톡 핸드폰 스크롤 시 포지션 오류 2025-06-12 11:32:52 +09:00
JIWOO
2bab96b9a6 이지우 - 요금사용내역 작업 중 2025-06-09 16:24:39 +09:00
hehihoho3@gmail.com
0ce04cc12f payUserSWList 컨트롤러->서비스로직 분리 2025-06-05 17:19:22 +09:00
hehihoho3@gmail.com
d0a6292cc5 친구톡 진행중 2025-06-05 16:42:21 +09:00
JIWOO
379cc8fa43 이지우 - 사용내역 진행 중 2025-06-05 16:41:13 +09:00
hehihoho3@gmail.com
9f6f2e2024 친구톡 화면 진행중 2025-06-04 15:40:52 +09:00
hehihoho3@gmail.com
8fabd4cbec Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-06-04 14:52:52 +09:00
hehihoho3@gmail.com
141d8146ce 사이트맵 api 추가 및 css 수정 2025-06-04 14:16:52 +09:00
hehihoho3@gmail.com
c8a27be581 개발가이드 퍼블 수정 2025-06-04 12:12:34 +09:00
hehihoho3@gmail.com
8c9d292d56 Merge branch 'master' into 알림톡api 2025-06-04 12:08:32 +09:00
hehihoho3@gmail.com
39add051ec 연동안내 > a 링크 추가 2025-06-04 12:08:17 +09:00
subsub
e39b2f2466 개발 가이드 탭 오류 수정 2025-06-04 12:00:36 +09:00
hehihoho3@gmail.com
986fa3b4b9 Merge branch 'master' into 알림톡api 2025-06-04 11:49:40 +09:00
hehihoho3@gmail.com
6fc8b8cd09 api 사용자 화면 수정 2025-06-04 11:48:30 +09:00
subsub
cdc1ad834a 친구톡 전송, 친구톡 템플릿 등록 2025-06-02 17:31:53 +09:00
subsub
29f66a1960 API > 예제 다운로드 탭 오류 수정 2025-06-02 16:49:55 +09:00
hehihoho3@gmail.com
c3c686e918 Merge branch 'master' into 알림톡api 2025-06-02 14:35:47 +09:00
hehihoho3@gmail.com
115630d4fb api> 개발가이드페이지 2025-06-02 14:34:57 +09:00
subsub
8a1c88f1dc Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2025-06-02 14:08:17 +09:00
subsub
fd61484b70 api 이미지 추가 2025-06-02 14:07:55 +09:00
3c99f7a985 db 개선 테스트를 위한 db접속정보변경 2025-06-02 09:53:11 +09:00
hehihoho3@gmail.com
fcd1644355 Merge branch '알림톡api' 2025-05-29 15:47:43 +09:00
subsub
2e12af0f2f api 문자/카카오톡으로 탭 나눔 2025-05-29 12:13:38 +09:00
subsub
e9a5932ba0 요금 사용내역, 요금 결제내역, 거래명세서, 사용내역서 수정 2025-05-28 15:16:23 +09:00
subsub
e222c85deb 마이페이지 > 회원정보 변경 하단 문구 변경 2025-05-20 16:47:20 +09:00
subsub
01d7d378cc 2025/05/20 마이페이지 삭제, 보유잔액 옆에 아이콘 호버시 나의단가 노출 2025-05-20 16:19:36 +09:00
myname
2be84c1958 2025-05-19 11:15 웹 사이트 분석을 위한 Clarity 코드 추가 2025-05-19 11:15:52 +09:00
hehihoho3@gmail.com
b59a932fe0 문자 알림톡 친구톡 상세결과 타블레이터 데이터를 위한 DTO 추가 2025-05-15 12:33:06 +09:00
myname
2f23ac4472 Merge branch 'master' of http://yongjoon.cho@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-14 18:28:56 +09:00
myname
21af1e863b 2025-05-14 18:28 seo 내용 수정 2025-05-14 18:28:40 +09:00
hehihoho3@gmail.com
3ff4f7c994 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-05-14 17:59:08 +09:00
hehihoho3@gmail.com
75bc2e6773 친구톡 치환데이터 선택 금액 오류 수정 2025-05-14 15:23:46 +09:00
hehihoho3@gmail.com
76277e289c 캐시 log 추가 2025-05-14 12:45:35 +09:00
hehihoho3@gmail.com
1a7d676483 api 진행중 2025-05-14 12:05:27 +09:00
hehihoho3@gmail.com
6a1abf1916 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-13 11:05:39 +09:00
hehihoho3@gmail.com
af73c6cda3 친구톡 환불 주석 2025-05-13 11:05:25 +09:00
hehihoho3@gmail.com
44a6c09600 dev 개발디비로 수정 2025-05-13 11:05:14 +09:00
hehihoho3@gmail.com
0e4377908a api 진행중 2025-05-13 11:04:11 +09:00
364495f7e4 Merge branch 'master_tolag3'
알림톡 발송결과 수정
2025-05-12 15:39:27 +09:00
e1122bdab7 Merge branch 'master_tolag3' 2025-05-12 14:14:01 +09:00
ed2b18a009 알림톡발송결과 수정 2025-05-12 14:13:09 +09:00
myname
6ae41121dd Merge branch 'master' of http://yongjoon.cho@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-09 10:08:04 +09:00
myname
42658f8147 2025-05-09 10:07 seo 개선 작업 2025-05-09 10:07:50 +09:00
hehihoho3@gmail.com
22eea6e937 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-08 18:01:45 +09:00
hehihoho3@gmail.com
cbc6097877 알림톡전송리스트 > 통계호출 ajax 주석 2025-05-08 18:01:38 +09:00
hehihoho3@gmail.com
a45140a60d 알림톡 api 예제 추가중 2025-05-08 18:00:47 +09:00
myname
b1bf60a706 Merge branch 'master' of http://yongjoon.cho@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-08 15:14:56 +09:00
myname
4af623e8bd 2025-05-08 15:14 문자온 SEO 개선 2025-05-08 15:14:39 +09:00
myname
d1b034529e 2025-05-08 문자온 사이트 SEO 개선 작업 2025-05-08 15:10:40 +09:00
367b57624d 알림톡발송결과 페이징 갯수 텍스트 수정 2025-05-08 14:13:38 +09:00
91914a2cf5 알림톡 발송결과 성능 개선 2025-05-08 11:03:49 +09:00
04dc4c5d34 Merge branch 'master_tolag3' 2025-05-08 10:10:04 +09:00
86275447fe 알림톡 오류 수 2025-05-08 09:35:22 +09:00
hehihoho3@gmail.com
935c86a8aa Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-08 09:32:28 +09:00
hehihoho3@gmail.com
3bb52fb53a Merge branch '알림톡단가오류' 2025-05-08 09:32:10 +09:00
myname
17cb89a192 Merge branch 'master' of http://yongjoon.cho@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-08 09:24:36 +09:00
myname
1a5d13505b 2025-05-08 09:24 사이트 인덱스 정보 추가 2025-05-08 09:24:21 +09:00
hehihoho3@gmail.com
9f56680034 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-07 17:22:55 +09:00
hehihoho3@gmail.com
2bc09ff63c 알림톡 대체문자 치환데이터 수정 2025-05-07 17:22:47 +09:00
hehihoho3@gmail.com
5a08f6f7bb 알림톡 단가 오류 수정 2025-05-07 17:16:47 +09:00
myname
a28d32a819 Merge branch 'master' of http://yongjoon.cho@vcs.iten.co.kr:9999/hylee/mjon_git 2025-05-07 11:23:26 +09:00
myname
ac66ae53df 2025-05-07 11:22 sitemap 업데이트 2025-05-07 11:23:12 +09:00
subsub
dc9cf2cd3d 2025/05/07 HTML 업데이트 2025-05-07 10:09:38 +09:00
hehihoho3@gmail.com
dfc2ad11d5 Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-04-28 16:18:06 +09:00
hehihoho3@gmail.com
485a2b52a6 친구톡 발송 > 전송내역 스크립트 추가 2025-04-28 16:05:19 +09:00
Eunjipark
3f6375f7d2 문자전송 > 최근전송내역 팝업 오류 수정 2025-04-28 16:03:47 +09:00
hehihoho3@gmail.com
eb3f3876f1 친구톡 발송 > 주소록 불러오기 완료 2025-04-28 15:16:06 +09:00
dc2da60e77 Merge branch 'master_tolag3' 2025-04-28 14:04:35 +09:00
36290f8dd8 - 알림톡 발송결과 탭 페이징 이어지도록 수정
- 리스트 쿼리 성능 개선
2025-04-28 14:04:05 +09:00
hehihoho3@gmail.com
51cf1fe0d9 친구톡 발송결과 살세 > 재전송 삭제 2025-04-28 10:55:22 +09:00
hehihoho3@gmail.com
b3c25e021e 친구톡 전송결과 프로그래스바 생성 2025-04-25 18:20:47 +09:00
hehihoho3@gmail.com
5b98807cad 친구톡 관련 화면 보여주는 조건에 192.168.0.176 추가 2025-04-25 17:21:42 +09:00
hehihoho3@gmail.com
d730bdd76e 친구톡 발송속도 및 발송결과 2025-04-25 16:59:38 +09:00
hehihoho3@gmail.com
81d31fc55f 친구톡 발송 속도 개선중 2025-04-25 11:24:29 +09:00
kmg
0304168655 2025/04/25 시스템 점검 페이지 2025-04-25 10:27:21 +09:00
hehihoho3@gmail.com
81a027740b 친구톡 진행중 2025-04-21 17:59:36 +09:00
hehihoho3@gmail.com
46d63224d0 문자전송 > 재발송 오류 수정 2025-04-21 11:55:38 +09:00
hehihoho3@gmail.com
69717924d5 친구톡 진행중 2025-04-21 11:10:01 +09:00
hehihoho3@gmail.com
df7c7eca79 스미싱 의심 알림 > 회원 상세정보 클릭 시 오류 발생 현상 수정 2025-04-17 17:54:57 +09:00
hehihoho3@gmail.com
7967c5cd6a Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-04-17 17:47:13 +09:00
hehihoho3@gmail.com
1dd6d5300f 선거문자 불법수집정보 신고번호 118번 => 불법수집정보 신고번호 : 선거관리위원회 ☎1390 수정 2025-04-17 12:00:52 +09:00
hehihoho3@gmail.com
b08aeadb76 5114 그림문자일때 텍스트없으면 문자에 null 들어가는 오류 수정완료 2025-04-16 15:30:29 +09:00
hehihoho3@gmail.com
f22a5850e1 친구톡 발송 엑셀 불러오기 대량으로 수정 2025-04-16 15:23:55 +09:00
hehihoho3@gmail.com
65c2fb1783 알림톡 발송 > 번호추가 버튼 클릭 시 30만건 제한 체크 후 alert 2025-04-16 11:36:35 +09:00
hehihoho3@gmail.com
32d12f02d9 알림톡 발송 500 -> 30만건으로 제한 2025-04-16 09:52:47 +09:00
hehihoho3@gmail.com
995aef6f4b 친구톡 ajax진행중 2025-04-15 17:55:48 +09:00
dec127bd4f Merge branch 'master' of
http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git into master_tolag3

글로벌 프로퍼티 원복
2025-04-15 17:15:05 +09:00
ba78c352c1 Merge branch 'master' of http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git into master_tolag3 2025-04-15 17:10:05 +09:00
e7cef9aea2 Merge branch 'master' of
http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git into master_tolag3

발송상세 목록 버튼 검색조건 이어지도록 수정
2025-04-15 17:09:57 +09:00
hehihoho3@gmail.com
909a5ea375 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-04-15 16:51:17 +09:00
e8c19d0f8a Merge branch 'master' of http://tolag3@vcs.iten.co.kr:9999/hylee/mjon_git into master_tolag3 2025-04-15 16:38:54 +09:00
e8fb872c31 알림톡 상세 목록 버튼 수정 2025-04-15 16:38:42 +09:00
hehihoho3@gmail.com
bdad04fd9d 관리자 > 알림톡>상세 데이터 수정 2025-04-15 16:37:01 +09:00
hehihoho3@gmail.com
596f713c44 알림톡치환데이터개선 2025-04-15 15:53:43 +09:00
6aa562db2d 로그인 수정 2025-04-15 14:43:58 +09:00
hehihoho3@gmail.com
ed63730f7f Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-04-15 12:50:21 +09:00
hehihoho3@gmail.com
056f0b1b44 로그인 원복 2025-04-15 12:22:41 +09:00
hehihoho3@gmail.com
808071372b Merge branch 'master' into 5102_친구톡_발송속도_개선 2025-04-15 11:48:26 +09:00
hehihoho3@gmail.com
eef77f7c3d 알림톡 500건 제한 텍스트 수정 2025-04-15 11:48:01 +09:00
hehihoho3@gmail.com
69e592478f 친구톡 진행중 2025-04-15 11:45:56 +09:00
9420b05895 헤더 사이트맵 수정 2025-04-15 11:11:26 +09:00
kmg
fa05aec591 2025/04/14 서비스안내 배너 수정 2025-04-14 18:28:54 +09:00
88b5f22623 Merge branch 'master_tolag3' 2025-04-14 17:04:27 +09:00
1e560eced8 Merge branch 'master_tolag3'
알림톡 발송결과 전체/알림톡 수정
2025-04-14 17:04:07 +09:00
kmg
074d9645d9 2025/04/14 발송결과 상세 > 카카오톡 미리보기 하단 텍스트 높이 수정 2025-04-14 11:22:43 +09:00
857b07d638 Merge branch 'master_tolag3' 2025-04-14 09:54:12 +09:00
6c9d77cc6e Merge branch 'master_tolag3'
알림톡 발송결과 수정
2025-04-14 09:53:42 +09:00
kmg
cab7d4bcbc 2025/04/10 발송결과 상세 카카오톡 미리보기 수정 2차 2025-04-10 14:44:44 +09:00
kmg
a92f8cd23e 2025/04/10 발송결과 카카오톡 상세 미리보기 수정 2025-04-10 14:17:46 +09:00
a132cd8be4 Merge branch 'master_tolag3' 2025-04-09 15:43:31 +09:00
3680423959 Merge branch 'master_tolag3'
알림톡 발송결과 상세
 - 대체 문자가 없을때도 문자메시지 탭이 보이는 문제 수정
2025-04-09 15:43:08 +09:00
hehihoho3@gmail.com
3ab25aea1b Merge branch 'hylee' 2025-04-09 12:53:15 +09:00
hehihoho3@gmail.com
6639a776de 발송결과 > 문자 > 페이징 오류 - totalcount 수정 2025-04-09 12:53:00 +09:00
fe3ac16535 Merge branch 'master_tolag3' 2025-04-09 12:49:59 +09:00
7045dd36e2 Merge branch 'master_tolag3'
알림톡 발송 결과 수정
2025-04-09 12:49:40 +09:00
kmg
afc7612d35 2025/04/09 서비스 배너 3차 수정 2025-04-09 10:56:56 +09:00
e7e66cbbfb Merge branch 'master_tolag3' 2025-04-09 10:14:09 +09:00
adea7e1993 문자온 알림톡 발송결과 수 2025-04-09 10:13:37 +09:00
kmg
bf88b11662 2025/04/09 서비스 안내 배너 수정 2차 2025-04-09 10:10:31 +09:00
hehihoho3@gmail.com
8228838a80 Merge branch 'hylee' 2025-04-09 09:36:48 +09:00
hehihoho3@gmail.com
247c4072eb 알림톡 성공시 예약결과페이지 이동 URL 제거 2025-04-09 09:36:29 +09:00
hehihoho3@gmail.com
389dd997be Merge branch 'advc' 2025-04-08 18:19:21 +09:00
hehihoho3@gmail.com
865fb0e3c2 Merge branch 'hylee' 2025-04-08 17:19:15 +09:00
hehihoho3@gmail.com
7d74b01afb 뭄ㄴ자발송결과 미리보기 수정 : 5087 2025-04-08 17:19:09 +09:00
kmg
db449c368d 2025/04/08 서비스안내 배너 수정 2025-04-08 10:29:13 +09:00
hehihoho3@gmail.com
46204f38f0 문자발송페이지050 팝업안내 제거 2025-04-07 12:18:26 +09:00
rosewiper
44fead388f Merge branch 'wyd_mjon' 2025-04-07 12:11:01 +09:00
rosewiper
495750a339 간편결제 첫결제 이벤트 오류 수정
if(eventMberInfo == null || payCnt > 0) { ==> if(eventMberInfo == null
|| payCnt > 1) { 로 변경
2025-04-07 12:00:24 +09:00
hehihoho3@gmail.com
bba893fb45 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-04-07 11:43:06 +09:00
hehihoho3@gmail.com
e9a66e7bdf Merge branch 'advc' 2025-04-07 11:41:23 +09:00
hehihoho3@gmail.com
13076399c9 Merge branch '메인_팝업_등록기능' 2025-04-07 11:40:47 +09:00
hehihoho3@gmail.com
2b74d85017 Merge branch '매인베너수정' 2025-04-07 11:40:41 +09:00
d5406a4193 알림톡발송결과
-상단 전체 발송 결과 css수정버전 적용
2025-04-04 14:08:00 +09:00
kmg
5e89ac1c0f 2025/04/03 발송결과 > 카카오톡리스트 결과박스 위치 수정 2025-04-03 12:28:07 +09:00
d74c6febc5 알림톡 발송결 2025-04-03 10:25:54 +09:00
9c94241a52 알림톡 발송결과 오류 수정 2025-04-02 11:10:21 +09:00
hehihoho3@gmail.com
d0decaee43 카카오톡아이디 확인 null Exception 수정 2025-04-01 10:39:41 +09:00
hehihoho3@gmail.com
cc90332add 친구톡 슬랙알림 임시 주석 2025-03-27 15:52:20 +09:00
hehihoho3@gmail.com
2fa9b912e2 알림톡 발송ajax 스크립트 추가 2025-03-27 15:43:32 +09:00
hehihoho3@gmail.com
3d80a90049 알림톡 발송로직 테스트 중 2025-03-26 17:57:16 +09:00
hehihoho3@gmail.com
7c411c5f45 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2025-03-26 15:09:12 +09:00
hehihoho3@gmail.com
9de4dbc620 알림톡 엑셀 불러오기 수정 2025-03-26 15:08:59 +09:00
f7a4bc2b25 Merge branch 'master_tolag3_login' into advc_tolag3 2025-03-26 10:31:12 +09:00
327d6a81fd 헤더 로그인 정상적으로 돌리기 개발 2025-03-26 10:30:05 +09:00
hehihoho3@gmail.com
8bb443fb40 알림톡 개선 중 로그 삭제 2025-03-25 18:46:41 +09:00
hehihoho3@gmail.com
adfde61ea6 Merge branch '4786' into advc 2025-03-25 17:45:15 +09:00
hehihoho3@gmail.com
a569c8135f Merge branch '4786' into advc 2025-03-25 17:26:59 +09:00
hehihoho3@gmail.com
bd07cd5462 json데이터 형식 분기 2025-03-25 17:26:35 +09:00
49781a4f93 카톡 발송 화면 오류 수정 2025-03-25 16:41:05 +09:00
hehihoho3@gmail.com
dbe649e9e2 @Service("MjonCommon") 추가 2025-03-25 15:31:44 +09:00
hehihoho3@gmail.com
10fb1c7542 Merge branch '4786' into advc 2025-03-25 15:19:51 +09:00
hehihoho3@gmail.com
1c382cb088 알림톡발송 종료 2025-03-25 15:14:45 +09:00
hehihoho3@gmail.com
69803afb35 카카오발송 진행중 2025-03-25 10:00:51 +09:00
hehihoho3@gmail.com
2bb22a522f 카톡발송진행중 2025-03-24 09:48:36 +09:00
a67c970812 발송결과 알림톡 성능 개선 2025-03-24 09:38:10 +09:00
hehihoho3@gmail.com
11e32cd532 알림톡 발송개선 진행중 2025-03-21 09:58:55 +09:00
kmg
7d1cdedf03 2025/03/18 카카오톡 결과 상세 css 수정 2025-03-18 14:22:04 +09:00
kmg
5eea5ca7e3 2025/03/18 카카오톡 발송결과 리스트 및 상세 추가 수정 2025-03-18 14:06:12 +09:00
hehihoho3@gmail.com
3afef8e37c 알림톡 수신자 목록 타블레이터로 수정 2025-03-18 12:11:23 +09:00
kmg
e4aa70b782 Merge branch 'master' of http://yickso@vcs.iten.co.kr:9999/hylee/mjon_git 2025-03-14 17:57:41 +09:00
hehihoho3@gmail.com
65a8eb9dc6 가로길이 수정 2025-03-14 16:21:28 +09:00
hehihoho3@gmail.com
a74193673e 알림톡 진행중 2025-03-13 11:37:28 +09:00
hehihoho3@gmail.com
7b7b76b99f 카카오 속도개선 진행중 2025-03-12 16:02:10 +09:00
Eunjipark
72365d9645 문자온 모바일 홍보페이지 > 'munjaon_intro_e 파일명' > 'munjaon_intro_campaign' 로 수정 2025-03-12 15:43:42 +09:00
Eunjipark
c5fe69fa43 문자온 모바일 홍보페이지 > 'munjaon_intro_03 파일명' > 'munjaon_intro_e' 로 수정 2025-03-12 15:36:04 +09:00
Eunjipark
c74c63ed43 2025/03/12 문자온 모바일 홍보페이지 > 전화번호 수정 2025-03-12 15:27:13 +09:00
hehihoho3@gmail.com
e2a3d281a6 getSmsTxtBytes 모듈화 2025-03-12 11:56:17 +09:00
hehihoho3@gmail.com
01bc9c6a7d mjonCommon으로 분리 idgenMsgCId.getNextStringId(mjonMsgSendVOList.size()); 2025-03-11 15:25:31 +09:00
hehihoho3@gmail.com
301135e190 카톡발송 화면 json 로직 수정 및 발송 VO 생성 2025-03-10 17:27:52 +09:00
myname
4fe717d4ef 2025-03-07 16:50 결제관리 excel download 수정 2025-03-07 16:50:52 +09:00
kmg
c2f86a823e Merge branch 'master' of http://yickso@vcs.iten.co.kr:9999/hylee/mjon_git 2025-03-06 11:12:16 +09:00
hehihoho3@gmail.com
b87785778e 5011 수정 - 순서삭제, 삭제기능 추가, 링크 파라미터 자동조정 2025-03-04 16:57:05 +09:00
hehihoho3@gmail.com
e8ac84e413 kmg_ 2025/03/03 카카오톡 발송결과 2025-03-04 16:51:09 +09:00
kmg
516af9541e 2025/03/04 카카오톡 발송결과 2025-03-04 10:47:23 +09:00
hehihoho3@gmail.com
0018554058 Merge branch 'advc' 2025-03-04 09:46:18 +09:00
hehihoho3@gmail.com
6d8186d38b 메인 팝업 캐시 사용자 완료 2025-02-28 13:22:26 +09:00
hehihoho3@gmail.com
3d9db44442 메인 팝업 관리자 완료 2025-02-28 09:42:07 +09:00
hehihoho3@gmail.com
d6371aa631 Merge branch '매인베너수정' into 메인_팝업_등록기능 2025-02-27 18:08:14 +09:00
hehihoho3@gmail.com
3b544be5f2 메인팝업 진행중 2025-02-27 18:07:27 +09:00
hehihoho3@gmail.com
05ed9ff1bd Merge branch '메인_팝업_등록기능' into 매인베너수정 2025-02-25 17:56:59 +09:00
hehihoho3@gmail.com
eda08c2cf4 main popup 패키지 생성 2025-02-25 17:56:50 +09:00
hehihoho3@gmail.com
71aac40a74 페이지 이름 수정 2025-02-25 16:14:09 +09:00
hehihoho3@gmail.com
71f349ac63 서비스안내 배너관리 수정시 순서 변경 로직 수정 2025-02-25 15:58:02 +09:00
hehihoho3@gmail.com
74076af6cc 마이페이지 오류 수정 2025-02-25 15:25:15 +09:00
hehihoho3@gmail.com
2cf806dc65 롤백 2025-02-25 15:24:28 +09:00
hehihoho3@gmail.com
8ad397168d 메인화면 하단 롤링 메인비쥬얼 시스템화 완료 2025-02-25 11:35:43 +09:00
hehihoho3@gmail.com
6d37352684 메인비주얼 이미지 체크 추가 2025-02-24 17:33:38 +09:00
hehihoho3@gmail.com
58943ccb02 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-02-24 17:16:39 +09:00
hehihoho3@gmail.com
b055b0b710 Merge branch '매인베너수정' 2025-02-24 16:21:39 +09:00
hehihoho3@gmail.com
ad6c9bdde5 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-02-24 15:58:44 +09:00
hehihoho3@gmail.com
2843faa5ad 메인비주얼 url 제거 및 빈 파라메터 제거 2025-02-24 15:58:28 +09:00
hehihoho3@gmail.com
7809db90ee submainPop 수정중 2025-02-24 15:02:31 +09:00
kmg
fd25289c43 2025/02/24 슬라이드배너 수정4 2025-02-24 12:12:19 +09:00
hehihoho3@gmail.com
a37d0c24e5 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-02-24 10:13:28 +09:00
hehihoho3@gmail.com
b3c6ccc665 Merge branch '매인베너수정' 2025-02-24 10:13:07 +09:00
hehihoho3@gmail.com
9be751262a 메인비주얼 등록/수정게시판에 게시기간 디폴트 년월일 생성 2025-02-24 10:13:03 +09:00
kmg
37cb9819f0 2025/02/24 슬라이드배너 수정3 2025-02-24 09:47:06 +09:00
hehihoho3@gmail.com
e313bf64d6 Merge branch '발송_050수신자체크' 2025-02-24 09:39:24 +09:00
kmg
63a85825a4 2025/02/21 슬라이드배너 수정2 2025-02-21 18:42:31 +09:00
kmg
5d9cc8c728 2025/02/21 슬라이드 배너 수정 2025-02-21 18:06:59 +09:00
hehihoho3@gmail.com
eb91bcfe35 관리자에서 메인 베너 URL 등록 기능 2025-02-21 12:22:13 +09:00
hehihoho3@gmail.com
fc29e38eb6 안심번호 팝업 중앙정렬 및 기존 크기 오류 해결 2025-02-20 18:23:50 +09:00
Eunjipark
cb88d2c1ec 2025/02/20 문자전송 > 안심번호 사용 관련 안내 추가_수정1 2025-02-20 16:35:40 +09:00
hehihoho3@gmail.com
0e5db102da 카카오 친구톡 활성화 -> localhost , 119.193.215.98 2025-02-20 16:31:06 +09:00
Eunjipark
c97a3bb12b 2025/02/20 문자전송 > 안심번호 사용 관련 안내 추가 2025-02-20 16:09:19 +09:00
hehihoho3@gmail.com
372917fb1d Merge branch '4891_발송결과_속도개선' into advc 2025-02-20 15:51:21 +09:00
hehihoho3@gmail.com
59fe0ed77e 재발송 클릭 alert 문구 수정 2025-02-20 15:51:16 +09:00
hehihoho3@gmail.com
d21028f904 로그 주석 2025-02-19 16:42:11 +09:00
hehihoho3@gmail.com
c6cf4834a9 발송결과 테스트요청 내용 수정 http://pms.iten.co.kr:9999/issues/4891 2025-02-19 16:14:57 +09:00
hehihoho3@gmail.com
f4ecaa4bb9 fn_phoneAddProcess 공통함수 생성 2025-02-19 15:49:58 +09:00
hehihoho3@gmail.com
26467e0716 String to Date 에러 수정 2025-02-13 09:38:35 +09:00
hehihoho3@gmail.com
4a3faa34b8 테스트 수정사항 완료 2025-02-12 11:19:02 +09:00
hehihoho3@gmail.com
b6d95f72f7 setStringToDataFormatter 변수명 수정 setStrToDataFormatter 2025-02-11 17:48:49 +09:00
hehihoho3@gmail.com
1a1146bc0b 결제내역 > 요금사용내역 > 문자삭제내역, 예약 취소내역 보이게 수정
/*and IFNULL(B.DEL_FLAG, 'N') = 'N'*/
				/*and A.DEL_FLAG = 'N'*/
				/*AND B.RESERVE_C_YN = 'N'*/
2025-02-11 16:42:24 +09:00
hehihoho3@gmail.com
cc983c7d42 functions.tld 추가 2025-02-11 11:47:21 +09:00
hehihoho3@gmail.com
197018bcba 제목 체크 상태값 INSERT 추가 subjectChkYN 2025-02-11 10:33:54 +09:00
subsub
0c28a42274 Merge branch 'sub' 2025-02-11 10:16:33 +09:00
subsub
0b8c076fd8 2025/02/11 팝업 2개 뜰 경우 마스크와 팝업 우선순위 수정(엑셀불러오기 팝업 예외처리) 2025-02-11 10:15:21 +09:00
hehihoho3@gmail.com
03da959c4f 발송결과 속도계속 오류사항 진행중 4891 2025-02-10 17:39:55 +09:00
hehihoho3@gmail.com
e9891f3624 Merge branch '4942_문자발송금액누락오류' into 4891_발송결과_속도개선 2025-02-10 15:06:51 +09:00
hehihoho3@gmail.com
3f905f4cf8 Merge branch '4942_문자발송금액누락오류' 2025-02-10 14:44:39 +09:00
hehihoho3@gmail.com
b15c76365a 문자발송금액 누락 오류 완료 2025-02-10 14:43:40 +09:00
hehihoho3@gmail.com
50f49445da 주석 추가 2025-02-06 17:53:15 +09:00
hehihoho3@gmail.com
3848fb61b0 발송결과 > 상세 > 주소록등록 그룹선택으로 수정 2025-02-06 17:50:00 +09:00
hehihoho3@gmail.com
4a899def87 Merge branch 'master' into 4891_발송결과_속도개선 2025-02-06 16:02:30 +09:00
kmg
ebc3ce2933 2024/02/06 주소록등록 팝업 추가 및 수정 2025-02-06 15:52:42 +09:00
hehihoho3@gmail.com
d6bed63fec 발송결과 종료 2025-02-06 11:56:54 +09:00
hehihoho3@gmail.com
4b35490d13 Merge branch 'master' into 4891_발송결과_속도개선 2025-02-05 10:42:08 +09:00
hehihoho3@gmail.com
a021a3670e 발송결과 상세화면 진행중 2025-02-05 10:41:30 +09:00
kmg
9cd3659bdf 2025/02/04 발송결과 상세 팝업수정 2025-02-04 18:38:48 +09:00
hehihoho3@gmail.com
2ef4731e34 문자 금액 체크 수정 2025-02-04 17:53:51 +09:00
hehihoho3@gmail.com
1230dea6ac 발송결과 상세 진행중 2025-02-04 17:29:22 +09:00
hehihoho3@gmail.com
4d320f7401 Merge branch 'master' into 4891_발송결과_속도개선 2025-02-04 10:08:26 +09:00
hehihoho3@gmail.com
726a803e3e 문자발송시 이벤트 누락 및 오류 개선 2025-02-03 17:45:43 +09:00
wyh
533e081c2b 이벤트 회원 비교 내용 수정 2025-02-03 17:21:56 +09:00
myname
add6f6f260 2025-02-03 15:03 일별/월별 문자발송건수 통계 페이지 오류 수정 2025-02-03 15:03:51 +09:00
hehihoho3@gmail.com
ddc1437141 4891_발송결과_속도개선 진행중 2025-01-31 09:30:48 +09:00
wyh
a2ba4a9865 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-24 21:26:56 +09:00
wyh
92cd4a2cfc 이벤트 조건 추가 2025-01-24 21:26:39 +09:00
myname
bf85e9bb2f Merge branch 'master' of http://vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-24 21:03:50 +09:00
myname
2763b71c85 2025-01-24 21:02 첫 결제 이벤트 등록시 결제 여부 확인하는 로직 추가됨 2025-01-24 21:03:32 +09:00
wyh
254fd805ed Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-24 20:59:34 +09:00
wyh
a2a8fc580f 그룹데이터 이벤트여부 값 수정 2025-01-24 20:59:26 +09:00
myname
4a140f57a6 Merge branch 'master' of http://vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-24 20:00:33 +09:00
myname
d58c7602bf 2025-01-24 20:00 첫 결제 이벤트 충전하기 버튼 클릭시 결제 여부 확인하는 체크 로직 추가 2025-01-24 20:00:13 +09:00
wyh
a02fffcb76 이벤트 결제관련 오류처리 2025-01-24 19:20:06 +09:00
kmg
73986519b6 2024/01/23 발송결과 상세페이지 제목 추가 2025-01-23 17:01:24 +09:00
hehihoho3@gmail.com
b06910b476 Merge branch 'master' into 4891_발송결과_속도개선 2025-01-23 14:58:06 +09:00
hehihoho3@gmail.com
da00ed6b8a 발송결과 리스트 화면 완료 2025-01-23 14:57:40 +09:00
Eunjipark
c8bb7dd686 2025/01/23 발송결과_상세 페이지 수정_03 2025-01-23 11:21:08 +09:00
Eunjipark
4f70564baa 2025/01/23 발송결과_상세 페이지 수정_02 2025-01-23 11:09:04 +09:00
Eunjipark
a64de2d363 2025/01/23 발송결과_상세 페이지 수정 2025-01-23 11:00:08 +09:00
Eunjipark
8527d3e294 2025/01/122 발송결과_리스트 페이지 수정_02 2025-01-22 18:10:05 +09:00
Eunjipark
f00818aa20 2025/01/122 발송결과_리스트 페이지 수정 2025-01-22 17:47:05 +09:00
hehihoho3@gmail.com
db8481076d 배포 테스트 2025-01-20 17:57:01 +09:00
hehihoho3@gmail.com
5cfae19c82 발송 화면 수정중 2025-01-20 17:51:25 +09:00
hehihoho3@gmail.com
e1792f269d api 예제 파일 수정 - 경로 수정 2025-01-20 16:02:47 +09:00
hehihoho3@gmail.com
59cebe7936 발송결과 화면 수정중 2025-01-20 16:02:14 +09:00
hehihoho3@gmail.com
4353d4939f Merge branch 'master' into 4891_발송결과_속도개선 2025-01-20 12:13:06 +09:00
hehihoho3@gmail.com
01898701bf 문자전송 진행중 2025-01-20 12:12:30 +09:00
Eunjipark
5d2b71c0f4 2024/01/20 주소록 대량등록 팝업 헤더 수정 2025-01-20 11:20:59 +09:00
hehihoho3@gmail.com
9e56bc1ee0 발송결과 페이지 개선중 2025-01-17 18:25:28 +09:00
wyh
e61fe18a92 Slack 전송관련 기능 수정 2025-01-17 16:50:44 +09:00
wyh
02de21636d Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-17 16:27:36 +09:00
wyh
07531d9952 맞춤문자, 문자 재전송, 인기문자(단문, 장문, 그림),주소록 전송기능 수정 2025-01-17 16:27:28 +09:00
Eunjipark
4cf5dce18a 2025/01/17 발송결과페이지 수정 2025-01-17 16:04:10 +09:00
hehihoho3@gmail.com
d2ed44a787 인증번호 알림 텍스트 수정 2025-01-16 16:20:28 +09:00
hehihoho3@gmail.com
fc75143262 테스트서버에서 로그인 인증번호 발송 시 테스트슬랙알림채널로 발송 2025-01-16 15:58:19 +09:00
wyh
9eb1057128 알림톡 슬랙 노출 안되는 부분 수정 2025-01-16 15:03:03 +09:00
hehihoho3@gmail.com
e0a04b9ce5 ec로 코드 수정 http://pms.iten.co.kr:9999/issues/4573 2025-01-16 12:15:09 +09:00
hehihoho3@gmail.com
ade28c695d 엑셀 불러오기 0값 처리 오류 수정 완료 2025-01-16 11:19:45 +09:00
hehihoho3@gmail.com
d34f626aa0 발송결과 페이지 및 속도개선 진행중 - 화면수정 중 2025-01-16 10:56:01 +09:00
hehihoho3@gmail.com
071fd2b35b 발송결과 상위 탭 active 코드개선 2025-01-14 10:25:10 +09:00
hehihoho3@gmail.com
b5d6d19478 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-13 17:56:22 +09:00
hehihoho3@gmail.com
8f7794a378 자조보내는번호 ajax console.log 삭제 2025-01-13 17:56:19 +09:00
hehihoho3@gmail.com
b823264c25 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-13 17:53:23 +09:00
hehihoho3@gmail.com
2d756d0d14 Merge branch '4875_발송_페이지_로딩_속도개선' - 선택버튼 수정 2025-01-13 17:53:19 +09:00
hehihoho3@gmail.com
9ede6ee607 Merge branch '4875_발송_페이지_로딩_속도개선' 2025-01-13 17:20:09 +09:00
hehihoho3@gmail.com
99c305c16d Merge branch '4875_발송_페이지_로딩_속도개선' 2025-01-13 17:08:41 +09:00
hehihoho3@gmail.com
e997318fe6 자주보내는 번호 ajax로 분리하여 문자전송 페이지 속도 개선 2025-01-13 16:59:20 +09:00
hehihoho3@gmail.com
40ac1a6719 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-13 11:43:55 +09:00
hehihoho3@gmail.com
ae38fd1072 http://pms.iten.co.kr:9999/issues/4877 발신번호정지도 전체 리스트에 나오게 2025-01-13 11:43:33 +09:00
wyh
a2ac1fdfa1 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-13 09:19:09 +09:00
wyh
6fe0b3577d SMS전송 공통코드 기능 추가 2025-01-10 16:23:00 +09:00
hehihoho3@gmail.com
3be76f6144 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-10 13:32:08 +09:00
hehihoho3@gmail.com
3204df4382 발신번호 인증여부 처리 2025-01-10 13:31:42 +09:00
wyh
7345cb3f55 메인페이지 팝업 닫기 관련 기능 수정 2025-01-10 12:01:37 +09:00
hehihoho3@gmail.com
f5c94b4d7e phmtype 주석처리 2025-01-10 11:21:28 +09:00
hehihoho3@gmail.com
3642498dfd 휴일 where 조건 주석 처리 2025-01-10 10:13:28 +09:00
hehihoho3@gmail.com
d25c836e18 fax발송 엑셀불러오기 .xls 적용 2025-01-10 09:43:00 +09:00
hehihoho3@gmail.com
4531dc86c6 엑셀업로드 설명 및 이모지 제거 추가 2025-01-10 09:28:29 +09:00
hehihoho3@gmail.com
f832bd20e0 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-09 18:00:39 +09:00
hehihoho3@gmail.com
2ad5dec494 테스트문자 개선 완료 2025-01-09 18:00:12 +09:00
hehihoho3@gmail.com
bd994861a5 테스트 문자 진행중 2025-01-09 15:29:54 +09:00
Eunjipark
d6ac5fa091 2025/01/08 문자온 모바일용 홍보페이지 퍼블리싱 수정 2025-01-08 18:39:13 +09:00
hehihoho3@gmail.com
fbfd2de670 소개 페이지 css 주석 2025-01-08 16:54:13 +09:00
hehihoho3@gmail.com
5bce4be639 xlsx 이모지 체크 추가 2025-01-08 16:48:50 +09:00
hehihoho3@gmail.com
79e6548309 외부 공개 html은 /public 폴더로 이동 2025-01-08 16:27:10 +09:00
hehihoho3@gmail.com
2c5863086a Merge branch 'hylee' 2025-01-08 16:25:33 +09:00
hehihoho3@gmail.com
fa183e7e30 주소록 등록 엑셀 .xls 확장자 추가 및 이모지 제거 기능 추가 2025-01-08 16:25:15 +09:00
Eunjipark
e4bee89aee 2025/01/08 문자온 모바일용 홍보페이지 퍼블리싱 2025-01-08 16:12:33 +09:00
wyh
130abd6219 SMS 불법스팸 발송취소 안내 문자내용 등록 2025-01-07 10:31:45 +09:00
hehihoho3@gmail.com
04c8475bc7 금지어 예외처리 슬렉 알림 추가 2025-01-06 16:41:45 +09:00
hehihoho3@gmail.com
20ae689859 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into 4812-hylee 2025-01-06 16:11:47 +09:00
hehihoho3@gmail.com
34da8a5b69 텍스트를 숫자로 캐스팅후 진행 2025-01-06 16:11:13 +09:00
wyh
1aa5fc6c98 알림톡 중복변수 수량 체크 변경 2025-01-03 09:17:12 +09:00
hehihoho3@gmail.com
29abb4b93d 기존 주석 삭제 2025-01-02 09:59:32 +09:00
hehihoho3@gmail.com
5836cfba8b Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2025-01-02 09:42:42 +09:00
hehihoho3@gmail.com
898eb39430 Merge branch 'hylee' 2025-01-02 09:42:37 +09:00
hehihoho3@gmail.com
b7626975fd Merge branch 'hylee' 2025-01-02 09:36:30 +09:00
hehihoho3@gmail.com
6f5aa28c39 결함 #4793 2025-01-02 09:36:10 +09:00
hehihoho3@gmail.com
231ad537f2 Merge branch 'hylee' 2024-12-31 10:52:38 +09:00
hehihoho3@gmail.com
c283c847e6 pms : #4790 / 발송결과 조회기간 2024-12-31 10:30:25 +09:00
subsub
a45272356e Merge branch 'advc' 2024-12-30 17:44:21 +09:00
subsub
5d56d7cac8 24/12/30 문자전송 > 받는 사람 번호추가 레이아웃 틀어짐 수정 2024-12-30 17:42:09 +09:00
hehihoho3@gmail.com
34f154a3a8 CS #4787 엑셀 다운로드 완료 2024-12-30 15:47:49 +09:00
hehihoho3@gmail.com
0730ff998d 재전송 및 문자전송 페이지 속도 개선 2024-12-30 11:24:52 +09:00
hehihoho3@gmail.com
f228f2a247 재전송 오류 수정 2024-12-27 12:52:23 +09:00
hehihoho3@gmail.com
106f370de7 스미싱 완료 2024-12-26 22:13:56 +09:00
hehihoho3@gmail.com
bca45f5d04 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-12-26 21:53:08 +09:00
hehihoho3@gmail.com
13d77f2469 스미싱 예외 테스트 2024-12-26 21:53:01 +09:00
hehihoho3@gmail.com
3b3fc59da8 스미싱 예외 테스트 2024-12-26 21:50:53 +09:00
hehihoho3@gmail.com
92caa1ec96 test 2024-12-26 21:35:33 +09:00
hehihoho3@gmail.com
9b07d26e0a Merge branch 'hylee' 2024-12-26 21:32:50 +09:00
hehihoho3@gmail.com
655459837c 발송 알림 테스트 2024-12-26 21:32:11 +09:00
hehihoho3@gmail.com
2e14add4e9 발송 알림 테스트 2024-12-26 20:46:49 +09:00
hehihoho3@gmail.com
a39ec55092 스미싱 알림 테스트 배포 2024-12-26 20:06:53 +09:00
hehihoho3@gmail.com
489827d951 관리자 > 사용자 파업에에서 사용자 최근 메세지리스트 안보이는 오류 수정 2024-12-26 16:29:06 +09:00
hehihoho3@gmail.com
1f42313cd1 test를 위해 지연 시간 5분으로 단축 30->5 2024-12-26 15:25:32 +09:00
hehihoho3@gmail.com
3a31b56048 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-12-26 15:09:19 +09:00
hehihoho3@gmail.com
3e88ee9889 사용자 알림 설정에 따른 즉시 발송 2024-12-26 15:09:00 +09:00
wyh
4478e4880b XSS 변경관련 기능 추가 2024-12-26 11:43:43 +09:00
hehihoho3@gmail.com
0decb976c5 (긴급) 2. 스미싱 미처리된 경우, 벌크 문자가 한꺼번에 안나가고 30분에 1개씩 나가는 문제
(긴급) 3. 벌크 예약문자에 대하여 스미싱 승인을 했음에도, 정한 시간부터 30분에 1개씩 나가는 문제
완료
2024-12-26 09:44:44 +09:00
hehihoho3@gmail.com
e277061bb9 재전송기능 2024-12-26 08:57:19 +09:00
hehihoho3@gmail.com
71d444f447 문자, 팩스발송 주소록 불러오기 완료 2024-12-24 20:00:42 +09:00
hehihoho3@gmail.com
6fbef10f7a 주소록 전제 검색 쿼리 수정 2024-12-24 19:01:01 +09:00
hehihoho3@gmail.com
5807ddd083 주소록 불러오기 전체 버튼 선택 원복 2024-12-24 18:50:35 +09:00
hehihoho3@gmail.com
c5a991c4be Merge branch 'hylee' 2024-12-24 18:38:09 +09:00
hehihoho3@gmail.com
208502de5b Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into hylee 2024-12-24 18:37:49 +09:00
Eunjipark
a939e3914e 2024/12/24 브라우저 쿠키 삭제 방법 안내 팝업 업로드 2024-12-24 17:57:14 +09:00
hehihoho3@gmail.com
d350c5bb95 스미싱의심 테스트 2024-12-24 17:44:10 +09:00
subsub
fe1d98d656 24/12/24 문자 전송 > 내용 간격 수정 2024-12-24 17:31:48 +09:00
subsub
1c10fbbba6 2024/12/24 엑셀 불러오기 상세 팝업 크기 수정 2024-12-24 16:52:48 +09:00
hehihoho3@gmail.com
e78b265108 제목 테스트 2024-12-24 16:49:36 +09:00
hehihoho3@gmail.com
5aa703d631 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-12-24 16:29:59 +09:00
hehihoho3@gmail.com
8f1f8b78a1 타이틀 테스트 커밋 2024-12-24 16:29:38 +09:00
wyh
8488ebd9bd 탈퇴회원 페이지 이동 2024-12-24 14:49:32 +09:00
hehihoho3@gmail.com
0a21e4be6e 문자발송 > 주소록불러오기 가로 길이 조정 수정 2024-12-24 14:42:39 +09:00
hehihoho3@gmail.com
e6b7a96071 문자전송 비로그인 시 스크립트 에러 2024-12-24 12:45:41 +09:00
hehihoho3@gmail.com
e6ce8ce036 주소록 오류 수정 2024-12-23 15:29:57 +09:00
hehihoho3@gmail.com
d7bdace043 null 처리 수정 2024-12-23 14:59:09 +09:00
hehihoho3@gmail.com
6d880bbdb0 null 처리 오류 수정 2024-12-23 14:46:52 +09:00
hehihoho3@gmail.com
6540db465c 문자내용 null체크 2024-12-23 14:38:05 +09:00
hehihoho3@gmail.com
f35ae64aa6 파일처리 추가 2024-12-23 14:29:12 +09:00
hehihoho3@gmail.com
2b60c92568 문자발송로직 > 이벤트 체크 2024-12-23 13:33:08 +09:00
hehihoho3@gmail.com
376f75d711 환불내역이 없을때 프로시져 실행 안하기 2024-12-23 09:27:15 +09:00
hehihoho3@gmail.com
a759a9f3f2 개선 배포 준비 완료 2024-12-20 14:51:48 +09:00
hehihoho3@gmail.com
3c8e608ccf 주소록 엑셀 upload 후 닫기 실행 수정 2024-12-20 12:53:48 +09:00
hehihoho3@gmail.com
43118182c1 문자전송 에러엑셀 다운로드 추가 2024-12-20 10:41:35 +09:00
hehihoho3@gmail.com
c236d31c06 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-19 21:02:07 +09:00
hehihoho3@gmail.com
81e7e1861d issues/4750 - : pms 수정 2024-12-19 21:01:54 +09:00
subsub
f696cc42e1 Merge branch 'advc' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-19 17:41:28 +09:00
subsub
40c1516f08 24/12/19 엑셀 불러오기 팝업 css 수정 2024-12-19 17:40:55 +09:00
hehihoho3@gmail.com
4c449d49a0 퍼블 수정으로인해 광고문자 오류 발생 해결 2024-12-18 20:10:22 +09:00
hehihoho3@gmail.com
8d8e095a5c 주소록 000,000 처리 2024-12-18 19:44:25 +09:00
hehihoho3@gmail.com
378ffc94cc 문자전송 새로운 퍼블 적용 2024-12-18 19:35:37 +09:00
hehihoho3@gmail.com
69757b28a6 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-18 18:31:45 +09:00
hehihoho3@gmail.com
150b8922e5 문자발송 페이지 수정중 2024-12-18 18:31:24 +09:00
subsub
bc3cfffe34 Merge branch 'advc' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-18 18:21:21 +09:00
subsub
b5745f44fd 2024/12/18 일반문자, 대량문자 수정 2024-12-18 18:20:52 +09:00
hehihoho3@gmail.com
1789876703 대량문자 2024-12-18 15:42:06 +09:00
hehihoho3@gmail.com
46993e81ad 문자전송 단문, 대량 화면 합치기 2024-12-18 15:08:20 +09:00
hehihoho3@gmail.com
27e2e5fd08 환불 select 수정 2024-12-17 18:34:47 +09:00
hehihoho3@gmail.com
504bec4c64 팩스 발송 > 주소록 불러오기 속도개선 2024-12-17 17:28:21 +09:00
hehihoho3@gmail.com
51f9a7957a 팩스 , 주소록관리 속도개선 2024-12-17 16:59:33 +09:00
hehihoho3@gmail.com
d1177ce48e Merge branch 'advc' into hylee 2024-12-17 16:50:04 +09:00
hehihoho3@gmail.com
faea8d0192 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-17 16:49:52 +09:00
hehihoho3@gmail.com
a3aaba6343 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-12-17 16:49:40 +09:00
hehihoho3@gmail.com
3506ca1c76 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-17 16:45:48 +09:00
hehihoho3@gmail.com
09cce7f549 팩스 속도 개선 2024-12-17 16:45:33 +09:00
subsub
2db4a5f9f3 2024/12/17 주소록관리 결과 없을 경우 2024-12-17 16:44:31 +09:00
subsub
e3da7d3446 2024/12/17 문자발송 > 주소록 불러오기 팝업 버튼 수정 및 주소록관리 주소록그룹 수정 2024-12-17 14:50:04 +09:00
hehihoho3@gmail.com
8b5d21c242 문자전송 받느사람 30만건 제한 2024-12-17 12:51:00 +09:00
hehihoho3@gmail.com
b06cc7e71e 문자 받는사람 체크 2024-12-16 20:33:25 +09:00
hehihoho3@gmail.com
5378514a8e Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into hylee
2024-12-16 19:56:08 +09:00
hehihoho3@gmail.com
1f6c397498 Merge branch 'master' into hylee 2024-12-16 19:32:40 +09:00
hehihoho3@gmail.com
524c83fe1f Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-12-16 14:30:39 +09:00
hehihoho3@gmail.com
74e23201cc 문자전송 화면 수정중 2024-12-16 14:26:48 +09:00
hehihoho3@gmail.com
319445f483 팩스 주소록 등록 속도개선 2024-12-13 16:19:20 +09:00
hehihoho3@gmail.com
43fd87bf01 30만건 이상 false; 2024-12-13 15:01:18 +09:00
hehihoho3@gmail.com
16ca2b6723 팩스발송 > 엑셀업로드 에러체크 수정 2024-12-13 10:10:24 +09:00
hehihoho3@gmail.com
2957e4ebd8 fax checkFaxNum 함수 로그 삭제 2024-12-13 10:00:08 +09:00
hehihoho3@gmail.com
d8350c5901 팩스 유효성검사 수정 2024-12-13 09:52:49 +09:00
hehihoho3@gmail.com
2ac147144c 팩스 환불 로직 개선 2024-12-12 19:11:28 +09:00
hehihoho3@gmail.com
187f11057e 환불관련 작업중 2024-12-11 18:23:21 +09:00
hehihoho3@gmail.com
b75a76c1b5 schedulerUtil을 local, dev 둘다 실행 안되게 설정 2024-12-11 12:38:25 +09:00
hehihoho3@gmail.com
72bff1552f 팩스 벨류체크 및 엑셀파일 드래그앤드롭 2024-12-11 11:53:15 +09:00
hehihoho3@gmail.com
8d09a13a22 팩스 주소록 완료 2024-12-11 09:27:50 +09:00
kmg
61614318b8 2024/12/10 나이스페이 결제창 사이즈 수정 2024-12-10 17:53:29 +09:00
hehihoho3@gmail.com
4e2daf5e3c 문자발송 - 번호추가 안내문구 수정 / 발송결과에 단문 장문 구분 수정 2024-12-09 19:54:14 +09:00
hehihoho3@gmail.com
ed05ea4648 팩스 주소록 진행중 2024-12-09 14:52:29 +09:00
hehihoho3@gmail.com
a8c8f46f0e 오류버튼 삭제 및 문구수정 2024-12-06 16:57:49 +09:00
hehihoho3@gmail.com
eecd562d5e 문자 개별단가별 그룹화하여 분리 발송 2024-12-06 15:52:20 +09:00
hehihoho3@gmail.com
113d2fc25a 문자발송 > 광고일때 2024-12-05 17:35:44 +09:00
hehihoho3@gmail.com
1a0022e1aa 프로그레스바 30만건기준 600초로 수정 2024-12-05 17:35:07 +09:00
hehihoho3@gmail.com
09146af48d batch 사이즈 5만으로 늘림 2024-12-05 10:24:26 +09:00
hehihoho3@gmail.com
4f0358ca40 문자발송 batch 사이즈 조정 2024-12-05 09:10:04 +09:00
hehihoho3@gmail.com
dbff5dfcbe 치환데이터 오류 수정 2024-12-04 16:48:40 +09:00
hehihoho3@gmail.com
fc921335db 문자발송을 위한 배포 2024-12-04 16:22:31 +09:00
hehihoho3@gmail.com
77c8a48ff2 slack 개발 운영 분기 2024-12-04 15:07:15 +09:00
hehihoho3@gmail.com
9e50e999b2 문자발송 프록그래스바 적용 중 2024-12-02 18:33:33 +09:00
hehihoho3@gmail.com
b9246aa6db 발송시간 log 추가 2024-12-02 16:55:02 +09:00
hehihoho3@gmail.com
4c65a729bc 문자전송 jsp에서 시간초 재는 구문 추가 2024-12-02 16:37:48 +09:00
hehihoho3@gmail.com
1750558c17 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-02 16:30:15 +09:00
hehihoho3@gmail.com
16eed13939 + 문자발송 테스트중 batch 50000 2024-12-02 16:30:01 +09:00
Eunjipark
c45636efe0 2024/12/2 풋터 > 대량문자 전송자격 인증마크 추가 2024-12-02 16:15:58 +09:00
kmg
1f4e64cab6 2024/12/02 불법스팸방지안내서 최신 파일 링크로 수정 2024-12-02 11:12:13 +09:00
subsub
25bf086ed9 2024/12/02 주석추가 2024-12-02 10:26:50 +09:00
subsub
782b2abc0a Merge branch 'advc' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-12-02 10:00:16 +09:00
subsub
ee7329efa2 2024/12/02 프로그레스바 추가 2024-12-02 09:59:47 +09:00
hehihoho3@gmail.com
5f33722e1b Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-28 12:56:33 +09:00
hehihoho3@gmail.com
fb7ec512ce 문자발송 batch 테스트 2024-11-28 12:56:01 +09:00
hehihoho3@gmail.com
c972448ba6 문자발송 batch 테스트 2024-11-28 12:46:54 +09:00
hehihoho3@gmail.com
c11a4e9561 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-28 12:23:42 +09:00
hehihoho3@gmail.com
07877fd70a Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-28 12:22:59 +09:00
hehihoho3@gmail.com
b5f2af6a56 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-28 11:42:26 +09:00
hehihoho3@gmail.com
70f5d21b25 문자전송 배치 테스트 2024-11-28 11:41:14 +09:00
hehihoho3@gmail.com
aa51dd1755 문자전송 배치 테스트 2024-11-28 11:34:51 +09:00
hehihoho3@gmail.com
26d9cadc81 ajax test 2024-11-28 11:08:56 +09:00
hehihoho3@gmail.com
768468dd3a +test ajax 2024-11-28 10:53:19 +09:00
subsub
0b7a86ef73 24/11/28 불법스팸방지정책 수정 2024-11-28 10:32:55 +09:00
hehihoho3@gmail.com
118a60fe8b 배치 사이즈 수정해서 테스트 2024-11-28 09:37:33 +09:00
hehihoho3@gmail.com
645a410e24 문자전송 insert batch 로 구현 테스트 2024-11-28 09:21:03 +09:00
hehihoho3@gmail.com
8e7f678be0 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-27 16:56:50 +09:00
hehihoho3@gmail.com
daf732fe3f custom idgen 수정 2024-11-27 16:56:29 +09:00
hehihoho3@gmail.com
9381dbb53a custom idgen 수정 2024-11-27 16:26:46 +09:00
hehihoho3@gmail.com
f44acfe2c4 문자전송개선 테스트 2024-11-27 16:15:30 +09:00
Eunjipark
790a26a6aa 2024/11/27 팩스발송 > 텍스트 및 링크 수정 2024-11-27 14:10:34 +09:00
wyh
843620f043 하단 불법스팸방지정책 이동 수정 2024-11-26 16:55:47 +09:00
wyh
2da0933ca0 휴면계정 및 기업반려 회원 노출정보 수정 2024-11-26 16:53:58 +09:00
wyh
e39c66e833 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-26 09:52:15 +09:00
wyh
84f9393791 이용약관 > 불법스팸방지정책 페이지 수정 2024-11-26 09:52:07 +09:00
subsub
94ff848e0c 2024/11/25 보안로그인 추가 2024-11-25 14:29:02 +09:00
Eunjipark
093f3a0497 2024/11/25 불법스팸방지정책 pdf 파일 6차로 업로드 2024-11-25 11:34:59 +09:00
Eunjipark
741cc40bd3 2024/11/25 불법스팸방지 정책 수정 2024-11-25 11:31:12 +09:00
wyh
e549a2b870 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 18:37:41 +09:00
wyh
3a4ca45828 팝업노출 날짜 수정 2024-11-22 18:37:35 +09:00
hehihoho3@gmail.com
332c9f458a Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 18:31:54 +09:00
hehihoho3@gmail.com
1ee0fc0506 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 18:29:10 +09:00
hehihoho3@gmail.com
ee8148d855 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 18:28:06 +09:00
Eunjipark
c2b6637c79 2024/11/22 보안로그인 서비스 팝업 2 2024-11-22 18:24:29 +09:00
hehihoho3@gmail.com
38a7e7c8fb Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 18:24:12 +09:00
hehihoho3@gmail.com
c7438cf7c3 try catch 추가 오류 모니터링 2024-11-22 18:23:17 +09:00
Eunjipark
6008d77539 2024/11/22 보안로그인 서비스 팝업 2024-11-22 18:07:45 +09:00
hehihoho3@gmail.com
aeccdf7434 보안로그인 > 로그인 로그 3개월 전만 조회 2024-11-22 17:59:35 +09:00
hehihoho3@gmail.com
cbb66335e0 보안로그인 문구수정 2024-11-22 17:20:43 +09:00
hehihoho3@gmail.com
78837eecf8 최신 수정내용 포멧 수정, 메모 maxlength 25 추가, 휴대폰등록 최대 5개 ip등록 최대 10개 수정 2024-11-22 16:18:08 +09:00
hehihoho3@gmail.com
861c70c5b1 토글스위치 스크립트 수정 2024-11-22 15:25:15 +09:00
hehihoho3@gmail.com
fd471b0e55 보안로그인 최근변경 날짜 추가 2024-11-22 15:20:05 +09:00
hehihoho3@gmail.com
f34fa7b585 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 14:30:56 +09:00
hehihoho3@gmail.com
40ffc2beab Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 14:05:14 +09:00
hehihoho3@gmail.com
3f974c00c4 2차 인증 체크 2024-11-22 14:04:48 +09:00
subsub
cf35c07140 Merge branch 'master' of
http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git

Conflicts:
	src/main/webapp/publish/mypage_index_2024.html
2024-11-22 12:29:20 +09:00
subsub
3087d39dcb 2024/11/22 보안로그인 디자인 수정 2024-11-22 12:26:27 +09:00
hehihoho3@gmail.com
2b6dd7a425 상단 보안로그인 - 링크 추가 2024-11-22 12:09:31 +09:00
hehihoho3@gmail.com
51e68a1cc7 보안로그인 > 접속 IP관리 > 정렬 순서 수정 2024-11-22 11:47:44 +09:00
hehihoho3@gmail.com
32d01399c2 보안로그인 진행중 2024-11-22 11:27:38 +09:00
hehihoho3@gmail.com
e959c0e6ee Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 10:58:47 +09:00
hehihoho3@gmail.com
aeea09e63e 보안로그인 테스트 진행중 2024-11-22 10:58:39 +09:00
myname
da6578ce02 Merge branch 'master' of http://vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 10:51:41 +09:00
myname
d31ab64816 2024-11-22 10:51 과부하 쿼리 주석처리 2024-11-22 10:51:21 +09:00
wyh
030c588658 본인인증 LOG 추가 2024-11-22 10:42:10 +09:00
wyh
31c498fa3c 인증 수정 2024-11-22 10:33:13 +09:00
wyh
96054eed95 mj_msg_data 백업 스케줄러 주석처리 2024-11-22 10:04:34 +09:00
wyh
e19c07e0f1 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-22 09:54:25 +09:00
wyh
e0e5f9739b mj_msg_data 테이블 11월 22일 백업 스케줄러 주석처리 2024-11-22 09:54:16 +09:00
ab3641ee9a 수정 2024-11-21 22:49:22 +09:00
df208e65d8 Merge branch 'tolag3'
추돌 커밋
2024-11-21 22:46:36 +09:00
15df969634 변경 2024-11-21 22:44:17 +09:00
hehihoho3@gmail.com
0de4aeb485 인증번호 확인 오류 수정 2024-11-21 22:23:56 +09:00
hehihoho3@gmail.com
bee412376c +보안로그인 컨트롤러 체크 완료 2024-11-21 21:59:12 +09:00
hehihoho3@gmail.com
7a38574459 보안로그인 top 2024-11-21 20:57:16 +09:00
hehihoho3@gmail.com
2ef22663d8 보안로그인 토글 2024-11-21 20:54:38 +09:00
hehihoho3@gmail.com
3dceedeabc 허용IP등록 2024-11-21 20:29:12 +09:00
hehihoho3@gmail.com
9b3a4a3362 보안로그인 진행중 2024-11-21 20:11:38 +09:00
hehihoho3@gmail.com
9c40db1374 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-21 17:51:50 +09:00
hehihoho3@gmail.com
2f58db34b1 보안로그인 진행중 2024-11-21 17:51:37 +09:00
subsub
265e29a513 2024/11/21 css 수정 2024-11-21 17:47:39 +09:00
Eunjipark
4675554266 2024/11/21 불법스팸방지정책 수정2 2024-11-21 17:14:26 +09:00
subsub
b7411be08a 2024/11/21 보안로그인 on/off 수정, 로그인 정보창 보안로그인 추가 2024-11-21 16:42:56 +09:00
hehihoho3@gmail.com
2e7852a002 마이페이지 > 보안로그인 : 인증번호 등록 완료 2024-11-21 15:25:23 +09:00
hehihoho3@gmail.com
2cd528196e Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-21 10:08:57 +09:00
hehihoho3@gmail.com
d090114d3f 오류수정 2024-11-21 10:08:51 +09:00
hehihoho3@gmail.com
1f46dca39a 오류수정 2024-11-21 10:01:39 +09:00
hehihoho3@gmail.com
9741b0e43a 마이페이지 > 보안로그인 < 퍼블 2024-11-21 09:59:42 +09:00
hehihoho3@gmail.com
abb8b9017c Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-21 09:16:49 +09:00
hehihoho3@gmail.com
57e2f874d6 마이페이지 보안설정중 2024-11-21 09:16:37 +09:00
subsub
e16a744087 Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-20 16:17:59 +09:00
subsub
24924aa1a1 2024/11/20 보안로그인 페이지 수정 2024-11-20 16:17:48 +09:00
Eunjipark
a11914e5a2 2024/11/20 불법스팸방지정책 가이드 추가 2024-11-20 14:16:00 +09:00
Eunjipark
808f156966 2024/11/20 불법스팸방지정책 수정 2024-11-20 14:13:41 +09:00
kmg
35a65bfe3a 2024/11/20 테스트 2024-11-20 13:51:17 +09:00
hehihoho3@gmail.com
88fd5b0223 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-20 12:44:07 +09:00
hehihoho3@gmail.com
6223dd1cdb 인증번호 패키지화 완료 2024-11-20 12:44:01 +09:00
wyh
3b0322a046 개발서버 IP 등록 2024-11-20 11:23:38 +09:00
wyh
4755c88f39 보안인증 본인인증 기능 추가 2024-11-20 11:10:11 +09:00
hehihoho3@gmail.com
34efc8d6fb Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-20 10:02:27 +09:00
hehihoho3@gmail.com
78475e2b45 IP 인증 패키지 2024-11-20 10:02:16 +09:00
wyh
7ef800dc2b 팝업링크 오류 수정 2024-11-19 18:45:15 +09:00
wyh
c7a30ec4ea 보안강화 인증수단 도입 팝업 추가 2024-11-19 18:35:04 +09:00
Eunjipark
06fec12b45 2024/11/19 팝업수정 2차 2024-11-19 17:57:55 +09:00
kmg
0b22c3160b 2024/11/19 팝업수정 1차 2024-11-19 17:39:16 +09:00
subsub
7b464e5a38 Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-19 17:02:57 +09:00
subsub
2cfa8a2fe9 2024/11/19 인증 휴대폰번호관리 팝업 추가 2024-11-19 17:02:50 +09:00
hehihoho3@gmail.com
ed11fae311 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-19 14:13:43 +09:00
hehihoho3@gmail.com
0f01c43ead 마이페이지 > 보안로그인 화면 2024-11-19 14:13:37 +09:00
subsub
159a5bd67d Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-19 14:07:42 +09:00
subsub
85aab75a9c 2024/11/19 보안로그인 수정 2024-11-19 14:07:25 +09:00
hehihoho3@gmail.com
d69435b068 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-19 12:12:55 +09:00
hehihoho3@gmail.com
d48ac05bec 관리자 - 인증번호 수정 및 별칭 추가 2024-11-19 12:12:49 +09:00
subsub
f24aebf79f 2024/11/19 보안로그인 주석 추가 2024-11-19 12:01:25 +09:00
subsub
72538da688 2024/11/19 마이페이지 대시보드 보안 로그인 추가 2024-11-19 11:49:43 +09:00
hehihoho3@gmail.com
4f2a0e28b6 휴대폰번호 다중번호 인증 체크 로직 2024-11-18 20:20:36 +09:00
hehihoho3@gmail.com
3e2e039c80 다중 인증 휴대폰 번호 관리 로직 추가 2024-11-18 19:27:19 +09:00
myname
780e8f14a5 Merge branch 'master' of http://vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-18 15:05:17 +09:00
myname
b3015c26c5 2024-11-18 15:04 사용자 로그인시 핸드폰 번호 체크 쿼리 수정 2024-11-18 15:04:59 +09:00
hehihoho3@gmail.com
060c8afe41 발송로직 진행중 2024-11-18 11:23:17 +09:00
wyh
b109c9b441 휴먼계정인경우 본인인증 페이지 이동기능 수정 2024-11-18 11:05:49 +09:00
wyh
2b46907054 로그인페이지 수정 및 ID/PW 입력시 로그인 페이지 이동 기능 수정 2024-11-18 09:35:19 +09:00
myname
51980d12b3 2024-11-17 02:45 사용자 로그인시 아이디/비번 인증에 핸드폰 인증 추가 2024-11-17 02:45:52 +09:00
hehihoho3@gmail.com
666b26f568 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-14 10:28:52 +09:00
hehihoho3@gmail.com
3bfa09117c Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-14 10:28:31 +09:00
hehihoho3@gmail.com
cbbcb20de8 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-14 10:27:19 +09:00
hehihoho3@gmail.com
46239b4b3e lombok으로 인한 get 수정 2024-11-14 10:27:05 +09:00
hehihoho3@gmail.com
e9d9eaaa1b lombok으로 인한 get 수정 2024-11-14 10:25:31 +09:00
hehihoho3@gmail.com
eaa13562d6 메뉴에 rosewiper 조건 제거 2024-11-14 10:22:27 +09:00
hehihoho3@gmail.com
21d606d92d 메뉴에 조건 중 192.168.0.33 (우영두팀장IP) 제거 2024-11-14 10:20:30 +09:00
hehihoho3@gmail.com
2338360e49 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-14 10:12:25 +09:00
hehihoho3@gmail.com
b44427affa Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-14 10:12:03 +09:00
hehihoho3@gmail.com
59cb474616 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-14 09:46:10 +09:00
rosewiper
153ae2ad60 고트래픽 API 서버 아이피 차단 예외 처리 2024-11-11 14:34:50 +09:00
rosewiper
47b7125d34 고트래픽 아이피 차단에서 API 서버 아이피는 예외되도록 쿼리 수정 2024-11-11 14:26:44 +09:00
wyh
50e5811b9b Merge branch 'advc' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-11 09:16:50 +09:00
wyh
39ed2f8706 팩스 주소록 삭제기능 수정중 2024-11-11 09:16:27 +09:00
hehihoho3@gmail.com
8561a824f4 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-08 17:53:08 +09:00
hehihoho3@gmail.com
9f4644f3b1 문자발송 기능개선중 2024-11-08 17:52:57 +09:00
hehihoho3@gmail.com
d64a50dad2 ROOT log레벨 수정 OFF => DEBUG 2024-11-08 17:52:51 +09:00
wyh
fb59293a5e 등록 로딩바에 숫자 카운트 진행기능 수정 2024-11-08 17:14:41 +09:00
wyh
9b66d4a7a0 팩스 주소록 등록기능 수정 2024-11-08 16:52:52 +09:00
wyh
d2fa81e3d3 스케줄러 기능 수정 2024-11-07 19:27:44 +09:00
wyh
b62c397320 리스트 카운트 추가 2024-11-07 19:05:49 +09:00
wyh
a9719735e8 수정중 입니다. 2024-11-07 18:02:00 +09:00
wyh
fb1882ed4f Merge branch 'advc' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-07 15:37:33 +09:00
wyh
dc23493ed8 환불스케줄러 원복 및 주석 추가 2024-11-07 15:06:08 +09:00
wyh
8afad77998 스케줄러 주석 해제 및 limit 해제 2024-11-07 11:27:50 +09:00
hehihoho3@gmail.com
42ff118484 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-07 11:20:27 +09:00
hehihoho3@gmail.com
81e14b01a4 주소록 유효성검사 cmm.js 패턴 추가 2024-11-07 11:19:40 +09:00
wyh
fe62453073 환불 스케줄 중지 2024-11-06 18:57:29 +09:00
wyh
1d67364ad3 스케줄러 500개로 줄임 2024-11-06 18:44:10 +09:00
wyh
7c9b7edb29 수정중 2024-11-06 18:23:26 +09:00
wyh
3cc2f03f16 문자발송 실패건에 대한 환불 대상 리스트 스케줄 쿼리 추가 2024-11-06 17:53:33 +09:00
wyh
7e2b27f673 환불 스케줄러 변경 2024-11-06 17:44:33 +09:00
wyh
da5253894d 개인정보동의 팝업 안보이기 주석제거 2024-11-06 13:59:22 +09:00
wyh
77d7d5fdae 임시 주석처리 2024-11-06 12:53:43 +09:00
wyh
3fd179f3f1 수정중 2024-11-06 12:51:53 +09:00
wyh
34b31a28c1 최초 약관 오픈기능 수정 2024-11-06 11:06:56 +09:00
hehihoho3@gmail.com
e7eee5528d Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-06 11:06:32 +09:00
hehihoho3@gmail.com
0e109c6d78 advc 문자발송 기존코드로 연결 2024-11-06 11:06:02 +09:00
kmg
a8a3286256 2024/11/06 개인정보처리방침 바로가기 링크수정 2024-11-06 09:51:06 +09:00
hehihoho3@gmail.com
e2842cbe9b Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-05 19:06:31 +09:00
hehihoho3@gmail.com
8f92c9779a Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-05 19:02:16 +09:00
hehihoho3@gmail.com
b7db0bd16e Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-11-05 19:01:56 +09:00
wyh
9307bd9d39 스케줄러 오류관련 로그 추가 2024-11-05 18:06:12 +09:00
wyh
8d7fe25978 Merge branch 'master' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git 2024-11-05 17:48:15 +09:00
wyh
b9b902e8e0 환불 로직 try catch 추가 2024-11-05 17:48:06 +09:00
wyh
595d927acf 이용약관 관련 기능 수정 2024-11-05 17:47:42 +09:00
subsub
d0f5b93305 24/11/05 개인정보처리방침 바로가기 버튼 추가 2024-11-05 15:54:04 +09:00
wyh
308b78b27e 개인정보처리방침 팝업 2024-11-05 15:11:24 +09:00
wyh
526b1d6895 팩스 주소록 엑셀파일 등록 기능 수정 2024-11-05 12:36:04 +09:00
Eunjipark
8fd7531182 2024/11/05 이용약관 팝업 2024-11-05 11:54:51 +09:00
wyh
db5d02ca54 팝업 날짜 수정 2024-11-01 15:07:07 +09:00
wyh
6c761267a9 수정 2024-11-01 14:36:07 +09:00
wyh
ac6d695b1b Merge branch 'advc' of http://dudgusw@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-11-01 14:35:36 +09:00
wyh
92745aa218 주소록 수정중 2024-11-01 14:35:24 +09:00
Eunjipark
f61988e02d 2024/11/01 작업공지 팝업 2024-11-01 14:18:14 +09:00
rosewiper
053e6c174e 스미싱의심 알림 팝업 페이징 처리 오류 수정 2024-10-29 18:24:32 +09:00
rosewiper
2cc9bbef04 문자온 메인화면 이용약관 팝업 노출 및 링크 적용 2024-10-28 18:29:19 +09:00
rosewiper
ea65c7187e 이용약관 팝업 주석처리 2024-10-28 16:34:20 +09:00
rosewiper
efdac4a3eb 메인화면 이용약과 팝업 3일간 열지 않기 쿠키 설정 추가 2024-10-28 16:21:24 +09:00
rosewiper
bf2a52fe73 Merge branch 'master' into rosewiper 2024-10-28 15:51:50 +09:00
rosewiper
8cc222a7ad 이용약관 및 개인정보 내용 수정 2024-10-28 15:50:38 +09:00
Eunjipark
5fcf547012 2024/10/28 이용약관 및 개인정보처리방침 팝업 2024-10-28 15:38:27 +09:00
rosewiper
c46ad54c70 Merge branch 'master' into rosewiper 2024-10-28 12:54:06 +09:00
Eunjipark
3562ef3a09 2024/10/28 이용약관 및 개인정보처리 방침 수정_3 2024-10-28 12:38:46 +09:00
rosewiper
51352928a6 이용약과 및 개인정보 처리방침 내용 수정
Footer 및 사이트맵 메뉴 이용약관/개인정보 링크 Url 수정
2024-10-28 12:15:25 +09:00
kmg
8e1a69899d 2024/10/28 개인정보처리방침 2022,2023 목차 삭제 2024-10-28 12:08:33 +09:00
kmg
9254b9e0e9 2024/10/28 개인정보처리방침 2022,2023 목차 삭제 2024-10-28 12:08:33 +09:00
rosewiper
36703d6284 Merge branch 'master' into rosewiper 2024-10-28 11:33:30 +09:00
kmg
7d18d9c9a2 2024/10/28 폰트 사이즈 수정 2024-10-28 11:00:56 +09:00
Eunjipark
542144183c 2024/10/28 이용약관 및 개인정보처리 방침 수정_2 2024-10-28 10:57:26 +09:00
subsub
9f79c14e7a 2024/10/28 선거문자 20건 수동분할 2024-10-28 09:37:50 +09:00
rosewiper
fcf226c634 이용약관, 개인정보 탭에 날짜 표시 제거 2024-10-25 17:24:31 +09:00
rosewiper
7dc59abe98 이용약관 및 개인정보 내용 수정 3차 2024-10-25 17:18:15 +09:00
rosewiper
a0ac0efa32 Merge branch 'master' into rosewiper 2024-10-25 17:08:07 +09:00
rosewiper
6ea29eaec2 테스트 2024-10-25 17:07:54 +09:00
rosewiper
22f5be522c 회원 이메일 발송 건수 15분 단위로 기존 200건 -> 500건으로 변경 2024-10-25 16:52:59 +09:00
kmg
404f2398bb 2024/10/25 이용약관 및 개인정보처리 방침 수정 2024-10-25 16:50:29 +09:00
rosewiper
394fd08094 이용약관 및 개인정보 처리방침 2차 수정 완료 2024-10-25 14:44:21 +09:00
rosewiper
0fa5bacd14 이용약관 및 개인정보 처리방침 화면 변경 1차 개발 완료 2024-10-25 12:39:47 +09:00
kmg
3272ff0bd2 2024/10/24 css수정 2024-10-24 18:33:11 +09:00
kmg
f77ac33584 2024/10/24 약관 및 개인정보처리방침 수정 2024-10-24 18:28:50 +09:00
Eunjipark
6ac49af5b2 2024/10/24 개인정보처리방침 수정_3 2024-10-24 17:43:26 +09:00
Eunjipark
41695f67bd 2024/10/24 개인정보처리방침 수정_2 2024-10-24 14:29:33 +09:00
wyh
7559e22a1b 팩스발송 주소록 불러오기, 엑셀불러오기 기능 수정 2024-10-24 14:17:18 +09:00
kmg
55d38e5634 2024/10/24 개인정보처리방침 수정 2024-10-24 10:22:47 +09:00
subsub
74fadd4403 2024/10/23 이용약관 2024-10-23 17:20:03 +09:00
kmg
26c09d81b3 2024/10/23 개인정보처리방침수정 2024-10-23 16:21:49 +09:00
wyh
53c0fab7ea 알림톡 발송 시 대체문자 길이 확인 로그 추가 2024-10-21 14:00:23 +09:00
hehihoho3@gmail.com
b2a89f11bd Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-10-21 09:18:04 +09:00
wyh
16ebfadeb8 회원가입 광고문자 관련법령 팝업기능 추가 2024-10-17 14:45:38 +09:00
wyh
a89f3cf0c1 불법스팸 유의사항 리스트 위치 변경 2024-10-17 14:31:13 +09:00
wyh
da3567b8c1 알림톡 대체문자시 XSS에 관련 특수기호 변경 2024-10-17 14:21:40 +09:00
wyh
c34af54291 알림톡 테스트 페이지 전송오류 수정 2024-10-17 14:12:00 +09:00
wyh
e46a95b02b 선거문자 업로드 수정 2024-10-17 11:45:14 +09:00
wyh
7102f9690d 스팸 규제 안내 수정 2024-10-15 15:32:33 +09:00
hehihoho3@gmail.com
a64c8bc69b Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-10-15 14:51:34 +09:00
wyh
002869ec69 선거문자 주소록 불러오기 기능 수정 2024-10-15 14:49:21 +09:00
kmg
6a570cec8a 2024/10/15 스팸 규제 안내 문구 개선 2024-10-15 10:40:56 +09:00
wyh
22fd765c66 이름 사이에 따움표 추가 2024-10-14 16:37:55 +09:00
wyh
7d17c6ded0 불법스팸 유의사항 안내 관련 문자내용 추가 2024-10-14 16:26:41 +09:00
hehihoho3@gmail.com
ea0c4c7ef4 주소록 완료 2024-10-11 16:45:39 +09:00
hehihoho3@gmail.com
c2c68f6113 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-10-11 16:00:22 +09:00
hehihoho3@gmail.com
8dd8e23af1 발송 진행중 2024-10-11 16:00:07 +09:00
wyh
572b0e58c0 선거문자 엑셀 불러오기 기능 수정, 주소록 불러오기 오류 수정, 불필요한 코드 제거 2024-10-11 11:25:39 +09:00
wyh
0bf507cb4d 포토게시판 이미지 노출관련 수정 2024-10-07 09:29:35 +09:00
wyh
b82f63b014 포토게시판 그림 노출 관련 수정 2024-10-07 09:13:24 +09:00
Eunjipark
51b435f60d 2021/10/2 첫결제 이벤트 페이지 > 이미지 수정 2024-10-02 11:17:54 +09:00
hehihoho3@gmail.com
b7fe16bddf 문자전송 로직 리펙토링 중 2024-09-30 11:30:54 +09:00
wyh
07800e4543 선거문자 엑셀 불러오기 엑셀팝업 jsp 따로 추가 2024-09-30 09:54:47 +09:00
wyh
adfc5fbf12 선거문자 엑셀불러오기 기능수정 2024-09-30 09:35:56 +09:00
subsub
2e69da4f15 2024/09/27 width 값 변경 2024-09-27 17:48:32 +09:00
subsub
9517a328c2 24/09/27 문자전송 > 대량등록 width 값 수정 2024-09-27 17:14:24 +09:00
hehihoho3@gmail.com
3c6e83d10b 문자발송로직 impl 화 완료 -> 리펙토링 진행 중 2024-09-27 14:31:27 +09:00
rosewiper
df842a91a0 카카오톡 채널ID 등록 오류 발생시 Alert 메세지 변경 2024-09-26 11:29:52 +09:00
rosewiper
a0831d76c4 관리자 sms 자동 이미치 첨부기능 원복
관리자전송리스트 상세화면 이동 기능 변경
2024-09-26 11:11:42 +09:00
rosewiper
c390b02134 최근 문자전송 상세 팝업 화면 추가 2024-09-25 11:21:09 +09:00
rosewiper
39a9da9e50 관리자 회원상세 팝업
최근문자전송 리스트 팝업 상세 리스트 조회 화면 추가
2024-09-24 18:29:19 +09:00
rosewiper
ec6550dbc0 회원정보 상세 SMS 발송 시 광고규정 및 수신동의 안내 메시지 선택에 대한 이미지 자동 전송 처리 추가 2024-09-24 15:30:19 +09:00
rosewiper
c8447b21b8 회원상세, 맞춤제작, 주소록대행 화면 문자발송 기능 추가 및 변경 2024-09-24 14:39:19 +09:00
hehihoho3@gmail.com
f1b873cb9c 문자전송 jsp 백업 2024-09-23 12:27:52 +09:00
hehihoho3@gmail.com
b212279482 선거문자 > 단체문자 : 인코딩 문제 해결 2024-09-23 09:58:21 +09:00
hehih
259f27d6cc 주소록 그룹삭제 기능 수정 -> grp 테이블에 delete y 처리 후 select에서 where delete='N' 만
가져오게 수정
2024-09-19 19:09:27 +09:00
hehih
6c43799f2b 문자전송 > 엑셀불러오기 > 타이틀 간격 맞춤 2024-09-19 12:02:22 +09:00
hehih
4f5a477561 문자전송 > 엑셀 불러오기 || 주소록 > 엑셀 불러오기 -> 오류수정 번호 빈값 안나오게 처리 2024-09-19 11:40:50 +09:00
hehih
08ca5447ba 엑셀 업로드 파일용량 확인 2024-09-19 10:41:28 +09:00
hylee
3b093dcdb1 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-11 17:44:13 +09:00
hylee
f36b1f454c 주소록 그룹삭제 작업중 2024-09-11 17:44:00 +09:00
subsub
bc89d7ae07 24/09/11 console.log 삭제 2024-09-11 15:56:27 +09:00
subsub
2929595d35 Merge branch 'advc' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-11 15:55:37 +09:00
subsub
34b874e64d 240911 주소록대량등록 타뷸레이터 width 변경 수정 2024-09-11 15:55:22 +09:00
hylee
15c2ee77c4 주소록 직접입력 - 카운트 중복, 오류 삭제 2024-09-10 17:11:46 +09:00
hylee
598f60872c 주소록 직접입력 - 전체삭제 선택삭제 구현 2024-09-10 16:57:53 +09:00
hylee
ddaca97fb0 주소록 - 직접입력 총 카운트 로직 수정 2024-09-10 16:41:18 +09:00
hylee
2e71636191 주소록 엑셀 등록 - 오류 0건 초기화 모듈 추가 2024-09-10 16:19:54 +09:00
hylee
45eaf99f86 주소록 엑셀 upload log 처리 2024-09-10 16:14:29 +09:00
hylee
fa2ea7ccdc 타블레이터와 타이틀 간격 맞추기 2024-09-10 16:09:43 +09:00
hylee
2b1269ac28 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-10 11:01:19 +09:00
hylee
c598edc32c 주소록 삭제 로딩바 추가 2024-09-10 11:01:12 +09:00
subsub
59e3fc4617 24/09/10 주소록 등록 타뷸레이터 width 값 변경 2024-09-10 10:56:11 +09:00
hylee
60ad230120 Merge branch 'master' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc

Conflicts:
	src/main/java/itn/let/mjo/pay/service/MjonPayVO.java
2024-09-10 09:47:09 +09:00
hylee
39f5517263 주소록 등록 팝업 수정 2024-09-10 09:44:34 +09:00
hylee
3dc7ecd3d8 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc

Conflicts:
	src/main/webapp/js/web/addr/init.js
2024-09-09 18:31:02 +09:00
hylee
813ce808b9 주소록 수정중 2024-09-09 18:28:57 +09:00
subsub
529f6c75b7 24/09/09 주소록 대량등록 타뷸레이터 width 값 변경 시 위에 select 선택 div 동일하게 변경 2024-09-09 16:53:51 +09:00
hylee
9328e68d6f 주소록 탭마다 문구 수정 및 문자전송 엑셀 불러오기도 동일하게 맞춤 2024-09-05 18:04:35 +09:00
hylee
be16978886 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-04 18:46:43 +09:00
hylee
a6cc44ed8a 주소록 유효성/중복 검사 성능 개선 2024-09-04 18:46:30 +09:00
hylee
4538a78089 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc
2024-09-03 17:12:07 +09:00
hylee
1ad3fff84e Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-03 16:40:15 +09:00
hylee
58357b7891 rowData[key] = typeof row[idx] === 'string' ? row[idx].trim() :
row[idx]; // 문자열인지 확인하고 trim() 적용
2024-09-03 16:39:59 +09:00
hylee
10ce23144d 주소록관리 > 주소록 대량등록 > 엑셀입력 > 파일 업로드 > 핸드폰 영역 선택 -> 카운트와 결과 팝업 완료 2024-09-02 17:41:09 +09:00
subsub
59e35e7956 Merge branch 'advc' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-02 10:05:00 +09:00
subsub
de796e5fea 24/09/02 주소록 대량등록 팝업 2024-09-02 10:04:35 +09:00
hylee
116ae683d5 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-09-02 09:50:55 +09:00
hylee
6ea9e39a98 주소록 등록 배치크기 조정 : js 3만, java batchX 2024-09-02 09:50:42 +09:00
subsub
d2ddcd1ba4 2024/09/02 주소록 대량등록 화면 2024-09-02 09:36:07 +09:00
hylee
d5bd9fb7ee Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-08-29 17:50:20 +09:00
hylee
364328c959 주소록 30만건 테스트 - js 15000건 2024-08-29 17:49:49 +09:00
hylee
385d1aa28f 주소록 30만건 테스트 2024-08-29 17:27:22 +09:00
hylee
c460ab2e3f Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git
into advc

Conflicts:
	src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
2024-08-28 14:24:56 +09:00
hylee
83beeb1b7e 문자전송 > 주소록 불러오기 건수 테스트 2024-08-28 14:23:56 +09:00
hylee
156700aa4c 문자전송 > 주소록 불러오기 건수 테스트 2024-08-28 14:07:17 +09:00
hylee
c72fd172ed 문자전송 > 주소록 불러오기 > 선택한 데이터만 넣기 getData()에서 getSelectedData() 로 수정 2024-08-27 16:00:45 +09:00
hylee
c1a34e5c16 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-08-27 15:25:04 +09:00
hylee
d733f1d67b 문자발소 > 받는사람 번호 입력하면 줄바꿈 기준으로 벨류 체크 후 등록 2024-08-27 15:00:14 +09:00
hylee
18f472db16 엑셀 팝업에서 메모 열 제거하고 간격 맞춤 2024-08-27 11:43:24 +09:00
subsub
2fb99b0485 2024/08/27 번호추가 ? 호버 시 팝업 노출 수정 2024-08-27 10:28:04 +09:00
subsub
a8e7f62a6d 2024/08/26 문자전송 수정 2024-08-26 15:58:30 +09:00
hylee
7ae128f21d [사용자] 맞춤제작 > 맞춤제작 샘플 > 맞춤제작 요청 ==> 입력값 오류 - 스크립트 back 코드 추가 2024-08-23 17:18:58 +09:00
hylee
69af137b06 문자전송 > 미리보기 기능 완료 2024-08-23 15:59:35 +09:00
hylee
822afdfc76 문자 미리보기 진행중 2024-08-23 09:33:42 +09:00
myname
1411959cce 2024-08-22 12:29 주소록 전체 검색 안되도록 쿼리 수정 2024-08-22 12:30:14 +09:00
myname
2d8ef11cab 2024-08-21 14:59 주소록 관리 성능 향상을 위한 쿼리 변경 2024-08-21 15:00:14 +09:00
hylee
3cb8e2178a Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-08-19 12:30:47 +09:00
hylee
3e6ca8d7dd 주소록관리 > 클립보드 입력 진행중 2024-08-19 12:30:30 +09:00
subsub
f857edd7b8 문자전송 미리보기 2024-08-14 17:41:30 +09:00
hylee
5482ac94fb 문자전송 > 주소록 추가버튼 오류수정(클릭시 화면 안없어짐) 2024-08-14 12:42:55 +09:00
hylee
9079e3fe7b 문자전송 > 엑셀불러오기 완료 ( TODO:오류번호검사, 오류검사, 설명문구, 샘플파일 등등 은 cs팀에서 결정하고
알려준다합니다.)
2024-08-14 12:03:46 +09:00
hylee
a985ce5d6d 문자전송 엑셀기능 작업중 2024-08-14 09:28:18 +09:00
hylee
d8242e4509 Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-08-12 15:22:32 +09:00
hylee
307ce85acf 주소록 등록 function ajax 배치로 진행중 2024-08-12 15:22:18 +09:00
myname
d6945485d2 Merge branch 'advc' of http://vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-08-09 17:31:28 +09:00
myname
370fff91a4 주소록 수량 변경 및 배치 수량 변경 & 배너광고 주석 처리 2024-08-09 17:31:02 +09:00
hylee
30914b0d69 주소록 핸드폰 벨류체크 / 로딩 active 추가 2024-08-09 16:52:40 +09:00
hylee
8d57c2f2cf Merge branch 'master' into hylee 2024-08-08 09:46:48 +09:00
hylee
d8f3a8a4bf 주소록 퓨대폰 선택시 중복체크 - 스크립트 오류 해결 2024-08-06 12:38:47 +09:00
hylee
eb21962338 Merge branch 'master' into hylee 2024-08-02 18:24:20 +09:00
hylee
72f3d54b61 주소록 속도 개선중 2024-08-02 18:22:55 +09:00
hylee
1b1af3034f 10만건 한번에 insert - 개발서버에서 테스트 2024-07-30 11:02:45 +09:00
hylee
0d2e8d14a5 BATCH_SIZE = 10000; 2024-07-30 10:34:56 +09:00
hylee
6abf67ed51 private static final int BATCH_SIZE = 15000;
private static final int THREAD_COUNT = 3;
2024-07-30 10:16:25 +09:00
hylee
f8a41b8320 주소록
private static final int BATCH_SIZE = 10000;
    private static final int THREAD_COUNT = 2;
2024-07-30 10:11:13 +09:00
hylee
1fbab54408 THREAD_COUNT = 1; // 적절한 스레드 수 설정 2024-07-29 18:02:48 +09:00
hylee
2ce837aa62 BATCH_SIZE = 10000; 2024-07-29 17:53:55 +09:00
hylee
97cbc423a9 주소록 등록 : 쓰레드 4개 추가 - 배치 사이즈 60000개 2024-07-29 17:46:30 +09:00
hylee
a806de33b9 배치사이즈 조정 BATCH_SIZE = 60000; 2024-07-29 17:35:14 +09:00
hylee
a776b1fff2 BATCH_SIZE = 100000; 2024-07-29 17:27:51 +09:00
hylee
8b3bd9b951 주소록
BATCH_SIZE = 100000; 으로 수정
2024-07-29 16:30:29 +09:00
hylee
b5b048e55c java.lang.OutOfMemoryError: Java heap space 에러로인한 배치로 2024-07-29 16:23:43 +09:00
hylee
821e6dec07 주소록 임시로 500만개로 등록기준 변경 2024-07-29 16:13:18 +09:00
hylee
1e17f07566 데이터 오류 확인 2024-07-29 15:55:09 +09:00
hylee
fc33fff87e 주소록 > 엑셀입력 완료 2024-07-29 15:25:11 +09:00
hylee
ea9dba2146 Merge branch 'master' into hylee 2024-07-25 18:26:12 +09:00
hylee
cabf73ad98 주소록 진행중 2024-07-25 18:21:25 +09:00
hylee
c60d29fb02 타블레이터 버전 업글로 인한 수정 2024-07-25 18:21:08 +09:00
hylee
f949d7fc56 타블레이터 버전 업그레이드 2024-07-25 18:20:55 +09:00
hylee
5b7f7f6770 Merge branch 'master' into hylee 2024-07-19 11:32:34 +09:00
hylee
01cd8f78a6 dateUtils.js or java 작업 2024-07-19 11:30:31 +09:00
hylee
fb44ab739d Merge branch 'master' into hylee 2024-07-16 12:35:39 +09:00
hylee
234f3ccd27 결제관리 > 요금 사용내역 ==> 오류 수정 2024-07-16 12:17:17 +09:00
hylee
04f56b42f9 [사용자] 결제관리 > 요금 결제내역 ==> 이번년도 버튼 넣어주세요 2024-07-16 10:55:13 +09:00
hylee
5fc8420d15 [사용자] 팩스 발송 리스트 => 발송결과로 이동 2024-07-15 16:37:43 +09:00
hylee
e280a9d1ce fax 화면 개선 중 2024-07-15 12:48:04 +09:00
hylee
082070c424 공통 JS src/main/webapp/publish/js/urlUtils.js
src/main/webapp/publish/js/dateUtils.js
2024-07-15 11:50:30 +09:00
hylee
8ce7ee25a3 datautils 함수명 변경 2024-07-15 10:45:44 +09:00
hylee
140056c15a [사용자] 결제관리 > 세금계산서 발행 등록 > 기업 ==>입력값 오류 2024-07-11 14:57:55 +09:00
hylee
33afa6b6c3 [문자온_개선] 고객센터 > 불편 / 1:1 문의 2024-07-11 12:21:38 +09:00
hylee
a8e58ebcf9 [문자온_개선] 마이페이지 > 회원정보 변경 > 기본정보 완료 2024-07-11 11:29:13 +09:00
hylee
608894d5e1 요금 사용내역 캐시 표시 수정 2024-07-11 11:06:10 +09:00
hylee
38fa6d56a8 Merge branch 'hylee' into advc 2024-07-10 18:33:30 +09:00
hylee
2e861d306a [사용자] 카톡발송 > 알림톡 소개 ==>서비스 이용 방법 링크 개선 2024-07-10 18:32:11 +09:00
hylee
a98ed5caa0 [사용자] 결제관리 > 세금계산서 발행 등록 > 개인 ==>입력값 오류 2024-07-10 17:15:14 +09:00
hylee
cf4cf39a74 [사용자] 결제관리 > 요금안내/견적내기 > 견적내기 ==>입력값 오류 2024-07-10 17:08:15 +09:00
hylee
2b52502c50 요금 사용내역 - 포인트 삭제 2024-07-10 15:40:21 +09:00
hylee
20ac4ae75c [사용자] 결제관리 > 요금 결제내역 ==> 요금 결제내역 표시 방법 변경 완료 2024-07-10 15:32:50 +09:00
hylee
42da6a2b7a Merge branch 'hylee' into advc 2024-07-09 18:24:50 +09:00
hylee
132078a756 Merge branch 'master' into hylee 2024-07-09 18:24:25 +09:00
hylee
47836349c7 Merge branch 'hylee' into advc 2024-07-09 18:23:27 +09:00
myname
759adfe0bd Merge branch 'master' of http://vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-07-09 15:40:06 +09:00
hylee
6dc7059184 롬복 추가 , [사용자] 결제관리 > 요금 사용내역 ==> 사용금액 표시 방법 변경 완료 2024-07-09 15:35:10 +09:00
hylee
ce3c41d453 맞춤제작 > 맞춤제작 요청 > 연락처 maxlength=11로 제한 2024-07-08 12:38:57 +09:00
hylee
6d974cae65 금액 포인트 class 수정 2024-07-08 09:45:49 +09:00
hylee
7d2ce518aa date 모듈 수정 2024-07-05 18:33:02 +09:00
hylee
339e233c0b utils 정리중 2024-07-05 16:14:00 +09:00
hylee
9347f1d24a Merge branch 'hylee' into advc 2024-07-05 14:25:56 +09:00
hylee
e3adc46381 [사용자] 결제관리 > 요금 결제내역 ==> 조회에 대한 기건설정 필수값으로 변경 2024-07-05 14:25:10 +09:00
d1e4dd9d6a Merge remote-tracking branch 'origin/advc' into advc 2024-07-05 11:55:24 +09:00
8dddd73713 이준호 문자온 개선 커밋
- 주소록 관리 > 주소록 입력 대행(무료) ==>요청사상 테이블 깨짐 수정
 - http://pms.iten.co.kr:9999/issues/3995
2024-07-05 11:54:41 +09:00
hylee
5c2f7f5e73 fn_cmndataValueChk 모듈 업데이트 2024-07-05 09:48:06 +09:00
hylee
c72f207dfc 날자체크 공통 js 작업 완료 http://pms.iten.co.kr:9999/issues/4031 2024-07-04 18:14:20 +09:00
hylee
9b2fec3aeb [사용자] 결제관리 > 요금 사용내역 ==> 검색기간 필수값으로 변경 하고 기본값 제공 안함 2024-07-04 17:30:24 +09:00
hylee
db60e6fb6b Merge branch 'advc' of http://hylee@vcs.iten.co.kr:9999/hylee/mjon_git into advc 2024-07-04 16:39:17 +09:00
hylee
8aa85c5cc7 [사용자] 맞춤제작 > 내보관함 ==> 검색기간 기본값 제공 2024-07-04 16:38:30 +09:00
myname
3f5f418b1a 2024-06-27 10:29 문자온 타이틀 변경 2024-06-27 10:30:07 +09:00
778 changed files with 275165 additions and 66954 deletions

2
.claude/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/settings.local.json
/mcp_settings.json

BIN
.claude/etc1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
.claude/etc2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

13
.gitignore vendored
View File

@ -96,6 +96,9 @@ local.properties
# End of https://www.gitignore.io/api/eclipse
# gemini
.gemini/
# Maven
target/
pom.xml.tag
@ -198,3 +201,13 @@ fabric.properties
rebel.xml
/mvnw
/mvnw.cmd
/.gemini
/.gemini.zip
/CLAUDE.md
<<<<<<< HEAD
# Mac OS
=======
### Mac OS ###
>>>>>>> refs/heads/5419_전화번호거짓표시50건이상
.DS_Store

85
pom.xml
View File

@ -54,28 +54,8 @@
<repositories>
<repository>
<id>mvn2</id>
<url>https://repo1.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>egovframe</id>
<url>https://www.egovframe.go.kr/maven/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>egovframe2</id>
<url>http://maven.egovframe.kr:8080/maven/</url>
<id>maven-public</id>
<url>http://nexus.iten.co.kr:9999/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
@ -83,12 +63,6 @@
<enabled>false</enabled>
</snapshots>
</repository>
<!-- Komoran 형태소분석기 -->
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<!-- Komoran 형태소분석기 -->
</repositories>
<dependencies>
@ -111,6 +85,7 @@
<groupId>egovframework.rte</groupId>
<artifactId>egovframework.rte.fdl.idgnr</artifactId>
<version>${egovframework.rte.version}</version>
<!--<version>4.2.0</version>-->
</dependency>
<dependency>
<groupId>egovframework.rte</groupId>
@ -143,11 +118,12 @@
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
@ -170,7 +146,7 @@
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
<version>5.1.49</version>
</dependency>
<!-- oracle 10g driver -->
@ -501,12 +477,19 @@
</dependency>
<!-- kmc 본인인증 -->
<dependency>
<!-- <dependency>
<groupId>kmc</groupId>
<artifactId>ICERTSecu_JDK18</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar</systemPath>
</dependency> -->
<!-- kmc 본인인증 ver 2 암호화 모듈 추가 버전 -->
<dependency>
<groupId>kmc</groupId>
<artifactId>ICERTSecu</artifactId>
<version>JDK18_v2</version>
</dependency>
@ -557,7 +540,37 @@
<artifactId>KOMORAN</artifactId>
<version>3.3.4</version>
</dependency>
<!-- Komoran 형태소 분석기 -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- valkey -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.11.RELEASE</version>
</dependency>
<!-- valkey -->
</dependencies>
<build>

View File

@ -0,0 +1,10 @@
package egovframework.com.idgen;
import java.util.List;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
public interface CustomIdGnrService extends EgovIdGnrService {
List<String> getNextStringId(int count) throws FdlException;
}

View File

@ -0,0 +1,196 @@
package egovframework.com.idgen.impl;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement; // java.sql.PreparedStatement로 임포트
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import egovframework.com.idgen.CustomIdGnrService;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrStrategy;
public class CustomTableIdGnrServiceImpl implements CustomIdGnrService {
private long allocatedId;
private long allocatedMaxId;
private int blockSize = 10; // 기본값, 필요에 따라 변경
private DataSource dataSource;
private String table; // 실제 테이블 이름 (: IDS)
private String tableName; // TABLE_NAME 컬럼에서 사용할 (: MSG_ID)
private String columnName = "NEXT_ID"; // NEXT_ID 컬럼명
private String prefix;
private String fillChar = "0"; // 채울 문자 (: 0)
private int cipers = 13; // 자리수 (: 14)
private boolean applyYear;
private boolean useBigDecimals = false;
@Override
public synchronized List<String> getNextStringId(int count) throws FdlException {
List<String> idList = new ArrayList<>(count);
try {
for (int i = 0; i < count; i++) {
if (allocatedId >= allocatedMaxId) {
allocateIdBlock(count);
}
long id = allocatedId++;
idList.add(createStringId(id));
}
} catch (Exception e) {
throw new FdlException("ID Generation Error", e);
}
return idList;
}
private void allocateIdBlock(int requiredCount) throws SQLException, FdlException {
Connection conn = DataSourceUtils.getConnection(dataSource);
try {
conn.setAutoCommit(false);
int newBlockSize = Math.max(this.blockSize, requiredCount);
// SELECT 쿼리 수정
String query = "SELECT " + columnName + " FROM " + table + " WHERE TABLE_NAME = ? FOR UPDATE";
try (PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, tableName);
try (ResultSet rs = stmt.executeQuery()) {
long oldId = 0;
if (rs.next()) {
oldId = rs.getLong(1);
} else {
throw new FdlException(
"ID Generation Error: No record found in " + table + " for TABLE_NAME = " + tableName);
}
long newId = oldId + newBlockSize;
// UPDATE 쿼리 수정
String update = "UPDATE " + table + " SET " + columnName + " = ? WHERE TABLE_NAME = ? AND "
+ columnName + " = ?";
try (PreparedStatement updateStmt = conn.prepareStatement(update)) {
updateStmt.setLong(1, newId);
updateStmt.setString(2, tableName);
updateStmt.setLong(3, oldId);
int row = updateStmt.executeUpdate();
if (row == 0) {
throw new FdlException(
"ID Generation Error: Failed to update ID. Possible concurrent modification.");
}
}
conn.commit();
allocatedId = oldId;
allocatedMaxId = newId;
}
} catch (SQLException e) {
conn.rollback();
throw e;
}
} catch (SQLException e) {
throw new FdlException("ID Generation Error", e);
} finally {
DataSourceUtils.releaseConnection(conn, dataSource);
}
}
private String createStringId(long id) {
StringBuilder sb = new StringBuilder();
if (prefix != null) {
sb.append(prefix);
}
if (applyYear) {
sb.append(new SimpleDateFormat("yyyy").format(new Date()));
}
String idStr = String.format("%0" + cipers + "d", id);
sb.append(idStr);
return sb.toString();
}
// 인터페이스의 다른 메서드 구현 (필요에 따라 UnsupportedOperationException 또는 직접 구현)
@Override
public BigDecimal getNextBigDecimalId() throws FdlException {
throw new UnsupportedOperationException("getNextBigDecimalId is not supported");
}
@Override
public long getNextLongId() throws FdlException {
throw new UnsupportedOperationException("getNextLongId is not supported");
}
@Override
public int getNextIntegerId() throws FdlException {
throw new UnsupportedOperationException("getNextIntegerId is not supported");
}
@Override
public short getNextShortId() throws FdlException {
throw new UnsupportedOperationException("getNextShortId is not supported");
}
@Override
public byte getNextByteId() throws FdlException {
throw new UnsupportedOperationException("getNextByteId is not supported");
}
@Override
public String getNextStringId() throws FdlException {
throw new UnsupportedOperationException("getNextStringId is not supported");
}
@Override
public String getNextStringId(String strategyId) throws FdlException {
throw new UnsupportedOperationException("getNextStringId(String strategyId) is not supported");
}
@Override
public String getNextStringId(EgovIdGnrStrategy strategy) throws FdlException {
throw new UnsupportedOperationException("getNextStringId(EgovIdGnrStrategy strategy) is not supported");
}
// 필요한 setter 메서드들 추가
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setTable(String table) {
this.table = table;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setFillChar(String fillChar) {
this.fillChar = fillChar;
}
public void setCipers(int cipers) {
this.cipers = cipers;
}
public void setApplyYear(boolean applyYear) {
this.applyYear = applyYear;
}
public void setBlockSize(int blockSize) {
this.blockSize = blockSize;
}
}

View File

@ -114,6 +114,11 @@ public class LoginVO implements Serializable{
private String dormantYn; // 휴먼회원여부 ( N:일반회원, Y:휴먼회원)
/**
* 보안로그인 여부
*/
private String secuLoginFlag;
public String getDormantYn() {
return dormantYn;
}
@ -411,5 +416,12 @@ public class LoginVO implements Serializable{
public void setOuterCertYn(String outerCertYn) {
this.outerCertYn = outerCertYn;
}
public String getSecuLoginFlag() {
return secuLoginFlag;
}
public void setSecuLoginFlag(String secuLoginFlag) {
this.secuLoginFlag = secuLoginFlag;
}
}

View File

@ -0,0 +1,130 @@
package itn.com.cmm;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class MjonFTSendVO{
/**
* @description : 수신자번호
*/
private String phone;
/**
* @description : [*이름*] - 치환문자
*/
private String name;
/**
* @description : [*1*] - 치환문자
*/
private String rep1;
/**
* @description : [*2*] - 치환문자
*/
private String rep2;
/**
* @description : [*3*] - 치환문자
*/
private String rep3;
/**
* @description : [*4*] - 치환문자
*/
private String rep4;
/**
* @description : 문자ID
*/
private String msgId;
/**
* @description : 전송그룹ID (대량문자의 경우 하나의 그룹으로 세팅)
*/
private String msgGroupId;
/**
* @description : 문자온 일반회원ID
*/
private String userId;
/**
* @description : 발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)
*/
private String callFrom;
/**
* @description : 수신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)
*/
private String callTo;
/**
* @description : 예약 발송일시
*/
private String reqDate;
/**
* @description :전송사(04:다우, 05:JJ, 07:IVT, 01:아이하트 , 02:현대퓨처넷, 03:아이엠오)
*/
private String agentCode;
/**
* @description : MMS용 메시지제목
*/
private String subject;
/**
* @description : SMS용 메시지본문
*/
private String smsTxt;
/**
* @description : 메세지타입(4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)
*/
private String msgType;
/**
* @description : 첨부파일 갯수
*/
private String fileCnt;
/**
* @description : 파일이름1
*/
private String filePath1;
/**
* @description : 파일이름2
*/
private String filePath2;
/**
* @description : 파일이름3
*/
private String filePath3;
/**
* @description : event 여부 / group tb에 넣는 용도 / 기본값 N
*/
private String eventYn="N";
/**
* @description : 개별단가
*/
private String eachPrice;
}

View File

@ -0,0 +1,129 @@
package itn.com.cmm;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class MjonMsgSendVO{
/**
* @description : 수신자번호
*/
private String phone;
/**
* @description : [*이름*] - 치환문자
*/
private String name;
/**
* @description : [*1*] - 치환문자
*/
private String rep1;
/**
* @description : [*2*] - 치환문자
*/
private String rep2;
/**
* @description : [*3*] - 치환문자
*/
private String rep3;
/**
* @description : [*4*] - 치환문자
*/
private String rep4;
/**
* @description : 문자ID
*/
private String msgId;
/**
* @description : 전송그룹ID (대량문자의 경우 하나의 그룹으로 세팅)
*/
private String msgGroupId;
/**
* @description : 문자온 일반회원ID
*/
private String userId;
/**
* @description : 발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)
*/
private String callFrom;
/**
* @description : 수신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)
*/
private String callTo;
/**
* @description : 예약 발송일시
*/
private String reqDate;
/**
* @description :전송사(04:다우, 05:JJ, 07:IVT, 01:아이하트 , 02:현대퓨처넷, 03:아이엠오)
*/
private String agentCode;
/**
* @description : MMS용 메시지제목
*/
private String subject;
/**
* @description : SMS용 메시지본문
*/
private String smsTxt;
/**
* @description : 메세지타입(4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)
*/
private String msgType;
/**
* @description : 첨부파일 갯수
*/
private String fileCnt;
/**
* @description : 파일이름1
*/
private String filePath1;
/**
* @description : 파일이름2
*/
private String filePath2;
/**
* @description : 파일이름3
*/
private String filePath3;
/**
* @description : event 여부 / group tb에 넣는 용도 / 기본값 N
*/
private String eventYn="N";
/**
* @description : 개별단가
*/
private String eachPrice;
}

View File

@ -0,0 +1,37 @@
package itn.com.cmm;
import java.util.List;
import itn.let.mjo.event.service.MjonEventVO;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
*
* @author : 이호영
* @fileName : OptimalMsgResultDTO.java
* @date : 2024.11.26
* @description : 이벤트 vo 생성 종료 vo 생성
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.26 이호영 최초 생성
*
*
*
*/
@Getter
@Setter
@ToString
@Builder
public class OptimalMsgResultDTO{
private List<MjonMsgSendVO> optimalMsgList;
private MjonEventVO eventInfo;
}

View File

@ -0,0 +1,65 @@
package itn.com.cmm;
import org.springframework.http.HttpStatus;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
*
* @fileName : RestResponse.java
* @author : 이호영
* @date : 2022.07.04
* @description : RestApi 응답에 사용할 Class
* @TODO :
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2022.07.04 이호영 최초 생성
*
*
*
*/
/*
* 1XX : 조건부 응답
* 2XX : 성공
* 3XX : 리다이렉션 완료
* 4XX : 요청 오류
* 500 : 서버 오류
*
* 참고 : https://km0830.tistory.com/33
*
* ====== 자주 사용하는 코드 =====
* 200 : Ok : 서버가 클라이언트의 요청을 성공적으로 처리, 페이지에서는 페이지 요청이 정상적으로 완료 (Ok)
* 400 : Bad Request : 잘못 요청 (Bad Request)
* 401 : Unauthorized : 권한 없음, 예를 들면, 로그인 페이지가 필요한 페이지를 로그인 없이 접속하려는 경우 반환되는 코드 (인증 실패) (Unauthorized)
*
* */
@Getter
@Setter
@NoArgsConstructor
public class RestResponse {
private HttpStatus status;
private String msg;
private Object data;
@Builder
public RestResponse(HttpStatus status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
}

View File

@ -61,6 +61,7 @@ public class IPIgnoreInterceptorHandler extends HandlerInterceptorAdapter{
v_ret = false;
}
// lettnloginlog 테이블에 insert 패턴 추가 (/web/user/login/usrIdCheckAjax.do)
}else if(request.getRequestURI().indexOf("ListAjax.do")>-1
|| request.getRequestURI().indexOf("ViewAjax.do")>-1
|| request.getRequestURI().indexOf("DataAjax.do")>-1
@ -74,6 +75,7 @@ public class IPIgnoreInterceptorHandler extends HandlerInterceptorAdapter{
|| request.getRequestURI().indexOf("MapUrl")>-1
|| request.getRequestURI().indexOf("uss/ion/fms/FmsFileInsertAjax")>-1
|| request.getRequestURI().indexOf("web/mjon/addr/sendExelFilePhoneNumAjax")>-1
|| request.getRequestURI().indexOf("/web/user/login/usrIdCheckAjax.do")>-1

View File

@ -61,4 +61,13 @@ public interface EgovCmmUseService {
* @throws Exception
*/
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception;
/**
* 선택 코드 상세정보 조회
*
* @param 조회조건정보 vo
* @return CmmnDetailCode
* @throws Exception
*/
public CmmnDetailCode selectCmmCodeDetailValue(ComDefaultCodeVO vo) throws Exception;
}

View File

@ -92,4 +92,16 @@ public class EgovCmmUseServiceImpl extends EgovAbstractServiceImpl implements Eg
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception {
return cmmUseDAO.selectGroupIdDetail(vo);
}
/**
* 선택 코드 상세정보 조회
*
* @param 조회조건정보 vo
* @return CmmnDetailCode
* @throws Exception
*/
@Override
public CmmnDetailCode selectCmmCodeDetailValue(ComDefaultCodeVO vo) throws Exception {
return cmmUseDAO.selectCmmCodeDetailValue(vo);
}
}

View File

@ -0,0 +1,39 @@
package itn.com.cmm.session;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) // 세션 timeout 설정
public class HttpSessionConfig {
@Value("#{globalSettings['Globals.valkey.ip']}")
private String ip;
@Value("#{globalSettings['Globals.valkey.port']}")
private int port;
@Value("#{globalSettings['Globals.valkey.password']}")
private String password;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(this.ip);
factory.setPort(this.port);
factory.setPassword(this.password);
factory.afterPropertiesSet();
return factory;
}
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory());
return template;
}
}

View File

@ -1,112 +0,0 @@
package itn.com.cmm.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
*
* @author : 이호영
* @fileName : DateUtil.java
* @date : 2023.04.06
* @description : Date 다루는 Util
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2023.04.06 이호영 최초 생성
*
*
*
*/
public final class DateUtil {
/**
* @methodName : getTodayYearAndMonthAndFirstDay
* @author : 이호영
* @date : 2023.04.06
* @description : 해당 년월일 구하기 : 일은 1일
* @return ex) 2023/04/01
*/
public static String getTodayYearAndMonthAndFirstDay() {
LocalDate currentDate = LocalDate.now();
return LocalDate.of(currentDate.getYear(), currentDate.getMonthValue(), 1)
.format( DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
/**
* @methodName : getTodayYearAndMonthAndLastDay
* @author : 이호영
* @date : 2023.04.06
* @description : 해당 년월일 구하기 : 일은 마지막일
* @return ex) 2023/04/30
*/
public static String getTodayYearAndMonthAndLastDay() {
LocalDate currentDate = LocalDate.now();
return LocalDate.of(currentDate.getYear(), currentDate.getMonthValue(), currentDate.lengthOfMonth())
.format( DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
/**
* @methodName : getNowYearToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재 연도
* @return : String
*/
public static String getNowYearToString() {
return Integer.toString(LocalDate.now().getYear());
}
/**
* @methodName : getNowMonthToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재
* @return : String
*/
public static String getNowMonthToString() {
LocalDate currentDate = LocalDate.now();
return Integer.toString(currentDate.getMonthValue());
}
/**
* @methodName : getNowDayToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재
* @return : String
*/
public static String getNowDayToString() {
LocalDate currentDate = LocalDate.now();
return Integer.toString(currentDate.getDayOfMonth());
}
/**
* @methodName : getNowDayToString
* @author : 이호영
* @date : 2023.08.08
* @description : yyyy-MM-dd HH:mm:ss.S 형식을 yyyy-MM-dd HH:mm 변환
* @return
* @throws ParseException
*/
public static String getChangFormatS(String str) throws ParseException {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); // 원본 형식
Date date = inputFormat.parse(str); // 문자열을 날짜 객체로 변환
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 원하는 출력 형식
String formattedDate = outputFormat.format(date); // 날짜 객체를 원하는 형식의 문자열로 변환
return formattedDate; // 출력: 2023-08-07 09:36
}
}

View File

@ -0,0 +1,205 @@
package itn.com.cmm.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
*
* @author : 이호영
* @fileName : DateUtil.java
* @date : 2023.04.06
* @description : Date 다루는 Util
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2023.04.06 이호영 최초 생성
*
*
*
*/
public final class DateUtils {
// 날짜를 포맷하는 기본 포맷터 정의
private static final DateTimeFormatter SLUSH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd");
/**
* @methodName : getTodayYearAndMonthAndFirstDay
* @author : 이호영
* @date : 2023.04.06
* @description : 해당 년월일 구하기 : 일은 1일
* @return ex) 2023/04/01
*/
public static String getTodayYearAndMonthAndFirstDay() {
LocalDate currentDate = LocalDate.now();
return LocalDate.of(currentDate.getYear(), currentDate.getMonthValue(), 1)
.format( DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
/**
* @methodName : getTodayYearAndMonthAndLastDay
* @author : 이호영
* @date : 2023.04.06
* @description : 해당 년월일 구하기 : 일은 마지막일
* @return ex) 2023/04/30
*/
public static String getTodayYearAndMonthAndLastDay() {
LocalDate currentDate = LocalDate.now();
return LocalDate.of(currentDate.getYear(), currentDate.getMonthValue(), currentDate.lengthOfMonth())
.format( DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
/**
* @methodName : getNowYearToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재 연도
* @return : String
*/
public static String getNowYearToString() {
return Integer.toString(LocalDate.now().getYear());
}
/**
* @methodName : getNowMonthToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재
* @return : String
*/
public static String getNowMonthToString() {
LocalDate currentDate = LocalDate.now();
return Integer.toString(currentDate.getMonthValue());
}
/**
* @methodName : getNowDayToString
* @author : 이호영
* @date : 2023.04.07
* @description : 현재
* @return : String
*/
public static String getNowDayToString() {
LocalDate currentDate = LocalDate.now();
return Integer.toString(currentDate.getDayOfMonth());
}
/**
* @methodName : getNowDayToString
* @author : 이호영
* @date : 2023.08.08
* @description : yyyy-MM-dd HH:mm:ss.S 형식을 yyyy-MM-dd HH:mm 변환
* @return
* @throws ParseException
*/
public static String getChangFormatS(String str) throws ParseException {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); // 원본 형식
Date date = inputFormat.parse(str); // 문자열을 날짜 객체로 변환
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 원하는 출력 형식
String formattedDate = outputFormat.format(date); // 날짜 객체를 원하는 형식의 문자열로 변환
return formattedDate; // 출력: 2023-08-07 09:36
}
// 현재 날짜를 기본 포맷으로 반환
public static String getCurrentDate() {
return getCurrentDate(SLUSH_FORMATTER);
}
// 현재 날짜를 지정된 포맷으로 반환
public static String getCurrentDate(DateTimeFormatter formatter) {
LocalDate today = LocalDate.now();
return today.format(formatter);
}
// 현재 날짜에서 특정 일수 날짜를 기본 포맷으로 반환
public static String getDateMonthsAgo(int months) {
return getDateMonthsAgo(months, SLUSH_FORMATTER);
}
// 현재 날짜에서 특정 일수 날짜를 지정된 포맷으로 반환
public static String getDateMonthsAgo(int months, DateTimeFormatter formatter) {
LocalDate today = LocalDate.now();
// System.out.println("months : "+ months);
// System.out.println("today.minusMonths(months) : "+ today.minusMonths(months).format(formatter));
LocalDate monthsAgo = today.minusMonths(months).plusDays(1);
// System.out.println("monthsAgo : " + monthsAgo);
// System.out.println("monthsAgo.format(formatter) : " + monthsAgo.format(formatter));
return monthsAgo.format(formatter);
}
/**
* @methodName : dateChkAndValueChk
* @author : 이호영
* @date : 2024.07.05
* @description : 검색 날짜 검증 일수 체크
* @param searchStartDate
* @param searchEndDate
* @param dateVal
* @return
*/
public static boolean dateChkAndValueChk(String searchStartDate, String searchEndDate, int months) {
boolean isValid = true;
// 날짜 검증
LocalDate startDate = null;
LocalDate endDate = null;
// 검색 시작일자와 종료일자가 있는지 체크
if (searchStartDate == null || searchStartDate.isEmpty() || searchEndDate == null || searchEndDate.isEmpty()) {
isValid = false;
}
// 날짜 형식으로 변환
if (isValid) {
try {
startDate = LocalDate.parse(searchStartDate, SLUSH_FORMATTER);
endDate = LocalDate.parse(searchEndDate, SLUSH_FORMATTER);
} catch (Exception e) {
isValid = false;
}
}
// 시작일자가 종료일자보다 이후인지 확인
if (isValid && startDate.isAfter(endDate)) {
isValid = false;
}
// 기간이 지정한 개월 수를 넘는지 확인
if (isValid) {
long monthsBetween = ChronoUnit.MONTHS.between(startDate, endDate);
if (monthsBetween >= months) {
isValid = false;
}
}
return isValid;
}
public static String setStrToDataFormatter(String str, String formatter) {
// 입력 문자열을 LocalDateTime으로 변환
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(str, inputFormatter);
// 원하는 출력 포맷 적용
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(formatter);
String formattedDate = dateTime.format(outputFormatter);
return formattedDate;
}
}

View File

@ -25,44 +25,43 @@ import org.apache.commons.lang3.StringUtils;
*/
public final class FileUtil {
/**
* @methodName : downLoad
* @author : 이호영
* @date : 2023.04.06
* @description : 파일 다운로드
* @param response
* @param fileInfo
* @param fileName
* @throws Exception
*/
public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception {
/**
* @methodName : downLoad
* @author : 이호영
* @date : 2023.04.06
* @description : 파일 다운로드
* @param response
* @param fileInfo
* @param fileName
* @throws Exception
*/
public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception {
try {
String path = fileInfo; // 경로에 접근할 역슬래시('\') 사용
try {
String path = fileInfo; // 경로에 접근할 역슬래시('\') 사용
File file = new File(path);
File file = new File(path);
String fileName = "";
if(StringUtils.isNotEmpty(fileNameP))
fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20");
else
fileName = file.getName();
String fileName = "";
if(StringUtils.isNotEmpty(fileNameP))
fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20");
else
fileName = file.getName();
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기
OutputStream out = response.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기
OutputStream out = response.getOutputStream();
int read = 0;
byte[] buffer = new byte[1024];
while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음
out.write(buffer, 0, read);
}
} catch (Exception e) {
throw new Exception("download error");
}
int read = 0;
byte[] buffer = new byte[1024];
while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음
out.write(buffer, 0, read);
}
} catch (Exception e) {
throw new Exception("download error");
}
}

View File

@ -144,7 +144,6 @@ public final class MJUtil {
date = date.replaceAll("-", "/");//날짜에 하이픈(-) 슬러쉬(/) 변환
SimpleDateFormat sdformat = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(getRealTime());
Date nowDate = sdformat.parse(getRealTime());
Date endDate = sdformat.parse(date);
@ -319,4 +318,17 @@ public final class MJUtil {
return dupliBlockList;
}
/**
* 사업자등록번호 대시('-') 추가
* 대시 유무 상관없음
* 유효성 맞지 않을시 변환안됨.
*/
public static String bizNoAddDash(String str) {
if(str == null) {
return str;
}
String regExp = "(\\d{3})(\\d{2})(\\d{5})$";
String chgf = "$1-$2-$3";
return str.replaceFirst(regExp, chgf);
}
}

View File

@ -0,0 +1,972 @@
package itn.com.cmm.util;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import itn.com.cmm.MjonMsgSendVO;
import itn.com.cmm.OptimalMsgResultDTO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO;
import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserManageVO;
import lombok.extern.slf4j.Slf4j;
/**
*
* @author : 이호영
* @fileName : MsgSendUtils.java
* @date : 2024.09.23
* @description : 메세지발송 데이터 다루는 유틸
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.09.23 이호영 최초 생성
*
*
*
*/
@Slf4j
public final class MsgSendUtils {
// 단문 메세지 타입
public static final String SHORT_MSG_TYPE = "4";
// 장문 메세지 타입
public static final String LONG_MSG_TYPE = "6";
// 이벤트 최저 잔액
public static final double MIN_EVENT_REMAIN_CASH = 7.5; // 이벤트 최소 잔액
/**
* @methodName : getMsgType
* @author : 이호영
* @date : 2024.09.23
* @description : msgType 재정의
* @param mjonMsgVO
* @param smsTxtByte
* @return
* @throws UnsupportedEncodingException
*/
public static String getMsgTypeWithByteValidation(MjonMsgSendVO sendVO, String p_smsTxt) throws UnsupportedEncodingException {
// // 내문자저장함에 저장 문자를 발송하는 경우 문자 타입이 숫자가 아닌 문자로 넘어와서 변경 처리함
// if ("P".equals(msgType) || "L".equals(msgType)) {
// msgType = "6";
// } else if ("S".equals(msgType)) {
// msgType = "4";
// }
int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt);
String msgType = SHORT_MSG_TYPE;
// 1. 2000 Byte 초과는 에러 처리
if (smsTxtByte > 2000) {
return "INVALID";
}
// 2. 첨부파일 여부 확인 (첨부파일이 있으면 장문으로 설정)
if (StringUtils.isNotEmpty(sendVO.getFilePath1())) {
msgType = LONG_MSG_TYPE;
}
// 3. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문)
else if (smsTxtByte > 90) {
msgType = LONG_MSG_TYPE;
}
return msgType;
}
public static float getValidPrice(Float personalPrice, Float defaultPrice) {
return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice;
}
/**
* @methodName : determinePriceByMsgType
* @author : 이호영
* @date : 2024.09.24
* @description : 문자 메시지 타입에 따라 단가를 결정하는 메서드
* @param mjonMsgVO
* @param shortPrice
* @param longPrice
* @param picturePrice
* @param picture2Price
* @param picture3Price
* @return
*/
public static float determinePriceByMsgType(MjonMsgVO mjonMsgVO, float shortPrice, float longPrice,
float picturePrice, float picture2Price, float picture3Price) {
float price = 0;
String msgType = mjonMsgVO.getMsgType();
if (SHORT_MSG_TYPE.equals(msgType)) {
price = shortPrice;
} else if (LONG_MSG_TYPE.equals(msgType)) {
// 파일 첨부 여부에 따라 장문 단가 설정
if (mjonMsgVO.getFileName3() != null) {
price = picture3Price;
} else if (mjonMsgVO.getFileName2() != null) {
price = picture2Price;
} else if (mjonMsgVO.getFileName1() != null) {
price = picturePrice;
} else {
price = longPrice;
}
}
return price;
}
/**
* @methodName : isReplacementRequired
* @author : 이호영
* @date : 2024.11.12
* @description : 치환데이터가 있는지 확인
* @param mjonMsgVO
* @return
*/
public static boolean isRepleasYN(MjonMsgVO mjonMsgVO) {
// 치환 구문 패턴 리스트
String[] placeholders = {"\\[\\*이름\\*\\]", "\\[\\*1\\*\\]", "\\[\\*2\\*\\]", "\\[\\*4\\*\\]", "\\[\\*3\\*\\]"};
for (String placeholder : placeholders) {
Pattern pattern = Pattern.compile(placeholder);
Matcher matcher = pattern.matcher(mjonMsgVO.getSmsTxt());
// 해당 패턴이 존재하면 true 반환
if (matcher.find()) {
return true;
}
}
return false;
}
/**
* @methodName : populateReplacementLists
* @author : 이호영
* @date : 2024.09.26
* @description : 배열에 데이터를 채우는 메서드
* 1. 치환 문자열 데이터 확인 문자 치환
* 2. 스팸 문자 체크
* 3. 메세지 타입 구하기
* 4. 제목 셋팅 : 타입에 따라 분기
* 5. 이미지 갯수 셋팅
* 6. 예약 분할에 따른 시간 설정
* 7. 전송사 코드 셋팅
* @param mjonMsgVO
* @param lists
* @param statusResponse
* @param agentSendCounts
* @param sendRateList
* @param isHolidayNotified
* @return call by reference
* @throws Exception
*/
public static Boolean populateSendLists(MjonMsgVO mjonMsgVO, List<MjonMsgSendVO> mjonMsgSendListVO
, StatusResponse statusResponse, List<String> resultSpamTxt
, Map<String, Integer> agentSendCounts, List<MjonMsgVO> sendRateList, boolean isHolidayNotified, UserManageVO userManageVO) throws Exception{
log.info(" :: populateSendLists :: ");
String smishingYn = userManageVO.getSmishingYn();
String exceptSpamYn = userManageVO.getExceptSpamYn();
// 예약 시간 기본값 설정
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정
// 화면에서 예약문자면 예약시간을 regDate로 설정한다.
Date baseDate;
if (StringUtils.isEmpty(mjonMsgVO.getReqDate())) {
mjonMsgVO.setReqDate(sdf.format(now)); // ReqDate에 현재 시간 설정
baseDate = now;
} else {
baseDate = sdf.parse(mjonMsgVO.getReqDate()); // ReqDate를 baseDate로 설정
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(baseDate); // calendar에 baseDate 설정
int counter = 0; // 분할 건수 카운터
// 데이터 모두 스팸 체크를 안하고 건별로 갯수를 정해서 스팸체크를 한다.
int spamChkSize = getSpamChkSize(mjonMsgSendListVO.size());
int sampleCounter = 0;
// 치환 구문과 필드 getter 매핑
Map<String, Function<MjonMsgSendVO, String>> placeholders = new HashMap<>();
placeholders.put("[*이름*]", MjonMsgSendVO::getName);
placeholders.put("[*1*]", MjonMsgSendVO::getRep1);
placeholders.put("[*2*]", MjonMsgSendVO::getRep2);
placeholders.put("[*3*]", MjonMsgSendVO::getRep3);
placeholders.put("[*4*]", MjonMsgSendVO::getRep4);
boolean hasPerformedSpamCheck = false; // 치환 문자가 없는 경우, 스팸 체크가 번만 수행되도록 제어
boolean hasPerformedMsgType = false; // 치환 문자가 없는 경우, 메세지 타입 체크 한번
boolean hasPerformedDelayYn = false; // 치환 문자가 없는 경우,
String msgKind = mjonMsgVO.getMsgKind();
String smsTxtTemp = mjonMsgVO.getSmsTxt();
String mmsSubject = mjonMsgVO.getMmsSubject();
Boolean replaceYN = getReplaceYN(smsTxtTemp);
String msgTypeResult = null;
for (MjonMsgSendVO sendVO : mjonMsgSendListVO) {
sendVO.setCallFrom(mjonMsgVO.getCallFrom());
sendVO.setCallTo(sendVO.getPhone());
sendVO.setUserId(mjonMsgVO.getUserId());
String smsTxt = smsTxtTemp;
// 치환 문자면
if(replaceYN) {
// 치환 구문을 확인하고 치환할 값이 없으면 오류 반환
for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
String placeholder = entry.getKey();
String value = entry.getValue().apply(sendVO);
if (smsTxt.contains(placeholder)) {
if (StringUtils.isEmpty(value)) {
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "치환 문구중 " + placeholder + " 데이터가 없습니다.", "STAT_1040");
return false;
}
smsTxt = smsTxt.replace(placeholder, value);
// log.info(" + smsTxt [{}]", smsTxt);
}
}
}
String smsSpamChkTxt = smsTxt;
if(StringUtils.isNotEmpty(smsTxt)) {
smsSpamChkTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
}
// 이미지 셋팅
setImagePathsForMsgSendVO(mjonMsgVO, sendVO);
// == 치환 여부에 따라 처리 로직 분기 ==
// 치환 문자가 아닌 경우
if (!replaceYN) {
// 스팸 체크와 메시지 타입 체크 각각 번만 수행
if (!hasPerformedSpamCheck && "N".equals(exceptSpamYn)) {
checkSpamAndSetStatus(mjonMsgVO, smsSpamChkTxt, resultSpamTxt, isHolidayNotified);
hasPerformedSpamCheck = true;
}
if (!hasPerformedMsgType) {
msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt);
if ("INVALID".equals(msgTypeResult)) {
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.", "STAT_1050");
return false;
}
hasPerformedMsgType = true;
}
}
else
{// 치환 문자인 경우
// 스팸 체크는 `spamChkSize`만큼 반복 수행
if (sampleCounter < spamChkSize && !"Y".equals(mjonMsgVO.getSpamStatus()) && "N".equals(exceptSpamYn)) {
checkSpamAndSetStatus(mjonMsgVO, smsSpamChkTxt, resultSpamTxt, isHolidayNotified);
sampleCounter++;
}
// 메시지 타입 체크는 매번 수행
msgTypeResult = getMsgTypeWithByteValidation(sendVO, smsTxt);
if ("INVALID".equals(msgTypeResult)) {
// statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
StatusResponse.statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.", "STAT_1050");
return false;
}
}
sendVO.setSmsTxt(smsTxt);
sendVO.setMsgType(msgTypeResult);
// 제목 셋팅
if (LONG_MSG_TYPE.equals(msgTypeResult)){
String mmsTitleTemp = "";
// 제목이 비어 있고 전송할 SMS 텍스트가 존재하는 경우에만 처리
if (StringUtils.isEmpty(mmsSubject) && StringUtils.isNotEmpty(smsTxt)) {
// SMS 텍스트를 단위로 나누기
mmsTitleTemp = getMmsgSubject(smsTxt, msgKind);
// 설정된 제목을 현재 메시지 객체에 적용
sendVO.setSubject(mmsTitleTemp);
}else {
// 설정된 제목을 현재 메시지 객체에 적용
sendVO.setSubject(mmsSubject);
}
}
/* @isHolidayNotified
* - 관리자 알림 설정으로 인해
* - 해당 시간이면 지연 미처리
* @smishingYn
* - 회원 '스미싱 ' 상태값
* - Y면 알림, 지연 처리해야
* */
if("Y".equalsIgnoreCase(smishingYn) && isHolidayNotified) {
mjonMsgVO.setSpamStatus("Y");
mjonMsgVO.setSmishingYn("Y");
mjonMsgVO.setDelayYn("Y");
}
// 지연 여부 처리
if (( "Y".equalsIgnoreCase(smishingYn) || "Y".equalsIgnoreCase(mjonMsgVO.getDelayYn()))
&& !hasPerformedDelayYn && isHolidayNotified) {
calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
// TEST
// calendar.add(Calendar.MINUTE, 5); // 모든 시간을 30분 뒤로 미룸
hasPerformedDelayYn = true;
}
// 예약 여부 확인
if ("Y".equalsIgnoreCase(mjonMsgVO.getReserveYn())) {
// 분할 발송일 경우
if ("on".equalsIgnoreCase(mjonMsgVO.getDivideChk())) {
if (counter == Integer.parseInt(mjonMsgVO.getDivideCnt())) { // 지정된 건수마다 간격 추가
counter = 0;
calendar.add(Calendar.MINUTE, Integer.parseInt(mjonMsgVO.getDivideTime()));
}
counter++;
}
// 예약 시간 설정
sendVO.setReqDate(sdf.format(calendar.getTime())); // 분할된 시간 설정 또는 기본 예약 시간 사용
} else {
// 예약 여부가 N일 경우에도 기본 예약 시간 설정
sendVO.setReqDate(sdf.format(calendar.getTime()));
}
// 전송사 코드 셋팅
String agentCode = "00".equals(mjonMsgVO.getAgentCode())
? MsgSendUtils.assignAgentBasedOnCount(agentSendCounts, sendRateList)
: mjonMsgVO.getAgentCode();
sendVO.setAgentCode(agentCode);
}
// Group TB에 넣어줄 제목
// 치환안된 sms 데이터로 넣어야함
log.info(" mjonMsgSendListVO size :: [{}]", mjonMsgSendListVO.size());
if (LONG_MSG_TYPE.equals(mjonMsgSendListVO.get(0).getMsgType())){
mjonMsgVO.setMmsSubject(getMmsgSubject(smsTxtTemp, msgKind));
}
return true;
}
/**
* @methodName : setImagePathsForMsgSendVO
* @author : 이호영
* @date : 2024.11.26
* @description : vo에 이미지 셋팅
* @param mjonMsgVO
* @param sendVO
*/
private static void setImagePathsForMsgSendVO(MjonMsgVO mjonMsgVO, MjonMsgSendVO sendVO) {
int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());
switch (fileCount) {
case 3:
sendVO.setFilePath3(mjonMsgVO.getFileName3());
case 2:
sendVO.setFilePath2(mjonMsgVO.getFileName2());
case 1:
sendVO.setFilePath1(mjonMsgVO.getFileName1());
break;
default:
// fileCount가 0이거나 설정할 파일이 없는 경우
break;
}
sendVO.setFileCnt(mjonMsgVO.getFileCnt());
}
private static void checkSpamAndSetStatus(MjonMsgVO mjonMsgVO, String personalizedSmsTxt, List<String> resultSpamTxt, boolean isHolidayNotified) throws Exception {
mjonMsgVO.setSpamStatus("N");
mjonMsgVO.setDelayYn("N");
if(StringUtils.isNotEmpty(personalizedSmsTxt)) {
String resultParser = ComGetSpamStringParser.getSpamTextParse(personalizedSmsTxt).trim();
int spmCnt = 0;
String spmFilterTxt = "";
for (String spmTxt : resultSpamTxt) {
String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim();
if (resultParser.contains(parserStr)) {
spmCnt++;
spmFilterTxt += spmTxt + ",";
}
}
if (spmCnt > 0) { // 스팸 문자가 포함된 경우
if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
// 처음부터 idx 만큼 잘라낸 나머지 글자
spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1);
}
/* @isHolidayNotified
* - 관리자 알림 설정으로 인해
* - 해당 시간이면 지연 미처리
* */
mjonMsgVO.setSpamStatus("Y");
if(isHolidayNotified) {
mjonMsgVO.setDelayYn("Y");
}
}
}
}
public static Boolean getReplaceYN(String smsTxtTemplate) {// 여러 치환 구문이 포함된 정규식 패턴
if (smsTxtTemplate == null) {
return false; // null일 경우 false 반환
}
Boolean replaceYN = false;
Pattern pattern = Pattern.compile("\\[\\*이름\\*\\]|\\[\\*1\\*\\]|\\[\\*2\\*\\]|\\[\\*3\\*\\]|\\[\\*4\\*\\]");
Matcher matcher = pattern.matcher(smsTxtTemplate);
// 정규식 패턴에 해당하는 치환 구문이 존재하는지 확인
if (matcher.find()) {
replaceYN = true;
}
return replaceYN;
}
/**
* @methodName : getSpamChkSize
* @author : 이호영
* @date : 2024.11.13
* @description : 수신자 건수별로 스팸체크하는 갯수 설정
* @param size
* @return
*/
private static int getSpamChkSize(int size) {
int chkSize = 1; // 기본 샘플 크기
// 수신자 수에 따른 샘플 크기 결정
if (size > 100 && size <= 1000) {
chkSize = 10;
} else if (size > 1000) {
chkSize = 50;
}
return chkSize;
}
/**
* 특정 플레이스홀더를 리스트에서 가져온 값으로 치환합니다.
*
* @param smsTxt 문자 내용
* @param placeholder 치환할 플레이스홀더 (: [*이름*])
* @param list 치환할 데이터 리스트
* @param index 현재 인덱스
* @return 치환된 문자 내용
*/
private static String replacePlaceholder(String smsTxt, String placeholder, String[] list, int index) {
if (smsTxt.contains(placeholder)) {
if (list.length > index && StringUtil.isNotEmpty(list[index])) {
smsTxt = smsTxt.replaceAll(placeholder, StringUtil.getString(list[index].replaceAll("§", ",")));
} else {
smsTxt = smsTxt.replaceAll(placeholder, "");
}
}
return smsTxt;
}
// 배열 인덱스를 안전하게 접근하는 메서드
private static String getSafeValue(String[] array, int index) {
return (array != null && array.length > index) ? array[index] : " ";
}
// 치환 처리에 특수문자 제거 로직이 포함된 메서드
private static String getReplacementValue(String[] array, int index, String placeholder) {
if (array != null && array.length > index && StringUtil.isNotEmpty(array[index])) {
return StringUtil.getString(array[index].replaceAll("§", ","));
} else {
return " ";
}
}
public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
statusResponse.setStatus(httpStatus);
statusResponse.setMessage(msg);
}
public static StatusResponse validateFilesForMessageSending(int fileCount, MjonMsgVO mjonMsgVO) {
if (fileCount > 0) {
boolean allFilesAreNull = Stream
.of(mjonMsgVO.getFileName1(), mjonMsgVO.getFileName2(), mjonMsgVO.getFileName3())
.allMatch(Objects::isNull);
if (allFilesAreNull) {
return new StatusResponse(HttpStatus.NO_CONTENT, "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다.");
}
}
return null; // 유효성 검사를 통과한 경우
}
/**
* @methodName : validateReplacementData
* @author : 이호영
* @date : 2024.09.25
* @description : 치환문자가 사용될 데이터가 올바른지 확인하는 메서드
* @param mjonMsgVO
* @param list
* @return boolean
*/
/*
* public static boolean validateReplacementData(MjonMsgVO mjonMsgVO,
* List<MjonMsgSendVO> list) { // 치환 구문과 필드 getter 매핑 Map<String,
* Function<MjonMsgSendVO, String>> placeholders = new HashMap<>();
* placeholders.put("\\[\\*이름\\*\\]", MjonMsgSendVO::getName);
* placeholders.put("\\[\\*1\\*\\]", MjonMsgSendVO::getRep1);
* placeholders.put("\\[\\*2\\*\\]", MjonMsgSendVO::getRep2);
* placeholders.put("\\[\\*3\\*\\]", MjonMsgSendVO::getRep3);
* placeholders.put("\\[\\*4\\*\\]", MjonMsgSendVO::getRep4);
*
* // smsTxt 에서 필요한 치환 구문이 포함되어 있는지 확인 String smsTxt = mjonMsgVO.getSmsTxt();
* for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry :
* placeholders.entrySet()) { if
* (Pattern.compile(entry.getKey()).matcher(smsTxt).find()) { // 해당 치환 구문이 존재할
* 경우 모든 수신자에서 필드 확인 for (MjonMsgSendVO recipient : list) { if
* (StringUtils.isEmpty(entry.getValue().apply(recipient))) { return false; //
* 데이터가 없는 경우 } } } } // 모든 치환 구문이 유효한 데이터를 가지고 있으면 true 반환 return true; }
*/
// 배열이 비어있는지 확인하는 메서드
public static boolean isEmpty(String[] array) {
return array == null || array.length == 0;
}
public static void setPriceforVO(MjonMsgVO mjonMsgVO, List<MjonMsgSendVO> mjonMsgSendVOList, JoinSettingVO sysJoinSetVO,
MberManageVO mberManageVO) {
// 사용자 단가 정보 설정 (협의 단가가 없을 경우 시스템 단가를 적용)
float shortPrice = MsgSendUtils.getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
float longPrice = MsgSendUtils.getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
float picturePrice = MsgSendUtils.getValidPrice(mberManageVO.getPicturePrice(), sysJoinSetVO.getPicturePrice());
float picture2Price = MsgSendUtils.getValidPrice(mberManageVO.getPicture2Price(), sysJoinSetVO.getPicture2Price());
float picture3Price = MsgSendUtils.getValidPrice(mberManageVO.getPicture3Price(), sysJoinSetVO.getPicture3Price());
// 메시지 타입에 따라 사용자 단가 설정 단가 계산
float totalPrice = 0.0f;
for (MjonMsgSendVO sendVO : mjonMsgSendVOList) {
String msgType = sendVO.getMsgType();
String eachPrice;
switch (msgType) {
case SHORT_MSG_TYPE: // 단문 메시지 타입
eachPrice = Float.toString(shortPrice);
break;
case LONG_MSG_TYPE: // 장문 또는 이미지 메시지 타입
eachPrice = getPicturePrice(sendVO, longPrice, picturePrice, picture2Price, picture3Price);
break;
default:
// 기본값이 필요하다면 추가 가능
throw new IllegalArgumentException("setPriceforVO :: type Exception ");
}
sendVO.setEachPrice(eachPrice);
// log.info(" eachPrice :: [{}]", eachPrice);
// 가격을 합산
totalPrice += Float.parseFloat(eachPrice);
}
mjonMsgVO.setTotalPrice(totalPrice);
}
/**
* @methodName : setPriceforVO
* @author : 이호영
* @date : 2024.12.02
* @description : total금액 구하기
* @param mjonMsgSendVOList
* @return
*/
public static float setPriceforVO(List<MjonMsgSendVO> mjonMsgSendVOList) {
float totalPrice = 0.0f;
for (MjonMsgSendVO sendVO : mjonMsgSendVOList) {
String priceStr = sendVO.getEachPrice();
if(StringUtils.isNotEmpty(priceStr)) {
totalPrice += Float.parseFloat(priceStr);
}
}
return totalPrice;
}
/**
* 이미지 파일 경로를 기준으로 적절한 가격을 반환하는 헬퍼 메소드.
*/
private static String getPicturePrice(MjonMsgSendVO sendVO, float longPrice, float picturePrice, float picture2Price, float picture3Price) {
switch (sendVO.getFilePath3() != null ? "FILE3" :
sendVO.getFilePath2() != null ? "FILE2" :
sendVO.getFilePath1() != null ? "FILE1" : "NONE") {
case "FILE3":
return Float.toString(picture3Price);
case "FILE2":
return Float.toString(picture2Price);
case "FILE1":
return Float.toString(picturePrice);
default:
return Float.toString(longPrice);
}
}
/**
* @methodName : getOptimalMsgList
* @author : 이호영
* @date : 2024.11.26
* @description : 주어진 이벤트 정보와 메시지 리스트를 기반으로, 잔액 내에서 최적의 메시지 리스트를 생성하고 결과를 반환합니다.
* 만약 잔액이 부족하거나 이벤트가 종료된 상태라면, 이벤트 종료 정보를 포함하여 반환합니다.
*
* @param eventMberInfo 이벤트 정보 객체 (MjonEventVO). 이벤트 상태 잔액 정보를 포함.
* @param mjonMsgSendVOList 최적화를 수행할 메시지 리스트 (List<MjonMsgSendVO>).
* @return OptimalMsgResultDTO 최적 메시지 리스트와 이벤트 상태 정보를 포함한 DTO 객체.
* @throws Exception 메시지 단가 계산 오류 또는 기타 처리 발생한 예외를 상위로 전달.
*/
public static OptimalMsgResultDTO getOptimalMsgList(
MjonEventVO eventMberInfo,
List<MjonMsgSendVO> mjonMsgSendVOList) throws Exception {
// 최적의 메시지 리스트를 담을 리스트
List<MjonMsgSendVO> optimalList = new ArrayList<>();
// 이벤트 정보가 없는 경우
if (eventMberInfo == null) {
return OptimalMsgResultDTO.builder()
.optimalMsgList(optimalList)
.eventInfo(null)
.build();
}
// 이벤트 잔액과 종료 조건 확인
double remainCash = eventMberInfo.getEventRemainCash();
String eventEndDate = eventMberInfo.getEventEndDate();
if (isEventExpired(remainCash, eventEndDate)) {
MjonEventVO returnEventMberInfo = terminateEvent(eventMberInfo, remainCash);
return OptimalMsgResultDTO.builder()
.optimalMsgList(optimalList)
.eventInfo(returnEventMberInfo)
.build();
}
// 단가 설정
float eventShortPrice = Float.parseFloat(eventMberInfo.getEventShortPrice());
float eventLongPrice = Float.parseFloat(eventMberInfo.getEventLongPrice());
float eventPicturePrice = Float.parseFloat(eventMberInfo.getEventPicturePrice());
float eventPicture2Price = Float.parseFloat(eventMberInfo.getEventPicture2Price());
float eventPicture3Price = Float.parseFloat(eventMberInfo.getEventPicture3Price());
// 최적의 메시지 리스트 생성
double sum = 0.0;
Iterator<MjonMsgSendVO> iterator = mjonMsgSendVOList.iterator();
while (iterator.hasNext()) {
MjonMsgSendVO msg = iterator.next();
// 단가 계산 예외 처리
String eachPrice = getEachPriceOrThrow(msg, eventShortPrice, eventLongPrice, eventPicturePrice, eventPicture2Price, eventPicture3Price);
float floatEachPrice = Float.parseFloat(eachPrice);
// 최적의 메시지 리스트에 추가
if (sum + floatEachPrice <= remainCash) {
sum += floatEachPrice;
msg.setEachPrice(eachPrice);
msg.setEventYn("Y");
optimalList.add(msg);
iterator.remove();
} else {
break; // 예산 초과로 추가 불가능
}
}
// 이벤트 잔액 처리하는 매소드 terminateEvent
// double remainAmt = targetCash - sum;
// MjonEventVO returnEventMberInfo = terminateEvent(eventMberInfo, remainAmt);
return OptimalMsgResultDTO.builder()
.optimalMsgList(optimalList)
// .eventInfo(returnEventMberInfo)
.build();
// 결과 반환
// return OptimalMsgResultDTO.builder()
// .optimalMsgList(optimalList)
// .eventInfo(null)
// .build();
}
/**
* @methodName : getEachPriceOrThrow
* @author : 이호영
* @date : 2024.11.26
* @description :
* @param msg
* @param shortPrice
* @param longPrice
* @param picturePrice
* @param picture2Price
* @param picture3Price
* @return
*/
private static String getEachPriceOrThrow(
MjonMsgSendVO msg,
float shortPrice,
float longPrice,
float picturePrice,
float picture2Price,
float picture3Price) {
switch (msg.getMsgType()) {
case SHORT_MSG_TYPE:
return Float.toString(shortPrice);
case LONG_MSG_TYPE:
return getPicturePrice(msg, longPrice, picturePrice, picture2Price, picture3Price);
default:
throw new IllegalArgumentException("Unsupported message type: " + msg.getMsgType());
}
}
private static boolean isEventExpired(double targetCash, String eventEndDate) throws Exception {
return !MJUtil.getCompareDate(eventEndDate) || targetCash < MIN_EVENT_REMAIN_CASH;
}
/**
* @methodName : terminateEvent
* @author : 이호영
* @date : 2024.11.26
* @description : 이벤트 종료 VO 생성
* @param eventMberInfo
* @param remainCash
* @return
*/
public static MjonEventVO terminateEvent(MjonEventVO eventMberInfo, double remainCash) {
// TODO Auto-generated method stub
// 이벤트 상태를 종료로 변경
MjonEventVO returnEventMberInfo = new MjonEventVO();
returnEventMberInfo.setEventInfoId(eventMberInfo.getEventInfoId());
returnEventMberInfo.setMberId(eventMberInfo.getMberId());
returnEventMberInfo.setEventRemainCash(remainCash);
returnEventMberInfo.setEventStatus("Y");
if (remainCash < MIN_EVENT_REMAIN_CASH) {
returnEventMberInfo.setEventStatus("E");
returnEventMberInfo.setEventMemo("발송 최소 금액("+ MIN_EVENT_REMAIN_CASH +") 부족 혹은 이벤트 종료일 초과되어 이벤트 종료 시킴");
}
return returnEventMberInfo;
}
/**
* @methodName : handleHotlineAgentRate
* @author : 이호영
* @date : 2024.11.26
* @description : 전용 전송사 비율이 0이면 대표 전송사로 수정
* @param userInfo
* @param tmp
* @param hotlineAgentCode
* @return
*/
public static String handleHotlineAgentRate(MberManageVO userInfo, MjonMsgAgentStsVO tmp, String hotlineAgentCode) {
String sendRate = tmp.getSendRate();
String repAgent = tmp.getRepAgent();
String useYn = tmp.getUseYn();
// 블라인드 코드가 'N' 경우 전송 비율 사용 가능 여부 확인
if ("N".equals(userInfo.getBlineCode())) {
// 전송 비율이 0이거나 사용 불가인 경우 대표 전송사로 변경
if ("0".equals(sendRate) || "N".equals(useYn)) {
hotlineAgentCode = repAgent;
}
}
return hotlineAgentCode; // 변경된 hotlineAgentCode 반환
}
/**
* @methodName : initializeAgentSendCounts
* @author : 이호영
* @date : 2024.11.26
* @description : 전송사별 코드로 map 초기화 하기
* @return
*/
public static Map<String, Integer> initializeAgentSendCounts() {
Map<String, Integer> agentSendCounts = new HashMap<>();
agentSendCounts.put("01", 0); // 아이하트
agentSendCounts.put("02", 0); // 현대 퓨쳐넷
agentSendCounts.put("03", 0); // 아이엠오
agentSendCounts.put("04", 0); // 비즈뿌리오
agentSendCounts.put("05", 0); // 제이제이
agentSendCounts.put("07", 0); // 인비토
return agentSendCounts;
}
/**
* @methodName : calculateSendCounts
* @author : 이호영
* @date : 2024.11.26
* @description : agentSendCounts에 있는 에이젼트 map에 전송사 비율에 따라 카운트 put 하기
* @param agentSendCounts
* @param sendRate
* @param finalSize
*/
public static void calculateSendCounts(Map<String, Integer> agentSendCounts, MjonMsgVO sendRate, int finalSize) {
String agentCode = sendRate.getAgentCode();
float sendRatePercentage = Float.parseFloat(sendRate.getSendRate());
int sendCount = Math.round(finalSize * sendRatePercentage);
if (agentSendCounts.containsKey(agentCode)) {
agentSendCounts.put(agentCode, sendCount);
}
}
/**
* @methodName : assignAgentBasedOnCount
* @author : 이호영
* @date : 2024.11.26
* @description : initializeAgentSendCounts()에서 만든 map으로 발송 agent 데이터 Set
* @param agentSendCounts
* @param sendRateList
* @return
*/
public static String assignAgentBasedOnCount(Map<String, Integer> agentSendCounts, List<MjonMsgVO> sendRateList) {
// 전송사 코드 순서대로 확인 :: initializeAgentSendCounts 메소드와 맞춰야함
List<String> agentCodes = Arrays.asList("01", "02", "03", "04", "05", "07");
// 전송 가능한 코드 찾기
for (String agentCode : agentCodes) {
if (agentSendCounts.get(agentCode) > 0) {
agentSendCounts.put(agentCode, agentSendCounts.get(agentCode) - 1);
return agentCode;
}
}
// 모든 코드의 전송 가능 횟수가 0이면 대표 전송사로 할당
return sendRateList.get(0).getRepAgent();
}
/**
* @methodName : getMmsgSubject
* @author : 이호영
* @date : 2024.12.02
* @description : 타이틀 생성
* @param smsTxt
* @param msgKind
* @return
*/
public static String getMmsgSubject(String smsTxt, String msgKind) {
String mmsTitleTemp = "";
if(StringUtils.isEmpty(smsTxt)) {
return mmsTitleTemp;
}
// SMS 텍스트를 단위로 나누기
String[] split = smsTxt.split("\n");
if (split.length > 0) {
// "C" 메시지 종류인 경우 번째 , 그렇지 않으면 번째 줄을 제목으로 설정
mmsTitleTemp = "C".equals(msgKind) && split.length > 1 ? split[1].trim() : split[0].trim();
// 제목 글자 수를 20자로 제한 (초과 잘라냄)
mmsTitleTemp = mmsTitleTemp.length() > 20 ? mmsTitleTemp.substring(0, 20) : mmsTitleTemp;
}
return mmsTitleTemp;
}
/**
* @methodName : eventYN
* @author : 이호영
* @date : 2025.02.10
* @description : 이벤트 확인
* @param eventMberInfo
* @return
*/
public static Boolean isNotEvent(MjonEventVO eventMberInfo) {
if (eventMberInfo == null
|| "E".equals(eventMberInfo.getEventStatus())
|| org.apache.commons.lang3.StringUtils.isEmpty(eventMberInfo.getEventEndDate())
) {
return true;
}
return false;
}
}

View File

@ -0,0 +1,48 @@
package itn.com.cmm.util;
import java.text.DecimalFormat;
/**
*
* @author : 이호영
* @fileName : PayUtil.java
* @date : 2024.07.16
* @description : pay 다루는 Util
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2023.04.06 이호영 최초 생성
*
*
*
*/
public final class PayUtils {
/**
* @methodName : getTrimToFirstDecimal
* @author : 이호영
* @date : 2023.07.16
* @description : 소수점 첫째자리 빼고 버림
* @return ex) 0000.0
*/
public static String getTrimToFirstDecimal(String input) {
try {
// 쉼표 제거
String normalizedInput = input.replace(",", "");
// Double로 변환
double value = Double.parseDouble(normalizedInput);
// 소수점 첫째자리까지만 남기고 나머지는 버림
double trimmedValue = Math.floor(value * 10) / 10.0;
// 숫자가 너무 커지면 지수 표기법으로 나타내서 방지하기 위한 구문
DecimalFormat df = new DecimalFormat("#.0");
// 문자열로 변환하여 반환
return df.format(trimmedValue);
} catch (NumberFormatException e) {
System.err.println("Number format exception: " + e.getMessage());
return "0";
}
}
}

View File

@ -0,0 +1,145 @@
package itn.com.cmm.util;
import org.apache.commons.lang3.StringUtils;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mjo.msg.service.MjonMsgVO;
public class SlackMessageFormatUtil {
private static final String PREFIX_SMISHING = "[스미싱의심]";
private static final String PREFIX_RESERVE = "[예약]";
private static final String PREFIX_IMAGE = "그림문자 ";
/**
* 일반 SMS 메시지 텍스트 포맷팅
*/
public static String formatSmsText(MjonMsgVO mjonMsgVO) {
String smsTxt = mjonMsgVO.getSmsTxt();
String reserveYn = safeGetString(mjonMsgVO.getReserveYn());
String delayYn = safeGetString(mjonMsgVO.getDelayYn());
String smishingYn = safeGetString(mjonMsgVO.getSmishingYn());
// 공통 텍스트 포맷팅 로직 적용
smsTxt = formatMessagePrefix(smsTxt, reserveYn,
"Y".equals(smishingYn) || "Y".equals(delayYn));
// 그림 문자 처리 (SMS 전용 로직)
int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0);
if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isEmpty(smsTxt)) {
smsTxt = "그림문자 " + smsTxt;
}
return smsTxt;
}
/**
* 카카오톡 메시지 텍스트 포맷팅
*/
public static String formatKakaoText(KakaoSendAdvcVO sendVO) {
String smsTxt = sendVO.getTemplateContent();
String reserveYn = safeGetString(sendVO.getReserveYn());
String atDelayYn = safeGetString(sendVO.getAtDelayYn());
// 공통 텍스트 포맷팅 로직 적용
return formatMessagePrefix(smsTxt, reserveYn, "Y".equals(atDelayYn));
}
public static String formatSandName(MjonMsgVO mjonMsgVO) {
String userId = mjonMsgVO.getUserId();
String callFrom = mjonMsgVO.getCallFrom();
String msgType = getMessageTypeLabel(mjonMsgVO.getMsgType(), mjonMsgVO.getFileCnt());
return String.format("[%s][%s]%s", userId, callFrom, msgType);
}
/**
* 메시지 접두사 포맷팅 공통 로직 (예약 스미싱 의심 접두사 처리)
*
* @param messageText 원본 메시지 텍스트
* @param reserveYn 예약 여부
* @param isSmishing 스미싱 의심 여부
* @return 포맷팅된 메시지 텍스트
*/
public static String formatMessagePrefix(String messageText, String reserveYn, boolean isSmishing) {
if ("Y".equals(reserveYn)) {
return isSmishing ? PREFIX_SMISHING + PREFIX_RESERVE + messageText : PREFIX_RESERVE + messageText;
} else if (isSmishing) {
return PREFIX_SMISHING + messageText;
}
return messageText;
}
/**
* @카카오톡용 sandName 포맷팅 메서드
*/
public static String formatKakaoSandName(KakaoSendAdvcVO sendVO) {
String userId = sendVO.getUserId();
String callFrom = sendVO.getCallFrom();
String msgType = getKakaoMessageTypeLabel(sendVO.getMsgType());
return String.format("[%s][%s]%s", userId, callFrom, msgType);
}
/**
* 메시지 타입 레이블 반환 (SMS 전용)
*
* @param msgType 메시지 타입
* @param fileCnt 파일 개수
* @return 메시지 타입 레이블
*/
public static String getMessageTypeLabel(String msgType, String fileCnt) {
int fileCount = parseIntOrDefault(fileCnt, 0);
switch (msgType) {
case "4":
return "[단문]";
case "6":
return fileCount == 0 ? "[장문]" : "[그림]";
default:
return "";
}
}
/**
* 카카오톡 메시지 타입 레이블 반환
*
* @param msgType 메시지 타입
* @return 메시지 타입 레이블
*/
public static String getKakaoMessageTypeLabel(String msgType) {
switch (msgType) {
case "8":
return "[알림톡]";
case "9":
return "[친구톡]";
default:
return "";
}
}
/**
* 정수로 변환, 변환 실패 기본값 반환
*
* @param value 변환할 문자열
* @param defaultValue 기본값
* @return 변환된 정수 또는 기본값
*/
public static int parseIntOrDefault(String value, int defaultValue) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
return defaultValue;
}
}
/**
* 안전하게 문자열 가져오기 (null 체크)
*
* @param value 원본 문자열
* @return 원본 문자열 또는 문자열
*/
public static String safeGetString(String value) {
return value == null ? "" : value;
}
}

View File

@ -26,6 +26,8 @@ import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
public class StringUtil {
private static final int HIGHEST_SPECIAL = '>'; // for escaping html code. by hessie; since 2007/10/01.
@ -600,4 +602,16 @@ public class StringUtil {
}
public static String getLengthChkAndSubString(String str, int maxLength) {
if (StringUtils.length(str) > maxLength) {
str = StringUtils.substring(str, 0, maxLength);
// 잘라낸 문자열을 다시 설정 (필요한 경우)
}
return str;
}
}

View File

@ -0,0 +1,40 @@
package itn.com.uss.ion.bnr.pop.service;
import java.io.Serializable;
import itn.com.cmm.ComDefaultVO;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author : 이호영
* @fileName : MainPopupLinkVO.java
* @date : 2025.02.26
* @description :
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2025.02.26 이호영 최초 생성
*
*
*
*/
@Getter
@Setter
public class MainPopupLinkVO extends ComDefaultVO implements Serializable {
/**
* @description :
*/
private static final long serialVersionUID = 1998370534684278351L;
private String popId; // 메인존ID
private String mlink; // 링크
private String coords; // 링크좌표
private String popLinkId; // 링크좌표
}

View File

@ -0,0 +1,34 @@
package itn.com.uss.ion.bnr.pop.service;
import java.util.List;
import itn.com.cmm.RestResponse;
/**
* 개요
* - 팝업창에 대한 Service Interface를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회, 팝업사용자 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:58
*/
public interface MainPopupManageService {
public List<?> selectMainPopupList(MainPopupVO mainPopupVO) throws Exception;
public int selectMainPopupCount(MainPopupVO mainPopupVO) throws Exception;
public MainPopupVO selectMainPopupVO(String mazId) throws Exception;
public List<MainPopupVO> selectMainPopupListRolling();
public void deleteMainPopup(String id);
public void resetMainPopupSort(MainPopupVO mainPopupVO);
public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO);
}

View File

@ -0,0 +1,59 @@
package itn.com.uss.ion.bnr.pop.service;
import java.io.Serializable;
import java.util.List;
import itn.com.cmm.ComDefaultVO;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author : 이호영
* @fileName : MainPopupVO.java
* @date : 2025.02.26
* @description :
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2025.02.26 이호영 최초 생성
*
*
*
*/
@Getter
@Setter
public class MainPopupVO extends ComDefaultVO implements Serializable {
/**
* @description :
*/
private static final long serialVersionUID = 1998370534684278351L;
private String popId; // 메인존ID
private String content; // 대체택스트
private String del; // 삭제여부
private String mainzoneImageFile; // 이미지파일ID
private String mainzoneImage; // 이미지파일명
private String regdt; // 등록일
private String moddt; // 수정일
private String popNm; // 메인팝업존키
private String useYn; // 사용여부
private String registerId; // 등록자 아이디
private String deviceType; // 접근타입
private String ntceBgnde; // 게시 시작일자
private String ntceEndde; // 게시 종료일자
private String ntceBgndeHH;
private String ntceBgndeMM;
private String ntceEnddeHH;
private String ntceEnddeMM;
private String devicetype;
private List<MainPopupLinkVO> mainPopupLinkList; // 게시 종료일자
}

View File

@ -0,0 +1,62 @@
package itn.com.uss.ion.bnr.pop.service.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import itn.com.cmm.service.impl.EgovComAbstractDAO;
import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
/**
* 개요
* - 팝업창에 대한 DAO를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:21:04
*/
@Repository("mainPopupManageDAO")
public class MainPopupManageDAO extends EgovComAbstractDAO {
/**
* 메인이미지 목록을 조회한다.
* @return 목록
* @exception Exception
*/
public List<?> selectMainPopupList(MainPopupVO mainPopupVO ) throws Exception{
return list("mainPopup.selectMainPopupList", mainPopupVO);
}
public int selectMainPopupCount(MainPopupVO mainPopupVO) throws Exception{
return (int)select("mainPopup.selectMainPopupCount", mainPopupVO);
}
public MainPopupVO selectMainPopupVO(String mazId) throws Exception{
return (MainPopupVO)select("mainPopup.selectMainPopupVO", mazId);
}
public List<MainPopupVO> selectMainPopupListRolling() {
return (List<MainPopupVO>) list("mainPopup.selectMainPopupListRolling");
}
public void deleteMainPopup(String popId) {
delete("mainPopup.deleteMainPopup", popId);
}
public void resetMainPopupSort(MainPopupVO mainPopupVO) {
update("mainPopup.resetMainPopupSort", mainPopupVO);
}
public void deleteMainPopupLinkInfo(MainPopupLinkVO mainPopupLinkVO) {
delete("mainPopup.deleteMainPopupLinkInfo", mainPopupLinkVO);
}
}

View File

@ -0,0 +1,89 @@
package itn.com.uss.ion.bnr.pop.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.com.cmm.RestResponse;
import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
import itn.com.uss.ion.bnr.pop.service.MainPopupManageService;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.pwm.service.impl.PopupManageDAO;
/**
* 개요
* - 팝업창에 대한 ServiceImpl을 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:58
*/
@Service("mainPopupManageService")
public class MainPopupManageServiceImpl extends EgovAbstractServiceImpl implements MainPopupManageService {
@Resource(name = "mainPopupManageDAO")
public MainPopupManageDAO dao;
@Resource(name = "popupManageDAO")
public PopupManageDAO popupDao;
@Resource(name = "egovPopupManageIdGnrService")
private EgovIdGnrService idgenService;
@Override
public List<?> selectMainPopupList(MainPopupVO mainPopupVO) throws Exception {
return dao.selectMainPopupList(mainPopupVO);
}
@Override
public int selectMainPopupCount(MainPopupVO mainPopupVO) throws Exception {
return dao.selectMainPopupCount(mainPopupVO);
}
@Override
public MainPopupVO selectMainPopupVO(String mazId) throws Exception {
MainPopupVO resultVO = dao.selectMainPopupVO(mazId);
if (resultVO == null)
throw processException("info.nodata.msg");
return resultVO;
}
@Override
public List<MainPopupVO> selectMainPopupListRolling() {
return dao.selectMainPopupListRolling();
}
@Override
public void deleteMainPopup(String id) {
popupDao.deleteMainPopupLinkInfo(id);
dao.deleteMainPopup(id);
}
@Override
public void resetMainPopupSort(MainPopupVO mainPopupVO) {
dao.resetMainPopupSort(mainPopupVO);
}
@Override
public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO) {
dao.deleteMainPopupLinkInfo(mainPopupLinkVO);
return RestResponse.builder()
.status(HttpStatus.OK) // 200, Series.SUCCESSFUL, "OK"
.msg("삭제 되었습니다.")
.build();
}
}

View File

@ -0,0 +1,343 @@
package itn.com.uss.ion.bnr.pop.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springmodules.validation.commons.DefaultBeanValidator;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.RestResponse;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
import itn.com.uss.ion.bnr.pop.service.MainPopupManageService;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
import itn.let.sym.site.service.EgovSiteManagerService;
/**
* 개요
* - 팝업창에 대한 Controller를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자 화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:57
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2025.02.24 이호영 최초 생성
*
* </pre>
*/
@Controller
public class MainPopupController {
private static final Logger LOGGER = LoggerFactory.getLogger(MainPopupController.class);
@Autowired
private DefaultBeanValidator beanValidator;
/** EgovMessageSource */
@Resource(name = "egovMessageSource")
EgovMessageSource egovMessageSource;
/** EgovPropertyService */
@Resource(name = "propertiesService")
protected EgovPropertyService propertiesService;
/** EgovPopupManageService */
@Resource(name = "subMainZoneManageService")
private SubMainZoneManageService subMainZoneManageService;
@Resource(name = "mainPopupManageService")
private MainPopupManageService mainPopupManageService;
/** cmmUseService */
@Resource(name = "EgovCmmUseService")
private EgovCmmUseService cmmUseService;
@Resource(name="EgovFileMngUtil")
private EgovFileMngUtil fileUtil;
@Resource(name="EgovFileMngService")
private EgovFileMngService fileMngService;
@Resource(name = "egovPopupZoneIdGnrService")
private EgovIdGnrService idgenService;
// @Resource(name = "egovMainZoneIdGnrService")
// private EgovIdGnrService idgenServiceMain;
@Resource(name = "egovSubMainZoneIdGnrService")
private EgovIdGnrService idgenServiceSubMain;
@Resource(name = "egovSiteManagerService")
EgovSiteManagerService egovSiteManagerService;
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileService;
/*메인이미지 관리*/
// @RequestMapping(value="/uss/ion/bnr/subMainZoneList.do")
@RequestMapping(value="/uss/ion/bnr/pop/mainPopupList.do")
public String selectMainzoneList(ModelMap model , MainPopupVO mainPopupVO , HttpSession session ) throws Exception {
LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(mainPopupVO.getPageUnit()% 8 != 0) {//9 배수로 넘어오지 않으면 초기세팅
mainPopupVO.setPageUnit(8);
}else {
mainPopupVO.setPageUnit(mainPopupVO.getPageUnit());
}
/** pageing */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(mainPopupVO.getPageIndex());
paginationInfo.setRecordCountPerPage(mainPopupVO.getPageUnit());
paginationInfo.setPageSize(mainPopupVO.getPageSize());
mainPopupVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
mainPopupVO.setLastIndex(paginationInfo.getLastRecordIndex());
mainPopupVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(null != loginVO && !"super".equals(loginVO.getSiteId())){ //각각의 사이트
mainPopupVO.setSiteId(loginVO.getSiteId());
}
List<?> mainPopupList = mainPopupManageService.selectMainPopupList(mainPopupVO);
model.addAttribute("mainPopupList", mainPopupList);
int totCnt = mainPopupManageService.selectMainPopupCount(mainPopupVO);
paginationInfo.setTotalRecordCount(totCnt);
model.addAttribute("paginationInfo", paginationInfo);
return "uss/ion/bnr/pop/mainPopupList";
}
/*알림창등록/수정 view*/
@RequestMapping(value="/uss/ion/bnr/pop/mainPopupModify.do")
public String updateMainZoneView(@RequestParam Map<?, ?> commandMap,
HttpServletRequest request, Model model, HttpSession session)
throws Exception {
MainPopupVO mainPopupVO = new MainPopupVO();
if("Modify".equals((String)commandMap.get("pageType"))){ //수정
String mazId = (String)commandMap.get("selectedId");
mainPopupVO = mainPopupManageService.selectMainPopupVO(mazId);
String sNtceBgnde = mainPopupVO.getNtceBgnde();
String sNtceEndde = mainPopupVO.getNtceEndde();
if(sNtceBgnde != null && sNtceEndde != null ) {
mainPopupVO.setNtceBgndeHH(sNtceBgnde.substring(8, 10));
mainPopupVO.setNtceBgndeMM(sNtceBgnde.substring(10, 12));
mainPopupVO.setNtceEnddeHH(sNtceEndde.substring(8, 10));
mainPopupVO.setNtceEnddeMM(sNtceEndde.substring(10, 12));
//게시기간 시작일자()
model.addAttribute("ntceBgndeHH", getTimeHH());
//게시기간 시작일자()
model.addAttribute("ntceBgndeMM", getTimeMM());
//게시기간 종료일자()
model.addAttribute("ntceEnddeHH", getTimeHH());
//게시기간 종료일자()
model.addAttribute("ntceEnddeMM", getTimeMM());
}
if(mainPopupVO != null){
mainPopupVO.setBeSort(mainPopupVO.getSort());
FileVO fileVO = new FileVO();
String atchFileId = mainPopupVO.getMainzoneImageFile();
fileVO.setAtchFileId(atchFileId);
List<FileVO> fileList = fileService.selectFileInfs(fileVO);
model.addAttribute("fileList", fileList);
}
}else{ //등록
//게시기간 시작일자()
model.addAttribute("ntceBgndeHH", getTimeHH());
//게시기간 시작일자()
model.addAttribute("ntceBgndeMM", getTimeMM());
//게시기간 종료일자()
model.addAttribute("ntceEnddeHH", getTimeHH());
//게시기간 종료일자()
model.addAttribute("ntceEnddeMM", getTimeMM());
}
//model.addAttribute("sortList", sortList);
model.addAttribute("mainPopupVO", mainPopupVO);
System.out.println("mainPopupVO :: "+ mainPopupVO.toString());
/* 타겟 코드 */
ComDefaultCodeVO vo = new ComDefaultCodeVO();
vo.setCodeId("COM037");
//List<?> targetList = cmmUseService.selectCmmCodeDetail(vo);
//model.addAttribute("targetList", targetList);
return "uss/ion/bnr/pop/mainPopupModify";
}
/*메인 이미지삭제 */
@RequestMapping("/uss/ion/bnr/pop/mainPopupListDelete.do")
public String deleteMainzoneDelete(@RequestParam("del") String[] del, RedirectAttributes redirectAttributes , Model model) throws Exception {
LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
MainPopupVO mainPopupVO = new MainPopupVO();
for(String id:del) {
try{
mainPopupVO = mainPopupManageService.selectMainPopupVO(id);
}catch(Exception e){
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("info.nodata.msg"));
RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do");
return redirectUrlMaker.getRedirectUrl();
}
mainPopupManageService.deleteMainPopup(id);
if(null != loginVO && !"super".equals(loginVO.getSiteId())){
mainPopupVO.setSiteId(loginVO.getSiteId());
}
mainPopupManageService.resetMainPopupSort(mainPopupVO);
}
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do");
return redirectUrlMaker.getRedirectUrl();
}
/**
* @methodName : mainPopupLinkDeleteAjax
* @author : 이호영
* @date : 2025.03.04
* @description : 메인팝업링크 데이터 삭제
* @param request
* @param mainPopupLinkVO
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping(value="/uss/ion/bnr/pop/mainPopupLinkDeleteAjax.do")
public ResponseEntity<?> mainPopupLinkDeleteAjax(
HttpServletRequest request
,@RequestBody MainPopupLinkVO mainPopupLinkVO) throws Exception {
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
if(!isAuthenticated) {
return ResponseEntity.ok(
RestResponse.builder()
.status(HttpStatus.UNAUTHORIZED) // 401 권한 인증 에러
.msg("로그인을 하셔야 이용 가능합니다.")
.build()
);
}
return ResponseEntity.ok(mainPopupManageService.deleteMainPopupLink(mainPopupLinkVO));
}
/**
* 시간을 LIST를 반환한다.
* @return List
* @throws
*/
@SuppressWarnings("unused")
private List<ComDefaultCodeVO> getTimeHH() {
ArrayList<ComDefaultCodeVO> listHH = new ArrayList<ComDefaultCodeVO>();
HashMap<?, ?> hmHHMM;
for (int i = 0; i <= 24; i++) {
String sHH = "";
String strI = String.valueOf(i);
if (i < 10) {
sHH = "0" + strI;
} else {
sHH = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sHH);
codeVO.setCodeNm(sHH);
listHH.add(codeVO);
}
return listHH;
}
/**
* 분을 LIST를 반환한다.
* @return List
* @throws
*/
@SuppressWarnings("unused")
private List<ComDefaultCodeVO> getTimeMM() {
ArrayList<ComDefaultCodeVO> listMM = new ArrayList<ComDefaultCodeVO>();
HashMap<?, ?> hmHHMM;
for (int i = 0; i <= 60; i++) {
String sMM = "";
String strI = String.valueOf(i);
if (i < 10) {
sMM = "0" + strI;
} else {
sMM = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sMM);
codeVO.setCodeNm(sMM);
listMM.add(codeVO);
}
return listMM;
}
}

View File

@ -0,0 +1,37 @@
package itn.com.uss.ion.bnr.sub.service;
import java.util.List;
import java.util.Map;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
import itn.com.uss.ion.pwm.service.PopupzoneVO;
import itn.com.uss.ion.pwm.service.SocialVO;
import itn.com.uss.ion.pwm.service.SortVO;
/**
* 개요
* - 팝업창에 대한 Service Interface를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회, 팝업사용자 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:58
*/
public interface SubMainZoneManageService {
public List<?> selectSubMainzoneList(MainzoneVO mainzoneVO) throws Exception;
public int selectSubMainzoneCount(MainzoneVO mainzoneVO) throws Exception;
public MainzoneVO selectSubMainzoneVO(String mazId) throws Exception;
public List<MainzoneVO> selectSubMainzoneListRolling();
public void deleteSubMainzone(String id);
public void resetSubMainVOSort(MainzoneVO mainzoneVO);
}

View File

@ -0,0 +1,309 @@
package itn.com.uss.ion.bnr.sub.service.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import itn.com.cmm.service.impl.EgovComAbstractDAO;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
import itn.com.uss.ion.pwm.service.PopupzoneVO;
import itn.com.uss.ion.pwm.service.SocialVO;
import itn.com.uss.ion.pwm.service.SortVO;
/**
* 개요
* - 팝업창에 대한 DAO를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:21:04
*/
@Repository("subMainZoneManageDAO")
public class SubMainZoneManageDAO extends EgovComAbstractDAO {
/**
* 메인이미지 목록을 조회한다.
* @return 목록
* @exception Exception
*/
public List<?> selectSubMainzoneList(MainzoneVO mainzoneVO ) throws Exception{
return list("subMainzoneManage.selectSubMainzoneList", mainzoneVO);
}
public int selectSubMainzoneCount(MainzoneVO mainzoneVO) throws Exception{
return (int)select("subMainzoneManage.selectSubMainzoneCount", mainzoneVO);
}
public MainzoneVO selectSubMainzoneVO(String mazId) throws Exception{
return (MainzoneVO)select("subMainzoneManage.selectSubMainzoneVO", mazId);
}
public List<MainzoneVO> selectSubMainzoneListRolling() {
return (List<MainzoneVO>) list("subMainzoneManage.selectSubMainzoneListRolling");
}
public void deleteSubMainzone(String mazId) {
delete("subMainzoneManage.deleteSubMainzone", mazId);
}
public void resetSubMainVOSort(MainzoneVO mainzoneVO) {
update("subMainzoneManage.resetSubMainVOSort", mainzoneVO);
}
//
// public SubMainZoneManageDAO(){}
//
// /**
// * 등록된 팝업창정보를 삭제한다.
// * @param popupManage - 팝업창 model
// * @return boolean - 반영성공 여부
// *
// * @param popupManage
// */
// public void deletePopup(PopupManageVO popupManageVO) throws Exception {
// delete("PopupManage.deletePopupManage", popupManageVO);
// }
//
// /**
// * 팝업창정보를 신규로 등록한다.
// * @param popupManage - 팝업창 model
// * @return boolean - 반영성공 여부
// *
// * @param popupManage
// */
// public void insertPopup(PopupManageVO popupManageVO) throws Exception {
// insert("PopupManage.insertPopupManage", popupManageVO);
// }
//
// /**
// * 등록된 팝업창정보를 수정한다.
// * @param popupManage - 팝업창 model
// * @return boolean - 반영성공 여부
// *
// * @param popupManage
// */
// public void updatePopup(PopupManageVO popupManageVO) throws Exception {
// update("PopupManage.updatePopupManage", popupManageVO);
// }
//
// /**
// * 팝업창을 사용자 화면에서 볼수 있는 정보들을 조회한다.
// * @param popupManageVO - 팝업창 Vo
// * @return popupManageVO - 팝업창 Vo
// *
// * @param popupManageVO
// */
// public PopupManageVO selectPopup(PopupManageVO popupManageVO) throws Exception {
// return (PopupManageVO)select("PopupManage.selectPopupManageDetail", popupManageVO);
// }
//
// /**
// * 팝업창를 관리하기 위해 등록된 팝업창목록을 조회한다.
// * @param popupManageVO - 팝업창 Vo
// * @return List - 팝업창 목록
// *
// * @param popupManageVO
// */
// public List<?> selectPopupList(PopupManageVO popupManageVO) throws Exception {
// return list("PopupManage.selectPopupManage", popupManageVO);
// }
//
// /**
// * 팝업창를 관리하기 위해 등록된 팝업창목록 총갯수를 조회한다.
// * @param popupManageVO - 팝업창 Vo
// * @return List - 팝업창 목록
// *
// * @param popupManageVO
// */
// public int selectPopupListCount(PopupManageVO popupManageVO) throws Exception {
// return (Integer)select("PopupManage.selectPopupManageCnt", popupManageVO);
// }
//
// /**
// * 팝업창를 사용하기 위해 등록된 팝업창목록을 조회한다.
// * @param popupManageVO - 팝업창 Vo
// * @return List - 팝업창 목록
// *
// * @param popupManageVO
// */
// public List<?> selectPopupMainList(PopupManageVO popupManageVO) throws Exception {
// return list("PopupManage.selectPopupManageMain", popupManageVO);
// }
//
// /**
// * 메인알림창 목록을 조회한다.
// * @return 목록
// * @exception Exception
// */
// public List<?> selectPopupzoneList(PopupzoneVO popupzoneVo) throws Exception{
// return list("PopupzoneManage.selectPopupzoneList", popupzoneVo);
// }
//
// /**
// * 메인배너 순번정보를 가져온다.
// * @param mode - 0:등록 1:수정
// * @return 순번정보
// * @exception Exception
// */
// @SuppressWarnings("unchecked")
// public List<EgovMap> getSortList() throws Exception{
// return (List<EgovMap>) list("PopupzoneManage.getSortList",null);
// }
//
// public PopupzoneVO selectPopupzoneVO(String pozId) throws Exception {
// return (PopupzoneVO)select("PopupzoneManage.selectPopupzoneVO", pozId);
// }
//
// /**
// * 메인배너 변경할때 나머지 배너들 순서 변경
// * @param 입력된 sort번호
// * @return 등록 결과
// * @exception Exception
// */
// public void updateSortUp(SortVO sortVO) throws Exception{
// update("PopupzoneManage.updateSortUp", sortVO);
// }
//
// public void updateSortDown(SortVO sortVO) throws Exception {
// update("PopupzoneManage.updateSortDown", sortVO);
// }
//
// public void updatePopupzone(PopupzoneVO popupzoneVO) throws Exception {
// update("PopupzoneManage.updatePopupzone", popupzoneVO);
// }
//
// /**
// * 메인알림창을 삭제한다.
// * @param pozId - 삭제할 메인알림창 번호
// * @return void형
// * @exception Exception
// */
// public void deletePopupzone(String pozId) throws Exception {
// delete("PopupzoneManage.deletePopupzone", pozId);
// }
//
// public int getMaxSort() throws Exception{
// return (Integer)select("PopupzoneManage.getMaxSort") ;
// }
//
// /**
// * 메인배너의 새로운seq를 가지고온다.
// * @return seq
// * @exception Exception
// */
// public int selectNextSeq() throws Exception{
// return (Integer)select("PopupzoneManage.selectNextSeq");
// }
//
// public void insertPopupzone(PopupzoneVO popupzoneVO) throws Exception{
// insert("PopupzoneManage.insertPopupzone", popupzoneVO);
// }
//
// public void resetSort(PopupzoneVO popupzoneVO) throws Exception{
// update("PopupzoneManage.resetSort", popupzoneVO);
// }
//
// /**
// * 메인이미지 목록을 조회한다.
// * @return 목록
// * @exception Exception
// */
// public List<?> selectMainzoneList(MainzoneVO mainzoneVO ) throws Exception{
// return list("MainzoneManage.selectMainzoneList", mainzoneVO);
// }
//
// public int getMainMaxSort() throws Exception{
// return (Integer)select("MainzoneManage.getMainMaxSort");
// }
//
// public void insertMainzone(MainzoneVO mainzoneVO) throws Exception{
// insert("MainzoneManage.insertMainzone", mainzoneVO);
// }
//
// public void resetMainSort(MainzoneVO mainzoneVO) throws Exception{
// insert("MainzoneManage.resetMainSort", mainzoneVO);
// }
//
// public void updateMainSortUp(SortVO sortVO) throws Exception{
// update("MainzoneManage.updateMainSortUp", sortVO);
// }
//
// public MainzoneVO selectMainzoneVO(String mazId) throws Exception{
// return (MainzoneVO)select("MainzoneManage.selectMainzoneVO", mazId);
// }
//
// @SuppressWarnings("unchecked")
// public List<EgovMap> getMainSortList() throws Exception{
// return (List<EgovMap>) list("MainzoneManage.getMainSortList",null);
// }
//
// public void deleteMainzone(String mazId) throws Exception{
// delete("MainzoneManage.deleteMainzone", mazId);
// }
//
// public void updateMainSortDown(SortVO sortVO) throws Exception{
// update("MainzoneManage.updateMainSortDown", sortVO);
// }
//
// public void updateMainzone(MainzoneVO mainzoneVO) throws Exception{
// update("MainzoneManage.updateMainzone", mainzoneVO);
// }
//
// @SuppressWarnings("unchecked")
// public List<MainzoneVO> selectMainzoneListRolling() throws Exception{
// return (List<MainzoneVO>) list("MainzoneManage.selectMainzoneListRolling");
// }
//
// public int selectPopupzoneListTotCnt(PopupzoneVO popupzoneVo) throws Exception {
// return (int)select("PopupzoneManage.selectPopupzoneListTotCnt", popupzoneVo);
// }
//
// public int selectMainzoneCount(MainzoneVO mainzoneVO) throws Exception{
// return (int)select("MainzoneManage.selectMainzoneCount", mainzoneVO);
// }
//
// public void resetVOSort(PopupzoneVO popupzoneVO) throws Exception{
// update("PopupzoneManage.resetVOSort", popupzoneVO);
// }
//
// public void resetMainVOSort(MainzoneVO mainzoneVO) throws Exception{
// update("MainzoneManage.resetMainVOSort", mainzoneVO);
// }
//
// @SuppressWarnings("unchecked")
// public List<SocialVO> selectSocialList(SocialVO socialVO) throws Exception{
// return (List<SocialVO>) list("SocialManage.selectSocialList",socialVO);
// }
//
// public SocialVO selectSocialVO(String socialId) throws Exception{
// return (SocialVO)select("SocialManage.selectSocialVO", socialId);
// }
//
// public void updateSocial(SocialVO socialVO) throws Exception{
// update("SocialManage.updateSocial", socialVO);
// }
//
// public void resetSocialSort(SocialVO socialVO) throws Exception{
// update("SocialManage.resetSocialSort", socialVO);
// }
//
// public void insertSocial(SocialVO socialVO) throws Exception{
// insert("SocialManage.insertSocial", socialVO);
// }
//
// public void deleteSocial(String id) throws Exception{
// delete("SocialManage.deleteSocial", id);
// }
}

View File

@ -0,0 +1,85 @@
package itn.com.uss.ion.bnr.sub.service.impl;
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
import itn.com.uss.ion.pwm.service.PopupzoneVO;
import itn.com.uss.ion.pwm.service.SocialVO;
import itn.com.uss.ion.pwm.service.SortVO;
import itn.com.uss.ion.pwm.service.impl.PopupManageDAO;
import itn.com.uss.ion.pwm.service.impl.PopupzoneManageDAO;
/**
* 개요
* - 팝업창에 대한 ServiceImpl을 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:58
*/
@Service("subMainZoneManageService")
public class SubMainZoneManageServiceImpl extends EgovAbstractServiceImpl implements SubMainZoneManageService {
@Resource(name = "subMainZoneManageDAO")
public SubMainZoneManageDAO dao;
/** PopupzoneManageDAO */
@Resource(name="popupzoneManageDAO")
private PopupzoneManageDAO popupzoneManageDAO;
@Resource(name = "egovPopupManageIdGnrService")
private EgovIdGnrService idgenService;
@Override
public List<?> selectSubMainzoneList(MainzoneVO mainzoneVO) throws Exception {
return dao.selectSubMainzoneList(mainzoneVO);
}
@Override
public int selectSubMainzoneCount(MainzoneVO mainzoneVO) throws Exception {
return dao.selectSubMainzoneCount(mainzoneVO);
}
@Override
public MainzoneVO selectSubMainzoneVO(String mazId) throws Exception {
MainzoneVO resultVO = dao.selectSubMainzoneVO(mazId);
if (resultVO == null)
throw processException("info.nodata.msg");
return resultVO;
}
@Override
public List<MainzoneVO> selectSubMainzoneListRolling() {
return dao.selectSubMainzoneListRolling();
}
@Override
public void deleteSubMainzone(String id) {
dao.deleteSubMainzone(id);
}
@Override
public void resetSubMainVOSort(MainzoneVO mainzoneVO) {
dao.resetSubMainVOSort(mainzoneVO);
}
}

View File

@ -0,0 +1,308 @@
package itn.com.uss.ion.bnr.sub.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springmodules.validation.commons.DefaultBeanValidator;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.let.sym.site.service.EgovSiteManagerService;
/**
* 개요
* - 팝업창에 대한 Controller를 정의한다.
*
* 상세내용
* - 팝업창에 대한 등록, 수정, 삭제, 조회, 반영확인 기능을 제공한다.
* - 팝업창의 조회기능은 목록조회, 상세조회로, 사용자 화면 보기로 구분된다.
* @author 이창원
* @version 1.0
* @created 05-8-2009 오후 2:19:57
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2025.02.24 이호영 최초 생성
*
* </pre>
*/
@Controller
public class SubMainZoneManageController {
private static final Logger LOGGER = LoggerFactory.getLogger(SubMainZoneManageController.class);
@Autowired
private DefaultBeanValidator beanValidator;
/** EgovMessageSource */
@Resource(name = "egovMessageSource")
EgovMessageSource egovMessageSource;
/** EgovPropertyService */
@Resource(name = "propertiesService")
protected EgovPropertyService propertiesService;
/** EgovPopupManageService */
@Resource(name = "subMainZoneManageService")
private SubMainZoneManageService subMainZoneManageService;
/** cmmUseService */
@Resource(name = "EgovCmmUseService")
private EgovCmmUseService cmmUseService;
@Resource(name="EgovFileMngUtil")
private EgovFileMngUtil fileUtil;
@Resource(name="EgovFileMngService")
private EgovFileMngService fileMngService;
@Resource(name = "egovPopupZoneIdGnrService")
private EgovIdGnrService idgenService;
// @Resource(name = "egovMainZoneIdGnrService")
// private EgovIdGnrService idgenServiceMain;
@Resource(name = "egovSubMainZoneIdGnrService")
private EgovIdGnrService idgenServiceSubMain;
@Resource(name = "egovSiteManagerService")
EgovSiteManagerService egovSiteManagerService;
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileService;
/*메인이미지 관리*/
@RequestMapping(value="/uss/ion/bnr/sub/subMainZoneList.do")
// @RequestMapping(value="/uss/ion/pwm/mainzoneList.do")
public String selectMainzoneList(ModelMap model , MainzoneVO mainzoneVO , HttpSession session ) throws Exception {
LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
if(mainzoneVO.getPageUnit()% 8 != 0) {//9 배수로 넘어오지 않으면 초기세팅
mainzoneVO.setPageUnit(8);
}else {
mainzoneVO.setPageUnit(mainzoneVO.getPageUnit());
}
/** pageing */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(mainzoneVO.getPageIndex());
paginationInfo.setRecordCountPerPage(mainzoneVO.getPageUnit());
paginationInfo.setPageSize(mainzoneVO.getPageSize());
mainzoneVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
mainzoneVO.setLastIndex(paginationInfo.getLastRecordIndex());
mainzoneVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(null != loginVO && !"super".equals(loginVO.getSiteId())){ //각각의 사이트
mainzoneVO.setSiteId(loginVO.getSiteId());
}
List<?> mainzoneList = subMainZoneManageService.selectSubMainzoneList(mainzoneVO);
model.addAttribute("mainzoneList", mainzoneList);
int totCnt = subMainZoneManageService.selectSubMainzoneCount(mainzoneVO);
paginationInfo.setTotalRecordCount(totCnt);
model.addAttribute("paginationInfo", paginationInfo);
return "uss/ion/bnr/sub/subMainZoneList";
}
/*알림창등록/수정 view*/
@RequestMapping(value="/uss/ion/bnr/sub/subMainzoneModify.do")
public String updateMainZoneView(@RequestParam Map<?, ?> commandMap,
HttpServletRequest request, Model model, HttpSession session)
throws Exception {
MainzoneVO mainzoneVO = new MainzoneVO();
if("Modify".equals((String)commandMap.get("pageType"))){ //수정
String mazId = (String)commandMap.get("selectedId");
mainzoneVO = subMainZoneManageService.selectSubMainzoneVO(mazId);
String sNtceBgnde = mainzoneVO.getNtceBgnde();
String sNtceEndde = mainzoneVO.getNtceEndde();
if(sNtceBgnde != null && sNtceEndde != null ) {
mainzoneVO.setNtceBgndeHH(sNtceBgnde.substring(8, 10));
mainzoneVO.setNtceBgndeMM(sNtceBgnde.substring(10, 12));
mainzoneVO.setNtceEnddeHH(sNtceEndde.substring(8, 10));
mainzoneVO.setNtceEnddeMM(sNtceEndde.substring(10, 12));
//게시기간 시작일자()
model.addAttribute("ntceBgndeHH", getTimeHH());
//게시기간 시작일자()
model.addAttribute("ntceBgndeMM", getTimeMM());
//게시기간 종료일자()
model.addAttribute("ntceEnddeHH", getTimeHH());
//게시기간 종료일자()
model.addAttribute("ntceEnddeMM", getTimeMM());
}
if(mainzoneVO != null){
mainzoneVO.setBeSort(mainzoneVO.getSort());
FileVO fileVO = new FileVO();
String atchFileId = mainzoneVO.getMainzoneImageFile();
fileVO.setAtchFileId(atchFileId);
List<FileVO> fileList = fileService.selectFileInfs(fileVO);
model.addAttribute("fileList", fileList);
}
}else{ //등록
//게시기간 시작일자()
model.addAttribute("ntceBgndeHH", getTimeHH());
//게시기간 시작일자()
model.addAttribute("ntceBgndeMM", getTimeMM());
//게시기간 종료일자()
model.addAttribute("ntceEnddeHH", getTimeHH());
//게시기간 종료일자()
model.addAttribute("ntceEnddeMM", getTimeMM());
}
//model.addAttribute("sortList", sortList);
model.addAttribute("mainzoneVO", mainzoneVO);
System.out.println("mainzoneVO :: "+ mainzoneVO.toString());
/* 타겟 코드 */
ComDefaultCodeVO vo = new ComDefaultCodeVO();
vo.setCodeId("COM037");
//List<?> targetList = cmmUseService.selectCmmCodeDetail(vo);
//model.addAttribute("targetList", targetList);
return "uss/ion/bnr/sub/subMainZoneModify";
}
/*메인 이미지삭제 */
@RequestMapping("/uss/ion/bnr/sub/subMainzoneListDelete.do")
public String deleteMainzoneDelete(@RequestParam("del") String[] del, RedirectAttributes redirectAttributes , Model model) throws Exception {
LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
MainzoneVO mainzoneVO = new MainzoneVO();
for(String id:del) {
try{
mainzoneVO = subMainZoneManageService.selectSubMainzoneVO(id);
}catch(Exception e){
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("info.nodata.msg"));
RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/subMainZoneList.do");
return redirectUrlMaker.getRedirectUrl();
}
subMainZoneManageService.deleteSubMainzone(id);
if(null != loginVO && !"super".equals(loginVO.getSiteId())){
mainzoneVO.setSiteId(loginVO.getSiteId());
}
subMainZoneManageService.resetSubMainVOSort(mainzoneVO);
}
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/subMainZoneList.do");
return redirectUrlMaker.getRedirectUrl();
}
/**
* 시간을 LIST를 반환한다.
* @return List
* @throws
*/
@SuppressWarnings("unused")
private List<ComDefaultCodeVO> getTimeHH() {
ArrayList<ComDefaultCodeVO> listHH = new ArrayList<ComDefaultCodeVO>();
HashMap<?, ?> hmHHMM;
for (int i = 0; i <= 24; i++) {
String sHH = "";
String strI = String.valueOf(i);
if (i < 10) {
sHH = "0" + strI;
} else {
sHH = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sHH);
codeVO.setCodeNm(sHH);
listHH.add(codeVO);
}
return listHH;
}
/**
* 분을 LIST를 반환한다.
* @return List
* @throws
*/
@SuppressWarnings("unused")
private List<ComDefaultCodeVO> getTimeMM() {
ArrayList<ComDefaultCodeVO> listMM = new ArrayList<ComDefaultCodeVO>();
HashMap<?, ?> hmHHMM;
for (int i = 0; i <= 60; i++) {
String sMM = "";
String strI = String.valueOf(i);
if (i < 10) {
sMM = "0" + strI;
} else {
sMM = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sMM);
codeVO.setCodeNm(sMM);
listMM.add(codeVO);
}
return listMM;
}
}

View File

@ -38,6 +38,7 @@ import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.bnr.service.Banner;
import itn.com.uss.ion.bnr.service.BannerVO;
import itn.com.uss.ion.bnr.service.EgovBannerService;
@ -112,6 +113,12 @@ public class FmsFileController {
@Resource(name = "egovMainZoneIdGnrService")
private EgovIdGnrService idgenServiceMain;
@Resource(name = "egovSubMainZoneIdGnrService")
private EgovIdGnrService idgenServiceSubMain;
@Resource(name = "egovMainPopupIdGnrService")
private EgovIdGnrService idgenServiceMainPopup;
@Resource(name = "egovBannerService")
private EgovBannerService egovBannerService;
@ -387,6 +394,7 @@ public class FmsFileController {
public ModelAndView insertFmsFileInsertAjax(@RequestParam Map<?, ?> commandMap,
@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
MainzoneVO mainzoneVO,
MainPopupVO mainPopupVO,
PopupzoneVO popupzoneVO,
Banner banner,
BannerVO bannerVO,
@ -414,6 +422,10 @@ public class FmsFileController {
String KeyStr = "FMS_";
if("mainzone".equals(fileVO.getMenuName())) { //메인비주얼
KeyStr = "MAZ_";
}else if("subMainzone".equals(fileVO.getMenuName())) { //메인비주얼
KeyStr = "SMAZ_";
}else if("mainPopup".equals(fileVO.getMenuName())) { //메인비주얼
KeyStr = "MPP_";
}else if("popupzone".equals(fileVO.getMenuName())) { //매뉴별 비주얼
KeyStr = "POZ_";
}else if("banner".equals(fileVO.getMenuName())) { //매뉴별 비주얼
@ -442,6 +454,9 @@ public class FmsFileController {
mainzoneVO.setMainzoneImage(orignlFileNm);
mainzoneVO.setMainzoneImageFile(atchFileId);
mainPopupVO.setMainzoneImage(orignlFileNm);
mainPopupVO.setMainzoneImageFile(atchFileId);
fmsFileVO.setFmsImage(orignlFileNm);
fmsFileVO.setFmsImageFile(atchFileId);
@ -477,7 +492,24 @@ public class FmsFileController {
egovPopupManageService.insertMainzone(mainzoneVO);
mainzoneVO.setSortOver("D"); //앞쪽에 넣음
egovPopupManageService.resetMainVOSort(mainzoneVO);
}else if("popupzone".equals(fileVO.getMenuName())) { //매뉴별 비주얼
}
else if("subMainzone".equals(fileVO.getMenuName())) { // 서브 메인비주얼 새글
String mainId = idgenServiceSubMain.getNextStringId();
mainzoneVO.setMazId(mainId);
mainzoneVO.setRegisterId(loginVO.getUniqId());
egovPopupManageService.insertSubMainzone(mainzoneVO);
mainzoneVO.setSortOver("D"); //앞쪽에 넣음
egovPopupManageService.resetSubMainVOSort(mainzoneVO);
}
else if("mainPopup".equals(fileVO.getMenuName())) { // 메인팝업 새글
String mainId = idgenServiceMainPopup.getNextStringId();
mainPopupVO.setPopId(mainId);
mainPopupVO.setRegisterId(loginVO.getUniqId());
egovPopupManageService.insertMainPopup(mainPopupVO);
mainPopupVO.setSortOver("D"); //앞쪽에 넣음
egovPopupManageService.resetMainPopup(mainPopupVO);
}
else if("popupzone".equals(fileVO.getMenuName())) { //매뉴별 비주얼
String pozId = idgenService.getNextStringId();
popupzoneVO.setPozId(pozId);
popupzoneVO.setRegisterId(loginVO.getUniqId());
@ -521,6 +553,19 @@ public class FmsFileController {
mainzoneVO.setSortOver("D");
}
egovPopupManageService.resetMainVOSort(mainzoneVO);
}else if("subMainzone".equals(fileVO.getMenuName())) { //메인비주얼 수정
egovPopupManageService.updateSubMainzone(mainzoneVO);
if(mainzoneVO.getSort() < mainzoneVO.getBeSort() ){ //sortOver : A 후번호로 변경 , D : 선번호로 변경
mainzoneVO.setSortOver("D");
}
egovPopupManageService.resetMainVOSort(mainzoneVO);
}else if("mainPopup".equals(fileVO.getMenuName())) { // 메인팝업 새글
egovPopupManageService.updateMainPopup(mainPopupVO);
if(mainzoneVO.getSort() < mainzoneVO.getBeSort() ){ //sortOver : A 후번호로 변경 , D : 선번호로 변경
mainzoneVO.setSortOver("D");
}
egovPopupManageService.resetMainPopup(mainPopupVO);
}else if("popupzone".equals(fileVO.getMenuName())) { //매뉴별 비주얼
egovPopupManageService.updatePopupzone(popupzoneVO);
if(popupzoneVO.getSort() < popupzoneVO.getBeSort() ){ //sortOver : A 후번호로 변경 , D : 선번호로 변경
@ -557,7 +602,8 @@ public class FmsFileController {
}
}
modelAndView.addObject("result", "success");
}catch (Exception e) {
}catch (Exception e) {
e.printStackTrace();
modelAndView.addObject("result", "fail");
}
return modelAndView;

View File

@ -3,6 +3,8 @@ package itn.com.uss.ion.pwm.service;
import java.util.List;
import java.util.Map;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
/**
* 개요
* - 팝업창에 대한 Service Interface를 정의한다.
@ -124,6 +126,8 @@ public interface EgovPopupManageService {
public void insertMainzone(MainzoneVO mainzoneVO) throws Exception;
public void insertSubMainzone(MainzoneVO mainzoneVO) throws Exception;
public void resetMainSort(MainzoneVO mainzoneVO) throws Exception;
public void updateMainSortUp(SortVO sortVO) throws Exception;
@ -138,6 +142,8 @@ public interface EgovPopupManageService {
public void updateMainzone(MainzoneVO mainzoneVO) throws Exception;
public void updateSubMainzone(MainzoneVO mainzoneVO) throws Exception;
public int selectPopupzoneListTotCnt(PopupzoneVO popupzoneVo) throws Exception;
public int selectMainzoneCount(MainzoneVO mainzoneVO) throws Exception;
@ -146,6 +152,8 @@ public interface EgovPopupManageService {
public void resetMainVOSort(MainzoneVO mainzoneVO) throws Exception;
public void resetSubMainVOSort(MainzoneVO mainzoneVO) throws Exception;
public List<SocialVO> selectSocialList(SocialVO socialVO) throws Exception;
public SocialVO selectSocialVO(String socialId) throws Exception;
@ -161,4 +169,11 @@ public interface EgovPopupManageService {
//사용자 메인화면 롤링 배너 이미지 조회
public List<MainzoneVO> selectMainzoneListRolling() throws Exception;
public void insertMainPopup(MainPopupVO mainPopupVO);
public void resetMainPopup(MainPopupVO mainPopupVO) throws Exception;
public void updateMainPopup(MainPopupVO mainPopupVO) throws Exception;
}

View File

@ -18,6 +18,8 @@ package itn.com.uss.ion.pwm.service;
import java.io.Serializable;
import itn.com.cmm.ComDefaultVO;
import lombok.Getter;
import lombok.Setter;
/**
* @Class Name : MainzoneVO.java
@ -35,6 +37,8 @@ import itn.com.cmm.ComDefaultVO;
*
*
*/
@Getter
@Setter
public class MainzoneVO extends ComDefaultVO implements Serializable {
@ -96,189 +100,7 @@ public class MainzoneVO extends ComDefaultVO implements Serializable {
private String ntceEnddeHH = "";
private String ntceEnddeMM = "";
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
public String getUpfile() {
return upfile;
}
public void setUpfile(String upfile) {
this.upfile = upfile;
}
public String getUpfileUrl() {
return upfileUrl;
}
public void setUpfileUrl(String upfileUrl) {
this.upfileUrl = upfileUrl;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMlink() {
return mlink;
}
public void setMlink(String mlink) {
this.mlink = mlink;
}
public String getIstarget() {
return istarget;
}
public void setIstarget(String istarget) {
this.istarget = istarget;
}
public String getDel() {
return del;
}
public void setDel(String del) {
this.del = del;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
public String getRegdt() {
return regdt;
}
public void setRegdt(String regdt) {
this.regdt = regdt;
}
public String getMainzoneImage() {
return mainzoneImage;
}
public void setMainzoneImage(String mainzoneImage) {
this.mainzoneImage = mainzoneImage;
}
public String getMainzoneImageFile() {
return mainzoneImageFile;
}
public void setMainzoneImageFile(String mainzoneImageFile) {
this.mainzoneImageFile = mainzoneImageFile;
}
public String getMazId() {
return mazId;
}
public void setMazId(String mazId) {
this.mazId = mazId;
}
public String getMazNm() {
return mazNm;
}
public void setMazNm(String mazNm) {
this.mazNm = mazNm;
}
public String getUseYn() {
return useYn;
}
public void setUseYn(String useYn) {
this.useYn = useYn;
}
public String getRegisterId() {
return registerId;
}
public void setRegisterId(String registerId) {
this.registerId = registerId;
}
public String getModdt() {
return moddt;
}
public void setModdt(String moddt) {
this.moddt = moddt;
}
public String getDeviceType() {
return deviceType;
}
public void setDeviceType(String deviceType) {
this.deviceType = deviceType;
}
public String getNtceBgnde() {
return ntceBgnde;
}
public void setNtceBgnde(String ntceBgnde) {
this.ntceBgnde = ntceBgnde;
}
public String getNtceEndde() {
return ntceEndde;
}
public void setNtceEndde(String ntceEndde) {
this.ntceEndde = ntceEndde;
}
public String getNtceBgndeHH() {
return ntceBgndeHH;
}
public void setNtceBgndeHH(String ntceBgndeHH) {
this.ntceBgndeHH = ntceBgndeHH;
}
public String getNtceBgndeMM() {
return ntceBgndeMM;
}
public void setNtceBgndeMM(String ntceBgndeMM) {
this.ntceBgndeMM = ntceBgndeMM;
}
public String getNtceEnddeHH() {
return ntceEnddeHH;
}
public void setNtceEnddeHH(String ntceEnddeHH) {
this.ntceEnddeHH = ntceEnddeHH;
}
public String getNtceEnddeMM() {
return ntceEnddeMM;
}
public void setNtceEnddeMM(String ntceEnddeMM) {
this.ntceEnddeMM = ntceEnddeMM;
}
private String topTxt = "";
private String lowTxt = "";
}

View File

@ -1,17 +1,23 @@
package itn.com.uss.ion.pwm.service.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
import javax.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.pwm.service.EgovPopupManageService;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
@ -240,6 +246,15 @@ public class EgovPopupManageServiceImpl extends EgovAbstractServiceImpl implemen
dao.insertMainzone(mainzoneVO);
}
@Override
public void insertSubMainzone(MainzoneVO mainzoneVO) throws Exception {
dao.insertSubMainzone(mainzoneVO);
}
@Override
public void resetMainPopup(MainPopupVO mainPopupVO) throws Exception {
dao.resetMainPopup(mainPopupVO);
}
@Override
public void resetMainSort(MainzoneVO mainzoneVO) throws Exception {
dao.resetMainSort(mainzoneVO);
@ -295,6 +310,12 @@ public class EgovPopupManageServiceImpl extends EgovAbstractServiceImpl implemen
dao.updateMainzone(mainzoneVO);
}
@Override
public void updateSubMainzone(MainzoneVO mainzoneVO) throws Exception {
dao.updateSubMainzone(mainzoneVO);
}
//사용자 메인화면 롤링 배너 이미지 조회
@Override
public List<MainzoneVO> selectMainzoneListRolling() throws Exception{
@ -325,6 +346,12 @@ public class EgovPopupManageServiceImpl extends EgovAbstractServiceImpl implemen
}
@Override
public void resetSubMainVOSort(MainzoneVO mainzoneVO) throws Exception {
dao.resetSubMainVOSort(mainzoneVO);
}
@Override
public List<SocialVO> selectSocialList(SocialVO socialVO) throws Exception {
return dao.selectSocialList(socialVO);
@ -355,4 +382,52 @@ public class EgovPopupManageServiceImpl extends EgovAbstractServiceImpl implemen
public void deleteSocial(String id) throws Exception {
dao.deleteSocial(id);
}
@Override
public void insertMainPopup(MainPopupVO mainPopupVO) {
dao.insertMainPopup(mainPopupVO);
if(CollectionUtils.isNotEmpty(mainPopupVO.getMainPopupLinkList())) {
List<MainPopupLinkVO> mainPopupLinkListVO = getMainPopupLinkList(mainPopupVO);
// mainPopupLinkListVO.stream().forEach(t-> System.out.println(t.toString()));
dao.insertMainPopupLinkInfo(mainPopupLinkListVO);
}
}
@Override
public void updateMainPopup(MainPopupVO mainPopupVO) throws Exception {
dao.updateMainPopup(mainPopupVO);
if(CollectionUtils.isNotEmpty(mainPopupVO.getMainPopupLinkList())) {
List<MainPopupLinkVO> mainPopupLinkListVO = getMainPopupLinkList(mainPopupVO);
dao.deleteMainPopupLinkInfo(mainPopupVO.getPopId());
dao.insertMainPopupLinkInfo(mainPopupLinkListVO);
}
}
private List<MainPopupLinkVO> getMainPopupLinkList(MainPopupVO mainPopupVO) {
List<MainPopupLinkVO> mainPopupLinkListVO = mainPopupVO.getMainPopupLinkList();
// 기존 sort 값을 숫자로 변환하여 오름차순 정렬
mainPopupLinkListVO.sort(Comparator.comparingInt(vo -> vo.getSort()));
// 2. 정렬된 상태에서 sort 값을 연속적인 숫자로 변경 (1, 2, 3, ...)
IntStream.range(0, mainPopupLinkListVO.size())
.forEach(i -> mainPopupLinkListVO.get(i).setSort(i + 1));
mainPopupLinkListVO.stream().forEach(t-> t.setPopId(mainPopupVO.getPopId()));
return mainPopupLinkListVO;
}
}

View File

@ -5,6 +5,8 @@ import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import itn.com.cmm.service.impl.EgovComAbstractDAO;
import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
import itn.com.uss.ion.pwm.service.MainzoneVO;
import itn.com.uss.ion.pwm.service.PopupManageVO;
import itn.com.uss.ion.pwm.service.PopupzoneVO;
@ -194,6 +196,10 @@ public class PopupManageDAO extends EgovComAbstractDAO {
insert("MainzoneManage.insertMainzone", mainzoneVO);
}
public void insertSubMainzone(MainzoneVO mainzoneVO) throws Exception{
insert("MainzoneManage.insertSubMainzone", mainzoneVO);
}
public void resetMainSort(MainzoneVO mainzoneVO) throws Exception{
insert("MainzoneManage.resetMainSort", mainzoneVO);
}
@ -223,6 +229,10 @@ public class PopupManageDAO extends EgovComAbstractDAO {
update("MainzoneManage.updateMainzone", mainzoneVO);
}
public void updateSubMainzone(MainzoneVO mainzoneVO) throws Exception{
update("MainzoneManage.updateSubMainzone", mainzoneVO);
}
@SuppressWarnings("unchecked")
public List<MainzoneVO> selectMainzoneListRolling() throws Exception{
return (List<MainzoneVO>) list("MainzoneManage.selectMainzoneListRolling");
@ -244,6 +254,10 @@ public class PopupManageDAO extends EgovComAbstractDAO {
update("MainzoneManage.resetMainVOSort", mainzoneVO);
}
public void resetSubMainVOSort(MainzoneVO mainzoneVO) throws Exception{
update("MainzoneManage.resetSubMainVOSort", mainzoneVO);
}
@SuppressWarnings("unchecked")
public List<SocialVO> selectSocialList(SocialVO socialVO) throws Exception{
return (List<SocialVO>) list("SocialManage.selectSocialList",socialVO);
@ -268,4 +282,30 @@ public class PopupManageDAO extends EgovComAbstractDAO {
public void deleteSocial(String id) throws Exception{
delete("SocialManage.deleteSocial", id);
}
public void insertMainPopup(MainPopupVO mainPopupVO) {
insert("MainzoneManage.insertMainPopup", mainPopupVO);
}
public void insertMainPopupLinkInfo(List<MainPopupLinkVO> mainPopupLinkListVO) {
insert("MainzoneManage.insertMainPopupLinkInfo", mainPopupLinkListVO);
}
public void resetMainPopup(MainPopupVO mainPopupVO) {
// update("MainzoneManage.resetSubMainVOSort", mainzoneVO);
insert("MainzoneManage.resetMainPopup", mainPopupVO);
}
public void updateMainPopup(MainPopupVO mainPopupVO) throws Exception{
update("MainzoneManage.updateMainPopup", mainPopupVO);
}
public void updateMainPopupLinkInfo(MainPopupLinkVO mainPopupLinkVO) {
update("MainzoneManage.updateMainPopupLinkInfo", mainPopupLinkVO);
}
public void deleteMainPopupLinkInfo(String popId) {
delete("MainzoneManage.deleteMainPopupLinkInfo", popId);
}
}

View File

@ -845,6 +845,8 @@ public class EgovPopupManageController {
HttpServletRequest request, Model model, HttpSession session)
throws Exception {
System.out.println("??????");
MainzoneVO mainzoneVO = new MainzoneVO();
if("Modify".equals((String)commandMap.get("pageType"))){ //수정
String mazId = (String)commandMap.get("selectedId");
@ -897,6 +899,7 @@ public class EgovPopupManageController {
//model.addAttribute("sortList", sortList);
model.addAttribute("mainzoneVO", mainzoneVO);
System.out.println("mainzoneVO :: "+ mainzoneVO.toString());
/* 타겟 코드 */
ComDefaultCodeVO vo = new ComDefaultCodeVO();
vo.setCodeId("COM037");

View File

@ -0,0 +1,34 @@
package itn.let.cert.ip.service;
import java.util.List;
import itn.let.mail.service.StatusResponse;
public interface CertIpService {
// public List<MberCertPhoneVO> selectMberCertPhoneList(String userId);
//
// public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public List<MberCertPhoneVO> selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO);
//
// public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO);
public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO);
public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO);
public Boolean checkCertIp(MberCertIpVO mberCertIpVO);
public Boolean checkRegCertIp(MberCertIpVO mberCertIpVO);
}

View File

@ -0,0 +1,19 @@
package itn.let.cert.ip.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import egovframework.rte.fdl.cmmn.exception.FdlException;
public interface CertLoginLogService {
public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO, HttpServletRequest request) throws FdlException;
public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO);
}

View File

@ -0,0 +1,71 @@
package itn.let.cert.ip.service;
import itn.let.uss.umt.service.UserDefaultVO;
/**
*
* @author : 이호영
* @fileName : MberCertPhoneVO.java
* @date : 2024.11.18
* @description : 발신번호 lettngnrlmber_cert_ip 관련 vo
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.18 이호영 최초 생성
*
*
*
*/
public class MberCertIpVO extends UserDefaultVO{
/**
* @description :
*/
private static final long serialVersionUID = 1L;
private String mberId;
private String certIp;
private String certMemo;
private String certUseYn;
private String certMbtlnum;
public String getMberId() {
return mberId;
}
public void setMberId(String mberId) {
this.mberId = mberId;
}
public String getCertIp() {
return certIp;
}
public void setCertIp(String certIp) {
this.certIp = certIp;
}
public String getCertMemo() {
return certMemo;
}
public void setCertMemo(String certMemo) {
this.certMemo = certMemo;
}
public String getCertUseYn() {
return certUseYn;
}
public void setCertUseYn(String certUseYn) {
this.certUseYn = certUseYn;
}
public String getCertMbtlnum() {
return certMbtlnum;
}
public void setCertMbtlnum(String certMbtlnum) {
this.certMbtlnum = certMbtlnum;
}
}

View File

@ -0,0 +1,76 @@
package itn.let.cert.ip.service;
import itn.let.uss.umt.service.UserDefaultVO;
/**
*
* @author : 이호영
* @fileName : MberCertLoginLogVO.java
* @date : 2024.11.21
* @description : 로그인 이력관리 92동안만 관리하고 삭제
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.21 이호영 최초 생성
*
*
*
*/
public class MberCertLoginLogVO extends UserDefaultVO{
/**
* @description :
*/
private static final long serialVersionUID = 1L;
private String certLoginId;
private String loginId;
private String loginIp;
private String loginDevice;
private String loginDt;
private String secuLoginFlag;
public String getCertLoginId() {
return certLoginId;
}
public void setCertLoginId(String certLoginId) {
this.certLoginId = certLoginId;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getLoginIp() {
return loginIp;
}
public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
}
public String getLoginDevice() {
return loginDevice;
}
public void setLoginDevice(String loginDevice) {
this.loginDevice = loginDevice;
}
public String getLoginDt() {
return loginDt;
}
public void setLoginDt(String loginDt) {
this.loginDt = loginDt;
}
public String getSecuLoginFlag() {
return secuLoginFlag;
}
public void setSecuLoginFlag(String secuLoginFlag) {
this.secuLoginFlag = secuLoginFlag;
}
}

View File

@ -0,0 +1,39 @@
package itn.let.cert.ip.service.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.cert.ip.service.MberCertIpVO;
@Repository("CertIpDAO")
public class CertIpDAO extends EgovAbstractDAO {
public List<MberCertIpVO> selectMberCertIpList(MberCertIpVO mberCertIpVO) {
return (List<MberCertIpVO>) list("MberCertIpVO.selectMberCertIpList", mberCertIpVO);
}
public void insertCertIp(MberCertIpVO mberCertIpVO) {
insert("MberCertIpVO.insertCertIp", mberCertIpVO);
}
public void deleteCertIp(MberCertIpVO mberCertIpVO) {
insert("MberCertIpVO.deleteCertIp", mberCertIpVO);
}
public MberCertIpVO findByMberCertIpList(MberCertIpVO mberCertIpVO) {
return (MberCertIpVO) select("MberCertIpVO.findByMberCertIpList", mberCertIpVO);
}
public List<MberCertIpVO> checkCertIp(MberCertIpVO mberCertIpVO) {
return (List<MberCertIpVO>) list("MberCertIpVO.checkCertIp", mberCertIpVO);
}
public List<MberCertIpVO> checkRegCertIp(MberCertIpVO mberCertIpVO) {
return (List<MberCertIpVO>) list("MberCertIpVO.checkRegCertIp", mberCertIpVO);
}
}

View File

@ -0,0 +1,68 @@
package itn.let.cert.ip.service.impl;
import java.time.LocalDateTime;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import itn.let.cert.ip.service.CertIpService;
import itn.let.cert.ip.service.MberCertIpVO;
import itn.let.mail.service.StatusResponse;
@Service("CertIpService")
public class CertIpServiceImpl extends EgovAbstractServiceImpl implements CertIpService {
@Resource(name = "CertIpDAO")
private CertIpDAO certIpDAO;
@Override
public StatusResponse selectMberCertIpList(MberCertIpVO mberCertIpVO) {
List<MberCertIpVO> mberCertIpListVO = certIpDAO.selectMberCertIpList(mberCertIpVO);
return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
}
@Override
public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO) {
MberCertIpVO mberCertIpListVO = certIpDAO.findByMberCertIpList(mberCertIpVO);
if(mberCertIpListVO != null) {
return new StatusResponse(HttpStatus.CONFLICT, "중복 IP입니다.", LocalDateTime.now());
}
certIpDAO.insertCertIp(mberCertIpVO);
return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now());
}
@Override
public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO) {
certIpDAO.deleteCertIp(mberCertIpVO);
return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now());
}
@Override
public Boolean checkCertIp(MberCertIpVO mberCertIpVO) {
List<MberCertIpVO> mberCertIpListVO = certIpDAO.checkCertIp(mberCertIpVO);
if(mberCertIpListVO.size()>0) {
return true;
}else {
return false;
}
}
@Override
public Boolean checkRegCertIp(MberCertIpVO mberCertIpVO) {
List<MberCertIpVO> mberCertIpListVO = certIpDAO.checkRegCertIp(mberCertIpVO);
if(mberCertIpListVO.size()>0) {
return true;
}else {
return false;
}
}
}

View File

@ -0,0 +1,47 @@
package itn.let.cert.ip.service.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.cert.ip.service.MberCertLoginLogVO;
@Repository("CertLoginLogDAO")
public class CertLoginLogDAO extends EgovAbstractDAO {
/*
public List<MberCertIpVO> selectMberCertIpList(MberCertIpVO mberCertIpVO) {
return (List<MberCertIpVO>) list("MberCertIpVO.selectMberCertIpList", mberCertIpVO);
}
public void insertCertIp(MberCertIpVO mberCertIpVO) {
insert("MberCertIpVO.insertCertIp", mberCertIpVO);
}
public void deleteCertIp(MberCertIpVO mberCertIpVO) {
insert("MberCertIpVO.deleteCertIp", mberCertIpVO);
}
public MberCertIpVO findByMberCertIpList(MberCertIpVO mberCertIpVO) {
return (MberCertIpVO) select("MberCertIpVO.findByMberCertIpList", mberCertIpVO);
}
*/
public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO) {
insert("MberCertLoginLogVO.insertCertLoginLog", mberCertLoginLogVO);
}
public int checkLoginIpExists(MberCertLoginLogVO mberCertLoginLogVO) {
return (int) select("MberCertLoginLogVO.checkLoginIpExists", mberCertLoginLogVO);
}
public void updateCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO) {
insert("MberCertLoginLogVO.updateCertLoginLog", mberCertLoginLogVO);
}
public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO) {
return (List<MberCertLoginLogVO>) list("MberCertLoginLogVO.findAllCertLoginLogVO", mberCertLoginLogVO);
}
}

View File

@ -0,0 +1,87 @@
package itn.let.cert.ip.service.impl;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import itn.let.cert.ip.service.CertLoginLogService;
import itn.let.cert.ip.service.MberCertLoginLogVO;
@Service("CertLoginLogService")
public class CertLoginLogServiceImpl extends EgovAbstractServiceImpl implements CertLoginLogService {
@Resource(name = "CertLoginLogDAO")
private CertLoginLogDAO certLoginLogDAO;
@Resource(name = "egovMjonCertLoginLogIdGnrService")
private EgovIdGnrService certLoginLogIdGnrService;
/*
@Override
public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO) {
List<MberCertIpVO> mberCertIpListVO = certLoginLogDAO.selectMberCertIpList(mberCertPhoneVO);
return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
}
@Override
public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO) {
MberCertIpVO mberCertIpListVO = certLoginLogDAO.findByMberCertIpList(mberCertIpVO);
if(mberCertIpListVO != null) {
return new StatusResponse(HttpStatus.CONFLICT, "중복 IP입니다.", LocalDateTime.now());
}
certLoginLogDAO.insertCertIp(mberCertIpVO);
return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now());
}
@Override
public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO) {
certLoginLogDAO.deleteCertIp(mberCertIpVO);
return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now());
}
*/
@Override
public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO, HttpServletRequest request) throws FdlException {
// int count = certLoginLogDAO.checkLoginIpExists(mberCertLoginLogVO);
//
// if (count > 0) {
// // 이미 존재하면 UPDATE
// certLoginLogDAO.updateCertLoginLog(mberCertLoginLogVO);
// } else {
mberCertLoginLogVO.setCertLoginId(certLoginLogIdGnrService.getNextStringId());
mberCertLoginLogVO.setLoginDevice(getDevice(request));
certLoginLogDAO.insertCertLoginLog(mberCertLoginLogVO);
// }
}
private String getDevice(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent").toLowerCase();
if (userAgent.contains("mobile") || userAgent.contains("android") || userAgent.contains("iphone")) {
return "M";
} else if (userAgent.contains("tablet") || userAgent.contains("ipad")) {
return "T";
} else {
return "D";
}
}
@Override
public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO) {
// TODO Auto-generated method stub
return certLoginLogDAO.findAllCertLoginLogVO(mberCertLoginLogVO);
}
}

View File

@ -0,0 +1,127 @@
package itn.let.cert.ip.web;
import java.time.LocalDateTime;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.ip.service.CertIpService;
import itn.let.cert.ip.service.MberCertIpVO;
import itn.let.mail.service.StatusResponse;
import itn.let.utl.sim.service.EgovClntInfo;
/**
*
* @author : 이호영
* @fileName : CertIpController.java
* @date : 2024.11.19
* @description : 허용 IP 관련 컨트롤러
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.19 이호영 최초 생성
*
*
*
*/
@Controller
public class CertIpController {
/* certIpService */
@Resource(name = "CertIpService")
private CertIpService certIpService;
@RequestMapping(value = {"/cert/ip/selectMberCertIpList.do"})
public ResponseEntity<StatusResponse> selectMberCertIpList(MberCertIpVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setMberId(userId);
return ResponseEntity.ok().body(certIpService.selectMberCertIpList(mberCertPhoneVO));
}
@RequestMapping(value = {"/cert/ip/insertCertIp.do"})
public ResponseEntity<StatusResponse> insertCertIp(MberCertIpVO mberCertIpVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertIpVO.setFrstRegisterId(userId);
mberCertIpVO.setMberId(userId);
return ResponseEntity.ok().body(certIpService.insertCertIp(mberCertIpVO));
}
@RequestMapping(value = {"/cert/ip/insertCennetCertIp.do"})
public ResponseEntity<StatusResponse> insertCennetCertIp(MberCertIpVO mberCertIpVO,HttpServletRequest request) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertIpVO.setFrstRegisterId(userId);
mberCertIpVO.setMberId(userId);
mberCertIpVO.setCertIp(EgovClntInfo.getClntIP(request));
mberCertIpVO.setCertMemo("허용 IP 등록");
return ResponseEntity.ok().body(certIpService.insertCertIp(mberCertIpVO));
}
@RequestMapping(value = {"/cert/ip/deleteCertIp.do"})
public ResponseEntity<StatusResponse> deleteCertIp(MberCertIpVO mberCertIpVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertIpVO.setLastUpdusrId(userId);
mberCertIpVO.setMberId(userId);
return ResponseEntity.ok().body(certIpService.deleteCertIp(mberCertIpVO));
}
}

View File

@ -0,0 +1,102 @@
package itn.let.cert.ip.web;
import java.time.LocalDateTime;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.ip.service.CertLoginLogService;
import itn.let.cert.ip.service.MberCertIpVO;
import itn.let.mail.service.StatusResponse;
/**
*
* @author : 이호영
* @fileName : CertIpController.java
* @date : 2024.11.19
* @description : 허용 IP 관련 컨트롤러
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.19 이호영 최초 생성
*
*
*
*/
@Controller
public class CertLoginLogController {
/* CertLoginLogService */
@Resource(name = "CertLoginLogService")
private CertLoginLogService certLoginLogService;
/*
@RequestMapping(value = {"/cert/ip/selectMberCertIpList.do"})
public ResponseEntity<StatusResponse> selectMberCertIpList(MberCertIpVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setMberId(userId);
return ResponseEntity.ok().body(certLoginLogService.selectMberCertIpList(mberCertPhoneVO));
}
@RequestMapping(value = {"/cert/ip/insertCertIp.do"})
public ResponseEntity<StatusResponse> insertCertIp(MberCertIpVO mberCertIpVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertIpVO.setFrstRegisterId(userId);
mberCertIpVO.setMberId(userId);
return ResponseEntity.ok().body(certLoginLogService.insertCertIp(mberCertIpVO));
}
@RequestMapping(value = {"/cert/ip/deleteCertIp.do"})
public ResponseEntity<StatusResponse> deleteCertIp(MberCertIpVO mberCertIpVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertIpVO.setLastUpdusrId(userId);
mberCertIpVO.setMberId(userId);
return ResponseEntity.ok().body(certLoginLogService.deleteCertIp(mberCertIpVO));
}
*/
}

View File

@ -0,0 +1,46 @@
package itn.let.cert.phone.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import itn.let.mail.service.StatusResponse;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.web.SendLogVO;
public interface CertPhoneService {
// public List<MberCertPhoneVO> selectMberCertPhoneList(String userId);
//
// public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public List<MberCertPhoneVO> selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO);
//
public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
//
// public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO);
public StatusResponse selectMberCertPhoneList(MberCertPhoneVO mberCertPhoneVO);
public StatusResponse insertCertPhone(MberCertPhoneVO mberCertPhoneVO, String moblphonNo);
public StatusResponse deleteCertPhone(MberCertPhoneVO mberCertPhoneVO);
public List<MberCertPhoneVO> selectMberCertPhoneList(String userId);
public StatusResponse selectMberCertPhoneListWhereUserId(String userId);
public StatusResponse updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO);
public StatusResponse selectSysMsgLogCheck(MberCertPhoneVO mberCertPhoneVO);
public MberCertPhoneVO selectCertUrlCode(MberCertPhoneVO mberCertPhoneVO) throws Exception;
public StatusResponse insertCertLog(HttpServletRequest request) throws Exception;
}

View File

@ -0,0 +1,159 @@
package itn.let.cert.phone.service;
import itn.let.uss.umt.service.UserDefaultVO;
/**
*
* @author : 이호영
* @fileName : MberCertPhoneVO.java
* @date : 2024.11.18
* @description : 발신번호 lettngnrlmber_cert_ip 관련 vo
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.18 이호영 최초 생성
*
*
*
*/
public class MberCertPhoneVO extends UserDefaultVO{
/**
* @description :
*/
private static final long serialVersionUID = 1L;
private String mberId;
private String mbtlnum;
private String certAlias;
private String certMemo;
private String certUseYn;
private String checkNo;
private String trUrl;
private String urlCode;
private String url;
private String host;
private String name = "";
private String phoneNo = "";
private String phoneCorp = "";
private String birthDay = "";
private String gender = "";
private String nation = "0";
private String plusInfo = "";
public String getMberId() {
return mberId;
}
public void setMberId(String mberId) {
this.mberId = mberId;
}
public String getMbtlnum() {
return mbtlnum;
}
public void setMbtlnum(String mbtlnum) {
this.mbtlnum = mbtlnum;
}
public String getCertAlias() {
return certAlias;
}
public void setCertAlias(String certAlias) {
this.certAlias = certAlias;
}
public String getCertMemo() {
return certMemo;
}
public void setCertMemo(String certMemo) {
this.certMemo = certMemo;
}
public String getCertUseYn() {
return certUseYn;
}
public void setCertUseYn(String certUseYn) {
this.certUseYn = certUseYn;
}
public String getCheckNo() {
return checkNo;
}
public void setCheckNo(String checkNo) {
this.checkNo = checkNo;
}
public String getUrlCode() {
return urlCode;
}
public void setUrlCode(String urlCode) {
this.urlCode = urlCode;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getPhoneCorp() {
return phoneCorp;
}
public void setPhoneCorp(String phoneCorp) {
this.phoneCorp = phoneCorp;
}
public String getBirthDay() {
return birthDay;
}
public void setBirthDay(String birthDay) {
this.birthDay = birthDay;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public String getPlusInfo() {
return plusInfo;
}
public void setPlusInfo(String plusInfo) {
this.plusInfo = plusInfo;
}
public String getTrUrl() {
return trUrl;
}
public void setTrUrl(String trUrl) {
this.trUrl = trUrl;
}
}

View File

@ -0,0 +1,50 @@
package itn.let.cert.phone.service.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.uat.uia.service.AuthCertVO;
@Repository("CertPhoneDAO")
public class CertPhoneDAO extends EgovAbstractDAO {
public List<MberCertPhoneVO> selectMberCertPhoneList(String userId) {
return (List<MberCertPhoneVO>) list("mberCertPhoneVO.selectMberCertPhoneList", userId);
}
public void insertCertPhone(MberCertPhoneVO mberCertPhoneVO) {
insert("mberCertPhoneVO.insertCertPhone", mberCertPhoneVO);
}
public void deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) {
insert("mberCertPhoneVO.deleteCertPhone", mberCertPhoneVO);
}
public MberCertPhoneVO findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) {
return (MberCertPhoneVO) select("mberCertPhoneVO.findByCertPhoneInfo", mberCertPhoneVO);
}
public void updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO) {
insert("mberCertPhoneVO.updateMberCertPhone", mberCertPhoneVO);
}
public List<MberCertPhoneVO> selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO) {
return (List<MberCertPhoneVO>) list("mberCertPhoneVO.selectMberCertPhoneListVO", mberCertPhoneVO);
}
public int countSysMsgLogCheck(MberCertPhoneVO mberCertPhoneVO) {
return (int) select("mberCertPhoneVO.countSysMsgLogCheck", mberCertPhoneVO);
}
public MberCertPhoneVO selectCertUrlCode(MberCertPhoneVO mberCertPhoneVO) {
return (MberCertPhoneVO) select("certPhoneDAO.selectCertUrlCode", mberCertPhoneVO);
}
public void insertCertLog(AuthCertVO authCertVO) throws Exception {
insert("certPhoneDAO.insertCertLog", authCertVO);
}
}

View File

@ -0,0 +1,141 @@
package itn.let.cert.phone.service.impl;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.cmm.util.IpUtil;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.phone.service.CertPhoneService;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.mail.service.StatusResponse;
import itn.let.uat.uia.service.AuthCertVO;
@Service("CertPhoneService")
public class CertPhoneServiceImpl extends EgovAbstractServiceImpl implements CertPhoneService {
@Resource(name = "CertPhoneDAO")
private CertPhoneDAO certPhoneDAO;
@Override
public StatusResponse selectMberCertPhoneList(MberCertPhoneVO mberCertPhoneVO) {
List<MberCertPhoneVO> mberCertIpListVO = certPhoneDAO.selectMberCertPhoneListVO(mberCertPhoneVO);
return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
}
@Override
public StatusResponse insertCertPhone(MberCertPhoneVO mberCertPhoneVO, String moblphonNo) {
System.out.println("findByCertPhoneInfo : :::: ");
try {
MberCertPhoneVO mberCertPhoneListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO);
if(mberCertPhoneListVO != null) {
if(mberCertPhoneListVO.getMbtlnum().equals(moblphonNo)) {
return new StatusResponse(HttpStatus.CONFLICT, "중복 번호입니다.", LocalDateTime.now());
}
}
certPhoneDAO.insertCertPhone(mberCertPhoneVO);
} catch (Exception e) {
e.printStackTrace(); // TODO: handle exception
return new StatusResponse(HttpStatus.OK, "오류가 발생하였습니다.", LocalDateTime.now());
}
return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now());
}
@Override
public StatusResponse deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) {
certPhoneDAO.deleteCertPhone(mberCertPhoneVO);
return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now());
}
@Override
public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) {
MberCertPhoneVO mberCertIpListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO);
return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
}
@Override
public List<MberCertPhoneVO> selectMberCertPhoneList(String userId) {
return certPhoneDAO.selectMberCertPhoneList(userId);
}
@Override
public StatusResponse selectMberCertPhoneListWhereUserId(String userId) {
return new StatusResponse(HttpStatus.OK, certPhoneDAO.selectMberCertPhoneList(userId), LocalDateTime.now());
}
@Override
public StatusResponse updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO) {
certPhoneDAO.updateMberCertPhone(mberCertPhoneVO);
return new StatusResponse(HttpStatus.OK, "수정 하였습니다.", LocalDateTime.now());
}
@Override
public StatusResponse selectSysMsgLogCheck(MberCertPhoneVO mberCertPhoneVO) {
// TODO Auto-generated method stub
int certCnt = 0;
certCnt = certPhoneDAO.countSysMsgLogCheck(mberCertPhoneVO);
if(certCnt < 1) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "[인증번호 불일치] 입력하신 정보를 재확인 해주세요.", LocalDateTime.now());
}
return new StatusResponse(HttpStatus.OK, "", LocalDateTime.now());
}
@Override
public MberCertPhoneVO selectCertUrlCode(MberCertPhoneVO mberCertPhoneVO) {
return certPhoneDAO.selectCertUrlCode(mberCertPhoneVO);
}
@Override
public StatusResponse insertCertLog(HttpServletRequest request) throws Exception {
try {
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
//KMC 본인인증 로그 insert
AuthCertVO authCertVO = new AuthCertVO();
authCertVO.setMberId(userId);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
authCertVO.setCertDate(sdf.format(new Date()));
authCertVO.setCertType("본인인증 시도");
authCertVO.setCertIpaddr(IpUtil.getClientIP(request));
certPhoneDAO.insertCertLog(authCertVO);
} catch (Exception e) {
System.out.println("본인인증 시도 로그 실패");
}
return new StatusResponse(HttpStatus.OK, "", LocalDateTime.now());
}
}

View File

@ -0,0 +1,239 @@
package itn.let.cert.phone.web;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.phone.service.CertPhoneService;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.uat.uia.web.SendLogVO;
/**
*
* @author : 이호영
* @fileName : CertIpController.java
* @date : 2024.11.19
* @description : 허용 IP 관련 컨트롤러
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2024.11.19 이호영 최초 생성
*
*
*
*/
@Controller
public class CertPhoneController {
/* certPhoneService */
@Resource(name = "CertPhoneService")
private CertPhoneService certPhoneService;
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@RequestMapping(value = {"/cert/phone/selectMberCertPhoneList"})
public ResponseEntity<StatusResponse> selectMberCertPhoneList(MberCertPhoneVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setMberId(userId);
return ResponseEntity.ok().body(certPhoneService.selectMberCertPhoneListWhereUserId(userId));
}
@RequestMapping(value = {"/cert/phone/findByCertPhoneInfo.do"})
public ResponseEntity<StatusResponse> findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
return ResponseEntity.ok().body(certPhoneService.findByCertPhoneInfo(mberCertPhoneVO));
}
@RequestMapping(value = {"/cert/phone/insertCertPhone.do"})
public ResponseEntity<StatusResponse> insertCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
System.out.println(" :: insertCertPhone :: ");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setFrstRegisterId(userId);
mberCertPhoneVO.setMberId(userId);
return ResponseEntity.ok().body(certPhoneService.insertCertPhone(mberCertPhoneVO, loginVO.getMoblphonNo()));
}
@RequestMapping(value = {"/cert/phone/updateCertPhone.do"})
public ResponseEntity<StatusResponse> updateCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setFrstRegisterId(userId);
if(StringUtils.isEmpty(mberCertPhoneVO.getMberId()) ) {
mberCertPhoneVO.setMberId(userId);
}
return ResponseEntity.ok().body(certPhoneService.updateMberCertPhone(mberCertPhoneVO));
}
@RequestMapping(value = {"/cert/phone/deleteCertPhone.do"})
public ResponseEntity<StatusResponse> deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setLastUpdusrId(userId);
if(StringUtils.isEmpty(mberCertPhoneVO.getMberId()) ) {
mberCertPhoneVO.setMberId(userId);
}
return ResponseEntity.ok().body(certPhoneService.deleteCertPhone(mberCertPhoneVO));
}
@RequestMapping(value = {"/cert/phone/sendSysMsgDataAjax.do"})
public ResponseEntity<StatusResponse> sendSysMsgDataAjax(MberCertPhoneVO mberCertPhoneVO,
HttpServletRequest request) throws Exception {
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setMberId(userId);
// 번호 중복 확인
MberCertPhoneVO mberCertIpListVO = (MberCertPhoneVO) certPhoneService.findByCertPhoneInfo(mberCertPhoneVO).getObject();
if(mberCertIpListVO != null || loginVO.getMoblphonNo().equals(mberCertPhoneVO.getMbtlnum()) ) {
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.CONFLICT, "등록된 번호입니다.", LocalDateTime.now()));
}
MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setCallTo(mberCertPhoneVO.getMbtlnum());
MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO, request);
String resultSts = returnVO.getSendMsgCnt();
String resultBlockSts = returnVO.getSendMsgBlockCnt();
String msg= "";
Map<String, String> returnMap = new HashMap<>();
HttpStatus httpStatus = null;
if (!resultSts.equals("0")) {
httpStatus = HttpStatus.OK;
returnMap.put("msg", "문자 전송이 완료되었습니다.");
returnMap.put("resultSts", resultSts);
returnMap.put("resultBlockSts", resultBlockSts);
} else {
httpStatus = HttpStatus.BAD_REQUEST;
returnMap.put("msg", "문자 전송에 오류가 발생하였습니다.");
returnMap.put("resultSts", "0");
returnMap.put("resultBlockSts", "0");
}
return ResponseEntity.ok().body(new StatusResponse(httpStatus, returnMap, LocalDateTime.now()));
}
@RequestMapping(value = {"/cert/phone/selectSysMsgLogCheck.do"})
public ResponseEntity<StatusResponse> selectSysMsgLogCheck(MberCertPhoneVO mberCertPhoneVO) throws Exception {
//로그인 권한정보 불러오기
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == null) {
if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
}
mberCertPhoneVO.setMberId(userId);
//
return ResponseEntity.ok().body(certPhoneService.selectSysMsgLogCheck(mberCertPhoneVO));
}
}

View File

@ -0,0 +1,44 @@
package itn.let.cert.phone.web;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.phone.service.CertPhoneService;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.web.SendLogVO;
@Controller
public class CertPhoneWebController {
@Resource(name = "CertPhoneService")
private CertPhoneService certPhoneService;
@RequestMapping(value = {"/web/cert/log/insertCertLog.do"})
public ResponseEntity<StatusResponse> insertCertLog(HttpServletRequest request) throws Exception {
return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, certPhoneService.insertCertLog(request), LocalDateTime.now()));
}
@RequestMapping(value = {"/web/cert/log/kmcErrorPage.do"})
public String kmcErrorPage() throws Exception {
return "web/cop/kmc/certResultError";
}
}

View File

@ -0,0 +1,32 @@
package itn.let.cmm.vo;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
/**
*
* @author : 이호영
* @fileName : FileInfoVO.java
* @date : 2025.01.17
* @description : 파일 경로에서 파일명만 가져와 ID 가져올때 사용하는 VO
* MjonMsgDetailSentVO 참고
* ===========================================================
* DATE AUTHOR NOTE
* ----------------------------------------------------------- *
* 2025.01.17 이호영 최초 생성
*
*
*
*/
@Getter
@Setter
public class FileInfoVO implements Serializable {
private static final long serialVersionUID = 1L;
private String atchFileId; // 첨부파일 ID
private String fileSn; // 파일 순번
}

View File

@ -4656,78 +4656,126 @@ public class EgovBBSManageController {
@ModelAttribute("searchVO") TermsVO termsVO, ModelMap model ,
RedirectAttributes redirectAttributes) throws Exception {
String menuNm = termsVO.getMenuNm();
String termsMstNo = termsVO.getTermsMastNo();
// String effectDate_02 = "";
// String effectDate_03 = "";
//초기 화면 로딩시 값이 Null 인경우 이용약관, 2024년 정보 불러오도록 셋팅
if(menuNm == null) {
menuNm = "02";
}
if(termsMstNo == null) {
termsMstNo = "2023";
}
// if(termsMstNo.equals("2024")) {
// effectDate_02 = " v2.0";
// effectDate_03 = " v2.0";
// }else if(termsMstNo.equals("2023")) {
// effectDate_02 = "(2023.04.26~2024.10.31)";
// effectDate_03 = "(2023.12.15~2024.10.31)";
// }else if(termsMstNo.equals("2022")) {
// effectDate_02 = "(2022.08.01~2023.04.25)";
// effectDate_03 = "(2022.08.01~2023.12.14)";
// }
// model.addAttribute("effectDate_02", effectDate_02); //이용약관 개정 일자 표시
// model.addAttribute("effectDate_03", effectDate_03); //개인정보처리방침 개정 일자 표시
model.addAttribute("termsMstNo", termsMstNo); //요청 버전 (2024, 2023, 2022 )
//상세 하단 리스트
if(request.getRequestURI().contains("ListAjax.do")) {
if(menuNm.equals("02")) {
String jspName = "TermsListAgreement_" + termsMstNo + "_Ajax";
return "web/cop/bbs/"+jspName;
}else if(menuNm.equals("03")) {
String jspName = "TermsListPrivate_" + termsMstNo + "_Ajax";
return "web/cop/bbs/"+jspName;
}
// 공통
List<TermsVO> resultList = new ArrayList<TermsVO>();
// 이용약관, 개인정보보호방침 이전버전 List
TermsVO termsVO2 = new TermsVO();
termsVO2.setFirstIndex(0);
termsVO2.setRecordCountPerPage(20);
termsVO2.setSearchDiv(termsVO.getMenuNm());
termsVO2.setSearchUseYn("N");
termsVO2.setSearchSortCnd("effectDate");
termsVO2.setSearchSortOrd("desc");
List<TermsVO> termsMastList = egovSiteManagerService.selectTermsMastMngBeforeList(termsVO2);
model.addAttribute("termsMastList", termsMastList);
/*
* 이용약관 개인정보 처리방침 화면은 HTML 화면으로 전환되어 디비 조회 코드는 주석 처리함
* 2024 10 25 우영두 수정
* */
// NEW
// 이용약관, 개인정보보호방침 최신버전 List
TermsVO termsVO3 = new TermsVO();
termsVO3.setFirstIndex(0);
termsVO3.setRecordCountPerPage(1);
termsVO3.setSearchDiv(termsVO.getMenuNm());
termsVO3.setSearchUseYn("Y");
termsVO3.setSearchSortCnd("effectDate");
termsVO3.setSearchSortOrd("desc");
List<TermsVO> termsMastList2 = egovSiteManagerService.selectTermsMastMngList(termsVO3);
if (termsMastList2.size() > 0) {
TermsVO termsVO4 = new TermsVO();
termsVO4.setFirstIndex(0);
termsVO4.setRecordCountPerPage(20);
termsVO4.setTermsMastNo(termsMastList2.get(0).getTermsMastNo());
termsVO4.setSearchUseYn("Y");
termsVO4.setSearchSortCnd("sort");
termsVO4.setSearchSortOrd("ASC");
resultList = egovSiteManagerService.selectTermsSubMngList(termsVO4);
}
// // 이용약관, 개인정보보호방침 이전버전 List
// TermsVO termsVO2 = new TermsVO();
// termsVO2.setFirstIndex(0);
// termsVO2.setRecordCountPerPage(20);
// termsVO2.setSearchDiv(termsVO.getMenuNm());
// termsVO2.setSearchUseYn("N");
// termsVO2.setSearchSortCnd("effectDate");
// termsVO2.setSearchSortOrd("desc");
// List<TermsVO> termsMastList = egovSiteManagerService.selectTermsMastMngBeforeList(termsVO2);
// model.addAttribute("termsMastList", termsMastList);
//
// // NEW
// // 이용약관, 개인정보보호방침 최신버전 List
// TermsVO termsVO3 = new TermsVO();
// termsVO3.setFirstIndex(0);
// termsVO3.setRecordCountPerPage(1);
// termsVO3.setSearchDiv(termsVO.getMenuNm());
// termsVO3.setSearchUseYn("Y");
// termsVO3.setSearchSortCnd("effectDate");
// termsVO3.setSearchSortOrd("desc");
// List<TermsVO> termsMastList2 = egovSiteManagerService.selectTermsMastMngList(termsVO3);
// if (termsMastList2.size() > 0) {
// TermsVO termsVO4 = new TermsVO();
// termsVO4.setFirstIndex(0);
// termsVO4.setRecordCountPerPage(20);
// termsVO4.setTermsMastNo(termsMastList2.get(0).getTermsMastNo());
// termsVO4.setSearchUseYn("Y");
// termsVO4.setSearchSortCnd("sort");
// termsVO4.setSearchSortOrd("ASC");
// resultList = egovSiteManagerService.selectTermsSubMngList(termsVO4);
// }
// 불법스팸방지안내
if (termsVO.getMenuNm().equals("04")) {
termsVO.setSearchSortCnd("TERMS_ID");
termsVO.setSearchSortOrd("ASC");
resultList = egovSiteManagerService.selectTermsMenu(termsVO);
}
model.addAttribute("resultList", resultList);
return "web/cop/bbs/TermsListAjax";
}
else {
String effectDate_02 = "";
String effectDate_03 = "";
TermsVO termsVO7 = new TermsVO();
termsVO7.setFirstIndex(0);
termsVO7.setRecordCountPerPage(2);
termsVO7.setSearchUseYn("Y");
termsVO7.setSearchSortCnd("effectDate");
termsVO7.setSearchSortOrd("desc");
List<TermsVO> termsMastList7 = egovSiteManagerService.selectTermsMastMngList(termsVO7);
for(TermsVO item : termsMastList7) {
if (item.getTermsDivCode().equals("02")) {
effectDate_02 = "(" + item.getEffectDate() + ")";
if("2023".equals(termsMstNo)) {
termsVO.setSearchSortCnd("TERMS_ID");
termsVO.setSearchSortOrd("ASC");
resultList = egovSiteManagerService.selectTermsMenu(termsVO);
model.addAttribute("resultList", resultList);
}
if (item.getTermsDivCode().equals("03")) {
effectDate_03 = "(" + item.getEffectDate() + ")";
}
}
model.addAttribute("effectDate_02", effectDate_02);
model.addAttribute("effectDate_03", effectDate_03);
String jspName = "TermsListSpam_" + termsMstNo + "_Ajax";
return "web/cop/bbs/"+jspName;
}
}
// else {
// String effectDate_02 = "";
// String effectDate_03 = "";
// TermsVO termsVO7 = new TermsVO();
// termsVO7.setFirstIndex(0);
// termsVO7.setRecordCountPerPage(2);
// termsVO7.setSearchUseYn("Y");
// termsVO7.setSearchSortCnd("effectDate");
// termsVO7.setSearchSortOrd("desc");
// List<TermsVO> termsMastList7 = egovSiteManagerService.selectTermsMastMngList(termsVO7);
// for(TermsVO item : termsMastList7) {
// if (item.getTermsDivCode().equals("02")) {
// effectDate_02 = "(" + item.getEffectDate() + ")";
// }
// if (item.getTermsDivCode().equals("03")) {
//
// effectDate_03 = "(" + item.getEffectDate() + ")";
// }
// }
// model.addAttribute("effectDate_02", effectDate_02);
// model.addAttribute("effectDate_03", effectDate_03);
// }
return "web/cop/bbs/TermsList";
}
@ -4770,7 +4818,7 @@ public class EgovBBSManageController {
try {
// 이용약관 회원 전체발송
//mjonNoticeSendUtil.userAllTermsEmailSend();
mjonNoticeSendUtil.userAllTermsEmailSend();
}
catch(Exception e) {
isSuccess = false;

View File

@ -2,6 +2,8 @@ package itn.let.fax.addr.service;
import java.util.List;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.addr.service.AddrGroupVO;
import itn.let.mjo.addr.service.AddrVO;
public interface FaxAddrService {
@ -90,4 +92,11 @@ public interface FaxAddrService {
List<FaxAddrVO> selectFaxAddrListAjax(FaxAddrVO faxAddrVO);
public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception;
void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception;
int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception;
}

View File

@ -35,6 +35,11 @@ public class FaxAddrVO extends ComDefaultVO{
private String[] excelDownTitles;
// 주소록 등록 batch 몇번째인지 확인
private int batchStart;
//
private int dataTotCount;
@SuppressWarnings("rawtypes")
private List addrIdList;
@ -287,6 +292,24 @@ public class FaxAddrVO extends ComDefaultVO{
this.moveAddrAllFlag = moveAddrAllFlag;
}
public int getBatchStart() {
return batchStart;
}
public void setBatchStart(int batchStart) {
this.batchStart = batchStart;
}
public int getDataTotCount() {
return dataTotCount;
}
public void setDataTotCount(int dataTotCount) {
this.dataTotCount = dataTotCount;
}
public String getFieldValue(String field) {
if("addrPhoneNo".equals(field)) {
return this.addrPhoneNo;

View File

@ -90,4 +90,9 @@ public class FaxAddrGroupDAO extends EgovAbstractDAO{
public int selectMaxOrderFaxNumber(FaxAddrGroupVO addrGroupVO) throws Exception{
return (Integer)select("FaxAddrGroupDAO.selectMaxOrderFaxNumber", addrGroupVO);
}
public void deleteFaxAddrGroup_advc(FaxAddrGroupVO addrGroupVO) {
update("FaxAddrGroupDAO.deleteFaxAddrGroup_advc", addrGroupVO);
}
}

View File

@ -1,12 +1,19 @@
package itn.let.fax.addr.service.impl;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
@ -17,8 +24,11 @@ import itn.let.fax.addr.service.FaxAddrGroupVO;
import itn.let.fax.addr.service.FaxAddrService;
import itn.let.fax.addr.service.FaxAddrTransHistVO;
import itn.let.fax.addr.service.FaxAddrVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.addr.service.AddrVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service("FaxAddrService")
public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAddrService{
@ -36,6 +46,15 @@ public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAd
private EgovIdGnrService idgenAddrTransHistId;
private static final String FAX_REGEX = "^(02\\d|03[1-3]|04[1-4]|05[1-5]|06[1-4]|030|050|060|070|080|1\\d{2})$";
private static final Pattern FAX_PATTERN = Pattern.compile(FAX_REGEX);
private static final Charset EUC_KR = Charset.forName("EUC-KR");
private static final int MAX_SINGLE_ENTRY_CNT = 300000;
private static final int MAX_FAX_ADDR_CNT = 1000000; // 팩스 주소록 등록 최대 수량
public List<FaxAddrVO> selectFaxAddrList(FaxAddrVO addrVO) throws Exception {
return faxAddrDAO.selectFaxAddrList(addrVO);
}
@ -359,4 +378,193 @@ public class FaxAddrServiceImpl extends EgovAbstractServiceImpl implements FaxAd
return faxAddrDAO.selectFaxAddrListAjax(faxAddrVO);
}
@Override
public StatusResponse faxAddrMassInsertByTempAjax_advc(List<FaxAddrVO> faxAddrListVO, String userId) throws Exception {
for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setMberId(userId); }
if(faxAddrListVO.size() > MAX_SINGLE_ENTRY_CNT) {
return new StatusResponse(
HttpStatus.BAD_REQUEST
, "주소록은 한번에 30만개까지만 등록이 가능합니다."
, LocalDateTime.now()
);
}
// step1 현재 주소록 갯수 조회
// 배치 처음 돌때만 실행
if(faxAddrListVO.get(0).getBatchStart() < 1) {
// step1-1 회원별 주소록 전체 갯수 조회
int faxAddrBefCnt = faxAddrDAO.selectFaxAddrTotalCount(faxAddrListVO.get(0));
int faxAddrNewCnt = faxAddrListVO.get(0).getDataTotCount(); //신규 추가할 주소록 갯수
int sumFaxAddrCnt = faxAddrBefCnt + faxAddrNewCnt;
System.out.println("faxAddrListVO.size() : "+ faxAddrListVO.size());
// step1-2 갯수가 (주소록 갯수 + 신규 주소록)1000만건 체크
if(sumFaxAddrCnt > MAX_FAX_ADDR_CNT) {
return new StatusResponse(
HttpStatus.BAD_REQUEST
, "주소록은 총 100만개까지만 등록이 가능합니다."
, LocalDateTime.now()
);
}
}
// step3
// => 팩스번호 빼고 바이트 체크해서 20byte만 짜르고 넣기
// => 팩스번호는 유효성 체크 하기
long startTime = System.currentTimeMillis();
// 유효성 체크 하이픈 제거, 유효하지 않은 번호는 리스트에서 제거
// 나머지 필드들 20byte (euc-kr) 체크 넘으면 자르기
AtomicInteger invalid = new AtomicInteger(0); // 스레드-안전(thread-safe)하게 정수 값을 업데이트할 있는 기능을 제공
// log.info(" ++ before faxAddrListVO.size() :: [{}]", faxAddrListVO.size());
/*faxAddrListVO.removeIf(faxAddr -> {
String phoneNo = faxAddr.getAddrPhoneNo().replaceAll("[^0-9]", "");
if (isValidFaxNumber(phoneNo)) {
faxAddr.setAddrPhoneNo(phoneNo); // 하이픈이 제거된 유효한 번호 설정
trimFieldsBytes(faxAddr); // 다른 필드들에 대한 20바이트 체크 자르기
return false; // 유효한 번호는 제거하지 않음
} else{
System.out.println(" + else phoneNo : "+ phoneNo);
invalid.getAndIncrement(); // 유효하지 않은 번호 개수 증가
return true; // 유효하지 않은 번호는 제거
}
});*/
// log.info(" ++ after faxAddrListVO.size() :: [{}]", faxAddrListVO.size());
long endTime = System.currentTimeMillis();
double executionTime = (endTime - startTime) / 1000.0;
System.out.println(" number chk Execution time: " + executionTime + " seconds");
startTime = System.currentTimeMillis();
System.out.println("addrListVO.size() : "+ faxAddrListVO.size());
try {
if(faxAddrListVO.size() > 0) {
// step2 신규 주소록 생성 북마크 체크
if ("NEW".equals(faxAddrListVO.get(0).getAddrGrpId())) {
FaxAddrGroupVO faxAddrGroupVO = new FaxAddrGroupVO();
faxAddrGroupVO.setMberId(userId);
faxAddrGroupVO.setAddrGrpNm(faxAddrListVO.get(0).getAddrGrpNm());
// 정렬순서
int nextOrderNumber = faxAddrGroupDAO.selectMaxOrderFaxNumber(faxAddrGroupVO);
faxAddrGroupVO.setGrpOrder(nextOrderNumber);
faxAddrGroupDAO.insertFaxAddrGroup(faxAddrGroupVO);
// 신규 추가한 그룹아이디
for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setAddrGrpId(faxAddrGroupVO.getAddrGrpId()); }
}else if ("bookmark".equals(faxAddrListVO.get(0).getAddrGrpId())) {
for (FaxAddrVO faxAddr : faxAddrListVO) {
faxAddr.setBookmark("Y");
faxAddr.setAddrGrpId("0");
}
}else {
for (FaxAddrVO faxAddr : faxAddrListVO) { faxAddr.setBookmark("N"); }
}
// 등록
faxAddrDAO.insertFaxAddrList(faxAddrListVO);
}else {
return new StatusResponse(
HttpStatus.BAD_REQUEST
, "오류가 발생하였습니다."
, ""
);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return new StatusResponse(
HttpStatus.BAD_REQUEST
, "배치오류"
, LocalDateTime.now()
);
}
endTime = System.currentTimeMillis();
executionTime = (endTime - startTime) / 1000.0;
System.out.println("INSERT Execution time: " + executionTime + " seconds");
// 현재 시간 가져오기
LocalDateTime now = LocalDateTime.now();
// 원하는 포맷 설정
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 포맷된 시간 문자열로 변환
String formattedDateTime = now.format(formatter);
// 출력
System.out.println(formattedDateTime);
System.out.println("faxAddrListVO.size() : "+ faxAddrListVO.size());
String message = "저장에 성공했습니다.\n저장 : " + faxAddrListVO.size() + ""
+", INERT 총 시간 : " + executionTime+ ""
+", 현재시간 : " + formattedDateTime;
System.out.println("++ message : "+ message);
return new StatusResponse(
HttpStatus.OK
, message
, faxAddrListVO.get(0).getAddrGrpId()
);
}
@Override
public void deleteFaxAddr_advc(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
faxAddrGroupDAO.deleteFaxAddrGroup_advc(faxAddrGroupVO);
}
@Override
public int getFaxAddrCount(FaxAddrGroupVO faxAddrGroupVO) throws Exception {
// TODO Auto-generated method stub
return 0;
}
public static boolean isValidFaxNumber(String faxNo) {
if (faxNo == null || faxNo.isEmpty()) {
return false;
}
// 3자리 추출
String subNumber = faxNo.substring(0, 3);
Matcher matcher = FAX_PATTERN.matcher(subNumber);
return matcher.matches();
}
public static void trimFieldsBytes(FaxAddrVO faxAddr) {
faxAddr.setAddrNm(trimToBytes(faxAddr.getAddrNm(), 20));
faxAddr.setAddrComment(trimToBytes(faxAddr.getAddrComment(), 250));
}
// maxBytes만큼 글자수 처리해서 리턴
public static String trimToBytes(String str, int maxBytes) {
if (str == null) {
return null;
}
byte[] bytes = str.getBytes(EUC_KR);
if (bytes.length <= maxBytes) {
return str;
}
int len = maxBytes;
while (len > 0 && bytes[len - 1] < 0) {
len--; // 바이트 배열을 maxBytes로 자를 , 잘못된 분할을 피하기 위해 문자 경계 확인
}
return new String(bytes, 0, len, EUC_KR);
}
}

View File

@ -14,6 +14,7 @@ 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;
@ -157,6 +158,7 @@ public class FaxAddrController {
try {
List<FaxAddrVO> resultAddrList = faxAddrService.selectFaxAddrListAjax(faxAddrVO);
System.out.println("resultAddrList.size() :: "+ resultAddrList.size());
modelAndView.addObject("resultAddrList", resultAddrList);
modelAndView.addObject("result", "success");
@ -206,10 +208,13 @@ public class FaxAddrController {
if("".equals(addrVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
addrVO.setSearchSortCnd("addrId");
addrVO.setSearchSortOrd("desc");
addrVO.setSearchSortOrd("asc");
}
List<FaxAddrVO> addrList = new ArrayList();
if(StringUtils.isNotEmpty(addrVO.getSearchAddrGrpId())) {
addrList = faxAddrService.selectFaxAddrList(addrVO);
List<FaxAddrVO> addrList = faxAddrService.selectFaxAddrList(addrVO);
}
int totCnt = 0;
if(addrList.size() > 0) {
@ -263,7 +268,7 @@ public class FaxAddrController {
if("".equals(addrVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
addrVO.setSearchSortCnd("addrId");
addrVO.setSearchSortOrd("desc");
addrVO.setSearchSortOrd("asc");
}
List<FaxAddrVO> addrDupliList = faxAddrService.selectFaxAddrDupliListByAll(addrVO);
@ -856,7 +861,7 @@ public class FaxAddrController {
if("".equals(addrVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
addrVO.setSearchSortCnd("addrId");
addrVO.setSearchSortOrd("desc");
addrVO.setSearchSortOrd("asc");
}
LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
@ -1661,7 +1666,7 @@ public class FaxAddrController {
List<FaxAddrGroupVO> addrGroupList = faxAddrGroupService.selectFaxAddrGroupList(faxaddrGroupVO);
//회원별 주소록 전체 갯수 조회
int addrTotalCount = faxAddrService.selectFaxAddrTotalCount(faxaddrVO);
// int addrTotalCount = faxAddrService.selectFaxAddrTotalCount(faxaddrVO);
faxaddrVO.setType("bookmark");
List<FaxAddrVO> addrBookmarkList = faxAddrService.selectFaxAddrBasicGrpList(faxaddrVO);
@ -1669,6 +1674,30 @@ public class FaxAddrController {
faxaddrVO.setType("noGrp");
List<FaxAddrVO> addrNoGrpList = faxAddrService.selectFaxAddrBasicGrpList(faxaddrVO);
int totalGrpCount = addrGroupList.stream()
.mapToInt(group -> {
String grpCountStr = group.getGrpCount();
if (grpCountStr != null && !grpCountStr.isEmpty()) {
try {
return Integer.parseInt(grpCountStr);
} catch (NumberFormatException e) {
// 파싱에 실패한 경우 0을 반환하거나 예외 처리를 합니다.
return 0;
}
} else {
return 0;
}
})
.sum();
int addrTotalCount = (addrNoGrpList.size() >0 ? addrNoGrpList.get(0).getTotcnt() : 0)
+ (addrBookmarkList.size() >0 ? addrBookmarkList.get(0).getTotcnt() : 0)
+ totalGrpCount
;
model.addAttribute("addrTotalCount", addrTotalCount);
model.addAttribute("addrGroupList", addrGroupList);
model.addAttribute("addrBookmarkList", addrBookmarkList);

View File

@ -21,6 +21,7 @@ import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.cert.phone.service.MberCertPhoneVO;
import itn.let.fax.addr.service.FaxAddrGroupService;
import itn.let.fax.addr.service.FaxAddrGroupVO;
import itn.let.fax.addr.service.FaxAddrService;
@ -52,6 +53,9 @@ public class FaxAddrGroupController {
@Resource(name = "mberManageService")
private EgovMberManageService mberManageService;
@Resource(name = "KmcCertChecker")
private KmcCertChecker kmcCertCheck;
/**
* 팩스 주소록 그룹 리스트
@ -89,8 +93,8 @@ public class FaxAddrGroupController {
addrGroupVO.setSiteId("web");
List<FaxAddrGroupVO> addrGroupList = faxAddrGroupService.selectFaxAddrGroupList(addrGroupVO);
//회원별 주소록 전체 갯수 조회
int addrTotalCount = faxAddrService.selectFaxAddrTotalCount(addrVO);
// //회원별 주소록 전체 갯수 조회
// int addrTotalCount = faxAddrService.selectFaxAddrTotalCount(addrVO);
addrVO.setType("bookmark");
List<FaxAddrVO> addrBookmarkList = faxAddrService.selectFaxAddrBasicGrpList(addrVO);
@ -99,6 +103,27 @@ public class FaxAddrGroupController {
List<FaxAddrVO> addrNoGrpList = faxAddrService.selectFaxAddrBasicGrpList(addrVO);
int totalGrpCount = addrGroupList.stream()
.mapToInt(group -> {
String grpCountStr = group.getGrpCount();
if (grpCountStr != null && !grpCountStr.isEmpty()) {
try {
return Integer.parseInt(grpCountStr);
} catch (NumberFormatException e) {
// 파싱에 실패한 경우 0을 반환하거나 예외 처리를 합니다.
return 0;
}
} else {
return 0;
}
})
.sum();
int addrTotalCount = (addrNoGrpList.size() >0 ? addrNoGrpList.get(0).getTotcnt() : 0)
+ (addrBookmarkList.size() >0 ? addrBookmarkList.get(0).getTotcnt() : 0)
+ totalGrpCount
;
model.addAttribute("addrTotalCount", addrTotalCount);
model.addAttribute("addrGroupList", addrGroupList);
@ -353,18 +378,15 @@ public class FaxAddrGroupController {
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
addrGroupVO.setLastUpdusrId(user.getId());
addrGroupVO.setMberId(user.getId());
FaxAddrVO addrVO = new FaxAddrVO();
for(String id:grpCheck) {
try {
addrGroupVO.setAddrGrpId(id);
faxAddrGroupService.deleteFaxAddrGroup(addrGroupVO);
addrVO.setAddrGrpId(id);
addrVO.setGrpDelete("Y");
addrVO.setMberId(user.getId());
addrVO.setLastUpdusrId(user.getId());
faxAddrService.deleteFaxAddr(addrVO);
addrGroupVO.setAddrGrpId(id);
addrGroupVO.setMberId(user.getId());
addrGroupVO.setLastUpdusrId(user.getId());
faxAddrService.deleteFaxAddr_advc(addrGroupVO);
modelAndView.addObject("result", "success");
} catch (Exception e) {
@ -373,9 +395,7 @@ public class FaxAddrGroupController {
return modelAndView;
}
}
return modelAndView;
}
/**
@ -528,21 +548,25 @@ public class FaxAddrGroupController {
modelAndView.setViewName("jsonView");
try {
KmcCertChecker kmcCertCheck = new KmcCertChecker();
// KmcCertChecker kmcCertCheck = new KmcCertChecker();
//
// // mberId null일경우 ""
// mberManageVO.setMberId(EgovStringUtil.isNullToString(mberManageVO.getMberId()));
//
// // kmc 본인인증 /개발 서버 구분
// String serverNm = "";
// if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
// serverNm = request.getScheme() + "://219.240.88.15:8095";
// } else {
// serverNm = request.getScheme() + "://www.munjaon.co.kr";
// }
// mberId null일경우 ""
mberManageVO.setMberId(EgovStringUtil.isNullToString(mberManageVO.getMberId()));
// kmc 본인인증 /개발 서버 구분
String serverNm = "";
if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
serverNm = request.getScheme() + "://219.240.88.15:8095";
} else {
serverNm = request.getScheme() + "://www.munjaon.co.kr";
}
MberCertPhoneVO mberCertPhoneVO = new MberCertPhoneVO();
mberCertPhoneVO.setTrUrl("/web/cop/kmc/authRequestAddrSubmitAjax.do");
mberCertPhoneVO.setPlusInfo(mberManageVO.getMberId());
AuthCertVO certVO = kmcCertCheck.authCertCheckEight(serverNm + "/web/cop/kmc/authRequestAddrSubmitAjax.do",
mberManageVO.getMberId());
AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request);
modelAndView.addObject("tr_cert", certVO.getTr_cert());
modelAndView.addObject("tr_url", certVO.getTr_url());

View File

@ -0,0 +1,81 @@
package itn.let.fax.addr.web;
import java.time.LocalDateTime;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.vfs2.util.DelegatingFileSystemOptionsBuilder;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.fax.addr.service.FaxAddrGroupService;
import itn.let.fax.addr.service.FaxAddrService;
import itn.let.fax.addr.service.FaxAddrVO;
import itn.let.mail.service.StatusResponse;
/**
* 팩스 주소록 관한 controller 클래스를 정의한다.
* @author ITN
* @since 2024.11.08
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2021.04.08 ITN 최초 생성
*
* </pre>
*/
@RestController
public class FaxAddrRestController {
@Resource (name = "FaxAddrService")
private FaxAddrService faxAddrService;
@Resource (name = "FaxAddrGroupService")
private FaxAddrGroupService faxAddrGroupService;
/** EgovMessageSource */
@Resource(name="egovMessageSource")
EgovMessageSource egovMessageSource;
/**
* 팩스 주소록 대량등록 저장
* @param searchVO
* @param model
* @return "/web/mjon/addr/addrMassInsertByTempAjax_advc.do"
* @throws Exception
*/
@RequestMapping(value= {"/web/mjon/fax/addr/faxAddrMassInsertByTempAjax_advc.do"})
public ResponseEntity<StatusResponse> faxAddrMassInsertByTempAjax_advc(
@RequestBody List<FaxAddrVO> faxAddrListVO
,ModelMap model) throws Exception{
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId.equals("")) {
return ResponseEntity.ok(
new StatusResponse(HttpStatus.UNAUTHORIZED
, "로그인을 하셔야 이용 가능합니다."
, LocalDateTime.now()
)
);
}
return ResponseEntity.ok().body(faxAddrService.faxAddrMassInsertByTempAjax_advc(faxAddrListVO, userId));
}
}

View File

@ -20,7 +20,7 @@ import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.util.DateUtil;
import itn.com.cmm.util.DateUtils;
import itn.com.utl.fcc.service.EgovDateUtil;
import itn.let.fax.admin.service.FaxAdmService;
import itn.let.fax.admin.service.FaxStatVO;
@ -195,8 +195,8 @@ public class FaxAdmServiceImpl extends EgovAbstractServiceImpl implements FaxAdm
String date = simpleDateFormat.format(new Date());
if("".equals(faxGroupDataVO.getSearchDateType()) || faxGroupDataVO.getSearchDateType() == null) {
faxGroupDataVO.setSearchDateType("month");
faxGroupDataVO.setSearchYear(DateUtil.getNowYearToString());
faxGroupDataVO.setSearchMonth(DateUtil.getNowMonthToString());
faxGroupDataVO.setSearchYear(DateUtils.getNowYearToString());
faxGroupDataVO.setSearchMonth(DateUtils.getNowMonthToString());
}
List<FaxGroupDataVO> faxGroupListVO = faxDao.selectFaxStatList(faxGroupDataVO);

View File

@ -394,7 +394,7 @@ public class FaxAdmController {
if("".equals(addrVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
addrVO.setSearchSortCnd("addrId");
addrVO.setSearchSortOrd("desc");
addrVO.setSearchSortOrd("asc");
}

View File

@ -211,6 +211,14 @@ public class FaxGroupDataVO extends FaxTranVO implements Serializable {
private String successCntMonth;
private String successCntYear;
private String totalEaSum;
private String holdEaSum;
private String sentEaSum;
private String unSendEaSum;
private String errorEaSum;
public String getSuccessDay() {
return successDay;
}
@ -689,4 +697,62 @@ public class FaxGroupDataVO extends FaxTranVO implements Serializable {
}
}
public String getSearchQuarter() {
return searchQuarter;
}
public void setSearchQuarter(String searchQuarter) {
this.searchQuarter = searchQuarter;
}
public String getTotalEaSum() {
return totalEaSum;
}
public void setTotalEaSum(String totalEaSum) {
this.totalEaSum = totalEaSum;
}
public String getHoldEaSum() {
return holdEaSum;
}
public void setHoldEaSum(String holdEaSum) {
this.holdEaSum = holdEaSum;
}
public String getSentEaSum() {
return sentEaSum;
}
public void setSentEaSum(String sentEaSum) {
this.sentEaSum = sentEaSum;
}
public String getUnSendEaSum() {
return unSendEaSum;
}
public void setUnSendEaSum(String unSendEaSum) {
this.unSendEaSum = unSendEaSum;
}
public String getErrorEaSum() {
return errorEaSum;
}
public void setErrorEaSum(String errorEaSum) {
this.errorEaSum = errorEaSum;
}
}

View File

@ -90,6 +90,9 @@ public class FaxDAO extends EgovComAbstractDAO{
public List<FaxGroupDataVO> selectFaxSendList(FaxGroupDataVO faxGroupDataVO) {
return (List<FaxGroupDataVO>) list("faxDAO.selectFaxSendList", faxGroupDataVO);
}
public List<FaxGroupDataVO> selectFaxSendList_advc(FaxGroupDataVO faxGroupDataVO) {
return (List<FaxGroupDataVO>) list("faxDAO.selectFaxSendList_advc", faxGroupDataVO);
}
public List<FaxGroupDataVO> selectFaxSendDetailList(FaxGroupDataVO faxGroupDataVO) {
return (List<FaxGroupDataVO>) list("faxDAO.selectFaxSendDetailList", faxGroupDataVO);
@ -149,4 +152,5 @@ public class FaxDAO extends EgovComAbstractDAO{
public List<FaxGroupDataVO> selectMyFaxSendList(FaxGroupDataVO faxGroupDataVO) {
return (List<FaxGroupDataVO>) list("faxDAO.selectMyFaxSendList", faxGroupDataVO);
}
}

View File

@ -30,7 +30,7 @@ import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.cmmn.exception.FdlException;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.util.DateUtil;
import itn.com.cmm.util.DateUtils;
import itn.com.cmm.util.FaxUtil;
import itn.let.fax.user.service.FaxConvertMngVO;
import itn.let.fax.user.service.FaxConvertVO;
@ -240,8 +240,8 @@ public class FaxServiceImpl extends EgovAbstractServiceImpl implements FaxServic
if(StringUtils.isEmpty(faxGroupDataVO.getSearchStartDate())
&& StringUtils.isEmpty(faxGroupDataVO.getSearchEndDate())
) {
faxGroupDataVO.setSearchStartDate(DateUtil.getTodayYearAndMonthAndFirstDay());
faxGroupDataVO.setSearchEndDate(DateUtil.getTodayYearAndMonthAndLastDay());
faxGroupDataVO.setSearchStartDate(DateUtils.getTodayYearAndMonthAndFirstDay());
faxGroupDataVO.setSearchEndDate(DateUtils.getTodayYearAndMonthAndLastDay());
}
/** pageing */
@ -254,7 +254,26 @@ public class FaxServiceImpl extends EgovAbstractServiceImpl implements FaxServic
faxGroupDataVO.setLastIndex(paginationInfo.getLastRecordIndex());
faxGroupDataVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
List<FaxGroupDataVO> faxGroupListVO = faxDao.selectFaxSendList(faxGroupDataVO);
List<FaxGroupDataVO> faxGroupListVO = faxDao.selectFaxSendList_advc(faxGroupDataVO);
if(faxGroupListVO.size() >0) {
// 건수
resultMap.put("totalEaSum" ,faxGroupListVO.get(0).getTotalEaSum());
System.out.println("faxGroupListVO.get(0).getTotalEaSum() : "+ faxGroupListVO.get(0).getTotalEaSum());
// 대기 건수
resultMap.put("holdEaSum" ,faxGroupListVO.get(0).getHoldEaSum());
// 성공 건수
resultMap.put("sentEaSum" ,faxGroupListVO.get(0).getSentEaSum());
// 실패 건수
resultMap.put("errorEaSum" ,faxGroupListVO.get(0).getErrorEaSum());
// 기타 건수
resultMap.put("unSendEaSum" ,faxGroupListVO.get(0).getUnSendEaSum());
}
paginationInfo.setTotalRecordCount(faxGroupListVO.size() > 0 ? faxGroupListVO.get(0).getTotCnt() : 0);
resultMap.put("faxGroupListVO", faxGroupListVO);
@ -287,9 +306,9 @@ public class FaxServiceImpl extends EgovAbstractServiceImpl implements FaxServic
Map<String, Object> dateMap = new HashMap<String, Object>();
dateMap.put("year", DateUtil.getNowYearToString());
dateMap.put("month", DateUtil.getNowMonthToString());
dateMap.put("day", DateUtil.getNowDayToString());
dateMap.put("year", DateUtils.getNowYearToString());
dateMap.put("month", DateUtils.getNowMonthToString());
dateMap.put("day", DateUtils.getNowDayToString());
resultMap.put("dateMap", dateMap);
return resultMap;
@ -606,7 +625,7 @@ public class FaxServiceImpl extends EgovAbstractServiceImpl implements FaxServic
&& StringUtils.isEmpty(faxGroupDataVO.getSearchEndDate())
) {
// faxGroupDataVO.setSearchStartDate(DateUtil.getTodayYearAndMonthAndFirstDay());
faxGroupDataVO.setSearchEndDate(DateUtil.getTodayYearAndMonthAndLastDay());
faxGroupDataVO.setSearchEndDate(DateUtils.getTodayYearAndMonthAndLastDay());
}
/** pageing */

View File

@ -191,6 +191,22 @@ public class FaxController {
model.addAttribute("faxGroupListVO", faxSendListMap.get("faxGroupListVO"));
model.addAttribute("searchKeyword", faxSendListMap.get("searchKeyword"));
model.addAttribute("paginationInfo", faxSendListMap.get("paginationInfo"));
// 건수
model.addAttribute("totalEaSum" ,faxSendListMap.get("totalEaSum"));
// 대기 건수
model.addAttribute("holdEaSum" ,faxSendListMap.get("holdEaSum"));
// 성공 건수
model.addAttribute("sentEaSum" ,faxSendListMap.get("sentEaSum"));
// 실패 건수
model.addAttribute("errorEaSum" ,faxSendListMap.get("errorEaSum"));
// 기타 건수
model.addAttribute("unSendEaSum" ,faxSendListMap.get("unSendEaSum"));
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception

View File

@ -45,5 +45,14 @@ public interface MjonKakaoATService {
//알림톡 지연문자 리스트 조회
List<KakaoVO> selectKakaoATDelaySentList(String userId) throws Exception;
//알림톡 전체 발송 리스트(대시보드용)
List<KakaoVO> selectMjonKakaoATGroupCompleteByUserList_advc(KakaoVO searchVO) throws Exception;
//알림톡 발송 상세 리스트
List<KakaoVO> selectMjonKakaoATGroupDtList_advc(KakaoVO searchVO) throws Exception;
//알림톡 전송내역 상세
KakaoVO selectMjonKakaoATVO_advc(KakaoVO mjonKakaoATVO) throws Exception;
}

View File

@ -97,4 +97,18 @@ public class MjonKakaoATDAO extends EgovAbstractDAO {
public List<KakaoVO> selectKakaoATDelaySentList(String userId) throws Exception{
return (List<KakaoVO>)list("mjonKakaoATDAO.selectKakaoATDelaySentList", userId);
}
@SuppressWarnings("unchecked")
public List<KakaoVO> selectMjonKakaoATGroupCompleteByUserList_advc(KakaoVO p_mjonKakaoATVO) throws Exception{
return (List<KakaoVO>)list("mjonKakaoATDAO.selectMjonKakaoATGroupCompleteByUserList_advc", p_mjonKakaoATVO);
}
@SuppressWarnings("unchecked")
public List<KakaoVO> selectMjonKakaoATGroupDtList_advc(KakaoVO p_mjonKakaoATVO) throws Exception{
return (List<KakaoVO>)list("mjonKakaoATDAO.selectMjonKakaoATGroupDtList_advc", p_mjonKakaoATVO);
}
public KakaoVO selectMjonKakaoATVO_advc(KakaoVO p_mjonKakaoATVO) throws Exception{
return (KakaoVO) select("mjonKakaoATDAO.selectMjonKakaoATVO_advc", p_mjonKakaoATVO);
}
}

View File

@ -199,4 +199,55 @@ public class MjonKakaoATServiceImpl extends EgovAbstractServiceImpl implements M
public List<KakaoVO> selectKakaoATDelaySentList(String userId) throws Exception {
return mjonKakaoATDAO.selectKakaoATDelaySentList(userId);
}
@Override
public List<KakaoVO> selectMjonKakaoATGroupCompleteByUserList_advc(KakaoVO p_mjonKakaoATVO) throws Exception {
List<KakaoVO> result = new ArrayList<KakaoVO>();
try {
result = mjonKakaoATDAO.selectMjonKakaoATGroupCompleteByUserList_advc(p_mjonKakaoATVO);
} catch (Exception e) {
System.out.println("selectMjonKakaoATGroupCompleteByUserList ServiceImpl Error ::: " + e);
}
return result;
}
@Override
public List<KakaoVO> selectMjonKakaoATGroupDtList_advc(KakaoVO p_mjonKakaoATVO) throws Exception {
List<KakaoVO> resultList = new ArrayList<KakaoVO>();
try {
resultList = mjonKakaoATDAO.selectMjonKakaoATGroupDtList_advc(p_mjonKakaoATVO);
} catch (Exception e) {
System.out.println("selectMjonKakaoATGroupDtList ServiceImpl Error ::: " + e);
}
return resultList;
}
@Override
public KakaoVO selectMjonKakaoATVO_advc(KakaoVO p_mjonKakaoATVO) throws Exception {
KakaoVO result = new KakaoVO();
try {
result = mjonKakaoATDAO.selectMjonKakaoATVO_advc(p_mjonKakaoATVO);
} catch (Exception e) {
System.out.println("selectMjonKakaoATVO Service Impl Error !!! " + e);
}
return result;
}
}

View File

@ -241,7 +241,8 @@ public class MjonKakaoATController {
kakaoVO.setNtceBgnde(beforeMonthDay);
}
resultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList(kakaoVO);
// resultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList(kakaoVO);
resultList = mjonKakaoATService.selectMjonKakaoATGroupCompleteByUserList_advc(kakaoVO);
model.addAttribute("resultList", resultList);
@ -331,7 +332,8 @@ public class MjonKakaoATController {
}
List<KakaoVO> resultList = new ArrayList<KakaoVO>();
resultList = mjonKakaoATService.selectMjonKakaoATGroupDtList(searchVO);
// resultList = mjonKakaoATService.selectMjonKakaoATGroupDtList(searchVO);
resultList = mjonKakaoATService.selectMjonKakaoATGroupDtList_advc(searchVO);
model.addAttribute("resultList", resultList);
model.addAttribute("searchVO", searchVO);
@ -377,7 +379,8 @@ public class MjonKakaoATController {
KakaoVO mjonKakaoATDetailVO = new KakaoVO();
if(null != searchVO.getUserData() && !"".equals(searchVO.getUserData())) { //수정
mjonKakaoATDetailVO = mjonKakaoATService.selectMjonKakaoATVO(searchVO);
// mjonKakaoATDetailVO = mjonKakaoATService.selectMjonKakaoATVO(searchVO);
mjonKakaoATDetailVO = mjonKakaoATService.selectMjonKakaoATVO_advc(searchVO);
}
@ -793,9 +796,16 @@ public class MjonKakaoATController {
String lastUpdtPnttm = resultChannelList.get(i).getLastUpdtPnttm();
kakaoProfileVO.setSenderKey(senderKey);
kakaoProfileVO.setProfileId(profileId);
KakaoReturnVO tmpProfileVO = null;
// try {
//
// tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
// } catch (Exception e) {
// e.printStackTrace();
// // TODO: handle exception
// }
KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
ChannelIDVO returnChannelVO = new ChannelIDVO();
returnChannelVO.setSenderKey(tmpProfileVO.getSenderKey());

View File

@ -0,0 +1,34 @@
package itn.let.kakao.kakaoComm;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @ BIZ_KAKAO_PRICE 테이블 관련
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BizKakaoPriceVO {
private Long bizKakaoPriceId;
private String bizKakaoAtPrice; // 알림톡 단가
private String bizKakaoFtPrice; // 친구톡 단가
private String bizKakaoFtImgPrice; // 친구톡 이미지 단가
private String bizKakaoFtWideImgPrice; // 친구톡 와이드 이미지 단가
private String bizSmsPrice; // SMS 단가
private String bizMmsPrice; // MMS 단가
private String msgGroupId; // 메시지 그룹 ID
// getters and setters 생략
}

View File

@ -1,5 +1,9 @@
package itn.let.kakao.kakaoComm;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @FileName : KakaoButtonVO.java
* @Project : mjon
@ -8,6 +12,9 @@ package itn.let.kakao.kakaoComm;
* @프로그램 설명 : button, quickReplies 변수
*/
@ToString
@Getter
@Setter
public class KakaoButtonVO {
private String name = ""; // 버튼명 - linkType AC 선택 버튼명은 채널추가 고정
@ -18,48 +25,4 @@ public class KakaoButtonVO {
private String linkPc = ""; // PC 링크 주소 (WL 사용시 선택)
private String pluginId = ""; // 플러그인 ID (P1, P2, P3 사용시 필수)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLinkType() {
return linkType;
}
public void setLinkType(String linkType) {
this.linkType = linkType;
}
public String getLinkAnd() {
return linkAnd;
}
public void setLinkAnd(String linkAnd) {
this.linkAnd = linkAnd;
}
public String getLinkIos() {
return linkIos;
}
public void setLinkIos(String linkIos) {
this.linkIos = linkIos;
}
public String getLinkMo() {
return linkMo;
}
public void setLinkMo(String linkMo) {
this.linkMo = linkMo;
}
public String getLinkPc() {
return linkPc;
}
public void setLinkPc(String linkPc) {
this.linkPc = linkPc;
}
public String getPluginId() {
return pluginId;
}
public void setPluginId(String pluginId) {
this.pluginId = pluginId;
}
}

View File

@ -3,6 +3,10 @@ package itn.let.kakao.kakaoComm;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @FileName : KakaoCommentVO.java
* @Project : mjon
@ -11,6 +15,9 @@ import java.util.List;
* @프로그램 설명 : comment 변수
*/
@ToString
@Getter
@Setter
public class KakaoCommentVO {
private String content = ""; // 댓글 본분
@ -26,60 +33,4 @@ public class KakaoCommentVO {
private String originalFileName = "";
private String filePath = "";
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getOriginalFileName() {
return originalFileName;
}
public void setOriginalFileName(String originalFileName) {
this.originalFileName = originalFileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public List<KakaoCommentVO> getAttachFileList() {
return attachFileList;
}
public void setAttachFileList(List<KakaoCommentVO> attachFileList) {
this.attachFileList = attachFileList;
}
}

View File

@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.List;
import itn.com.cmm.ComDefaultVO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @FileName : KakaoReturnVO.java
@ -13,6 +16,9 @@ import itn.com.cmm.ComDefaultVO;
* @프로그램 설명 : 카카오톡 리턴 변수 목록
*/
@Getter
@Setter
@ToString
public class KakaoReturnVO extends ComDefaultVO{
private static final long serialVersionUID = 1L;
@ -130,415 +136,4 @@ public class KakaoReturnVO extends ComDefaultVO{
private String businessType = ""; //카카오톡 채널 비즈니스 인증 타입
public static long getSerialversionuid() {
return serialVersionUID;
}
public String getBizReturnMsg() {
return bizReturnMsg;
}
public void setBizReturnMsg(String bizReturnMsg) {
this.bizReturnMsg = bizReturnMsg;
}
public String getBizReturnCode() {
return bizReturnCode;
}
public void setBizReturnCode(String bizReturnCode) {
this.bizReturnCode = bizReturnCode;
}
public String getProfileId() {
return profileId;
}
public void setProfileId(String profileId) {
this.profileId = profileId;
}
public String getTotalCount() {
return totalCount;
}
public void setTotalCount(String totalCount) {
this.totalCount = totalCount;
}
public String getTotalPage() {
return totalPage;
}
public void setTotalPage(String totalPage) {
this.totalPage = totalPage;
}
public String getCurrentPage() {
return currentPage;
}
public void setCurrentPage(String currentPage) {
this.currentPage = currentPage;
}
public String getSenderKey() {
return senderKey;
}
public void setSenderKey(String senderKey) {
this.senderKey = senderKey;
}
public String getSenderKeyType() {
return senderKeyType;
}
public void setSenderKeyType(String senderKeyType) {
this.senderKeyType = senderKeyType;
}
public String getTemplateCode() {
return templateCode;
}
public void setTemplateCode(String templateCode) {
this.templateCode = templateCode;
}
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
public String getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(String categoryCode) {
this.categoryCode = categoryCode;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getModifiedAt() {
return modifiedAt;
}
public void setModifiedAt(String modifiedAt) {
this.modifiedAt = modifiedAt;
}
public String getServiceStatus() {
return serviceStatus;
}
public void setServiceStatus(String serviceStatus) {
this.serviceStatus = serviceStatus;
}
public List<KakaoReturnVO> getTemplatList() {
return templatList;
}
public void setTemplatList(List<KakaoReturnVO> templatList) {
this.templatList = templatList;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public boolean isBlock() {
return block;
}
public void setBlock(boolean block) {
this.block = block;
}
public boolean isDormant() {
return dormant;
}
public void setDormant(boolean dormant) {
this.dormant = dormant;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getListTitle() {
return listTitle;
}
public void setListTitle(String listTitle) {
this.listTitle = listTitle;
}
public String getListDescription() {
return listDescription;
}
public void setListDescription(String listDescription) {
this.listDescription = listDescription;
}
public String getSumTitle() {
return sumTitle;
}
public void setSumTitle(String sumTitle) {
this.sumTitle = sumTitle;
}
public String getSumDescription() {
return sumDescription;
}
public void setSumDescription(String sumDescription) {
this.sumDescription = sumDescription;
}
public String getProfileStatus() {
return profileStatus;
}
public void setProfileStatus(String profileStatus) {
this.profileStatus = profileStatus;
}
public boolean isAlimtalk() {
return alimtalk;
}
public void setAlimtalk(boolean alimtalk) {
this.alimtalk = alimtalk;
}
public boolean isBizchat() {
return bizchat;
}
public void setBizchat(boolean bizchat) {
this.bizchat = bizchat;
}
public boolean isBrandtalk() {
return brandtalk;
}
public void setBrandtalk(boolean brandtalk) {
this.brandtalk = brandtalk;
}
public String getCommittalCompanyName() {
return committalCompanyName;
}
public void setCommittalCompanyName(String committalCompanyName) {
this.committalCompanyName = committalCompanyName;
}
public String getChannelKey() {
return channelKey;
}
public void setChannelKey(String channelKey) {
this.channelKey = channelKey;
}
public boolean isBusinessProfile() {
return businessProfile;
}
public void setBusinessProfile(boolean businessProfile) {
this.businessProfile = businessProfile;
}
public String getBusinessType() {
return businessType;
}
public void setBusinessType(String businessType) {
this.businessType = businessType;
}
public String getTemplateMessageType() {
return templateMessageType;
}
public void setTemplateMessageType(String templateMessageType) {
this.templateMessageType = templateMessageType;
}
public String getTemplateEmphasizeType() {
return templateEmphasizeType;
}
public void setTemplateEmphasizeType(String templateEmphasizeType) {
this.templateEmphasizeType = templateEmphasizeType;
}
public String getTemplateContent() {
return templateContent;
}
public void setTemplateContent(String templateContent) {
this.templateContent = templateContent;
}
public String getTemplateExtra() {
return templateExtra;
}
public void setTemplateExtra(String templateExtra) {
this.templateExtra = templateExtra;
}
public String getTemplateAd() {
return templateAd;
}
public void setTemplateAd(String templateAd) {
this.templateAd = templateAd;
}
public String getTemplateImageName() {
return templateImageName;
}
public void setTemplateImageName(String templateImageName) {
this.templateImageName = templateImageName;
}
public String getTemplateImageUrl() {
return templateImageUrl;
}
public void setTemplateImageUrl(String templateImageUrl) {
this.templateImageUrl = templateImageUrl;
}
public String getTemplateTitle() {
return templateTitle;
}
public void setTemplateTitle(String templateTitle) {
this.templateTitle = templateTitle;
}
public String getTemplateSubtitle() {
return templateSubtitle;
}
public void setTemplateSubtitle(String templateSubtitle) {
this.templateSubtitle = templateSubtitle;
}
public String getTemplateHeader() {
return templateHeader;
}
public void setTemplateHeader(String templateHeader) {
this.templateHeader = templateHeader;
}
public Boolean getSecurityFlag() {
return securityFlag;
}
public void setSecurityFlag(Boolean securityFlag) {
this.securityFlag = securityFlag;
}
public String getInspectionStatus() {
return inspectionStatus;
}
public void setInspectionStatus(String inspectionStatus) {
this.inspectionStatus = inspectionStatus;
}
public List<KakaoButtonVO> getButtonList() {
return buttonList;
}
public void setButtonList(List<KakaoButtonVO> buttonList) {
this.buttonList = buttonList;
}
public List<KakaoButtonVO> getQuickReplyList() {
return quickReplyList;
}
public void setQuickReplyList(List<KakaoButtonVO> quickReplyList) {
this.quickReplyList = quickReplyList;
}
public List<KakaoCommentVO> getCommentList() {
return commentList;
}
public void setCommentList(List<KakaoCommentVO> commentList) {
this.commentList = commentList;
}
public List<KakaoItemVO> getItemList() {
return itemList;
}
public void setItemList(List<KakaoItemVO> itemList) {
this.itemList = itemList;
}
}

View File

@ -0,0 +1,133 @@
package itn.let.kakao.kakaoComm;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
/**
* @FileName : KakaoSendVO.java
* @Project : mjon
* @Date : 2025. 3. 25.
* @작성자 : 이호영
* @프로그램 설명 : 문자온 발송부분만 ADVC
*/
@Getter
@Setter
public class KakaoSendAdvcVO implements Serializable {
/**
*
*/
private static final long serialVersionUID = 343099046833205405L;
// =====
// Insert 데이터
private String msgId; // 문자ID
private String msgGroupId; // 전송그룹ID
private String msgGroupCnt; // 전송그룹ID
private String userId; // 사용자ID
private String agentCode; // 전송사코드
private String senderKey; // 발신프로필
private String templateCode; // 템플릿 코드
private String callTo; // 수신번호
private String callFrom; // 발신번호
private String msgType; // 메시지 타입
private String templateContent; // 템플릿 내용
private String templateTitle; // 템플릿 제목
List<KakaoButtonVO> buttonList; // 템플릿 버튼 리스트
private String subMsgSendYn; // 대체문자 전송 여부
private String subMsgTxt; // 대체문자 내용
private String subMsgType; // 대체문자 타입
private String reqDate; // 예약일시
private String msgKind; // 예약일시
private String jsonStr; // jsonStr
private String adFlag; //친구톡 광고성 정보 사용 유무(Y:사용 , N:미사용)
private String sendKind; //문자전송 타입(H:홈페이지, A:API)
// =====
// =====
private String eachPrice; // sms 단가
private String smsPrice; // sms 단가
private String mmsPrice; // mms 단가
private String picturePrice; // mms 단가
private String totPrice; // mms 단가
private String befCash; // mms 단가
private String befPoint; // mms 단가
private String kakaoAtPrice; // 카카오 알림톡 단가
private String bizJsonName; // 카카오 알림톡 단가
private String reserveYn; // 카카오 알림톡 단가
private String atDelayYn; // 지연 문자 발송
private String bizKakaoResendOrgnlTxt; // 카카오 알림톡 단가
private String bizKakaoResendType; // 카카오 알림톡 단가
private String filePath1; // 대체문자 이미지
private String fileCnt; // 파일 카운트
private String bizKakaoImageType; // 파일 카운트
private String spamStatus;
@Override
public String toString() {
return "MsgSendVO[" +
"\n msgId=[" + msgId + "]" +
"\n , msgGroupId=[" + msgGroupId + "]" +
"\n , msgGroupCnt=[" + msgGroupCnt + "]" +
"\n , userId=[" + userId + "]" +
"\n , agentCode=[" + agentCode + "]" +
"\n , senderKey=[" + senderKey + "]" +
"\n , templateCode=[" + templateCode + "]" +
"\n , callTo=[" + callTo + "]" +
"\n , callFrom=[" + callFrom + "]" +
"\n , msgType=[" + msgType + "]" +
"\n , templateContent=[" + templateContent + "]" +
"\n , templateTitle=[" + templateTitle + "]" +
"\n , buttonList=[" + (buttonList != null ? buttonList.toString() : "") + "]" +
"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
"\n , subMsgTxt=[" + subMsgTxt + "]" +
"\n , subMsgType=[" + subMsgType + "]" +
"\n , reqDate=[" + reqDate + "]" +
"\n , jsonStr=[" + jsonStr + "]" +
"\n , sendKind=[" + sendKind + "]" +
"\n , ==== MJ_MSG_DATA INSERT DATA END =======" +
"\n " +
"\n , eachPrice=[" + eachPrice + "]" +
"\n , smsPrice=[" + smsPrice + "]" +
"\n , mmsPrice=[" + mmsPrice + "]" +
"\n , totPrice=[" + totPrice + "]" +
"\n , befCash=[" + befCash + "]" +
"\n , befPoint=[" + befPoint + "]" +
"\n , kakaoAtPrice=[" + kakaoAtPrice + "]" +
"\n , bizJsonName=[" + bizJsonName + "]" +
"\n , reserveYn=[" + reserveYn + "]" +
"\n , atDelayYn=[" + atDelayYn + "]" +
"\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" +
"\n , bizKakaoResendType=[" + bizKakaoResendType + "]" +
"\n , filePath1=[" + filePath1 + "]" +
"\n , bizKakaoImageType=[" + bizKakaoImageType + "]" +
"\n ]";
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,10 @@ import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
@ -15,6 +18,9 @@ import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
@ -30,16 +36,21 @@ import org.apache.http.util.EntityUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import egovframework.rte.fdl.property.EgovPropertyService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
import itn.let.utl.fcc.service.EgovStringUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component("kakaoApiImageUpload")
public class KakaoApiImageUpload {
@ -58,6 +69,16 @@ public class KakaoApiImageUpload {
@Resource(name = "propertiesService")
protected EgovPropertyService propertyService;
/** 첨부파일 저장경로 */
@Value("#{globalSettings['Globals.file.saveDir']}")
private String fileSaveDir;
@Resource(name="EgovFileMngUtil")
private EgovFileMngUtil fileUtil;
@Resource(name="EgovFileMngService")
private EgovFileMngService fileMngService;
/**
* @Method Name : kakaoApiImageUpload
@ -219,13 +240,13 @@ public class KakaoApiImageUpload {
.addTextBody("bizId", mjonBizId)
.addTextBody("apiKey", mjonBizKakaoApiKey)
.addTextBody("imageType", kakaoVO.getImageType())
.addTextBody("title", kakaoVO.getImgTitle())
.addTextBody("link", kakaoVO.getImgLink())
.addTextBody("title", "test")
.addTextBody("link", "https://maaa.com")
.addTextBody("senderKey", kakaoVO.getSenderKey())
.addBinaryBody("image", new File(filePath),ContentType.MULTIPART_FORM_DATA,fullFileName)
.build();
httpPost.setEntity(httpEntity);
httpPost.setEntity(httpEntity);
CloseableHttpResponse response = httpClient.execute(httpPost);
@ -245,6 +266,7 @@ public class KakaoApiImageUpload {
String msg = object.get("message").toString();
String imgUrl = "";
log.info(" : code :: [{}]", code);
if(code.equals("200")) {
imgUrl = object.get("image").toString();
}
@ -273,6 +295,176 @@ public class KakaoApiImageUpload {
}
/**
* @methodName : kakaoApiImageUpload_advc
* @author : 이호영
* @date : 2025. 6. 4.
* @description : kakaoApiImageUpload 수정
* @return : StatusResponse
* @param kakaoVO
* @param files
* @param i
* @return
* @throws Exception
*
*/
public StatusResponse kakaoApiImageUpload_advc(KakaoVO kakaoVO, Map<String, MultipartFile> files, int fileKeyParam) throws Exception {
// try {
String storePathString = propertyService.getString("Globals.fileStorePath");
File saveFolder = new File(storePathString);
if (!saveFolder.exists()) saveFolder.mkdirs();
// for (MultipartFile file : files.values()) {
MultipartFile file = files.values().stream().findFirst().orElse(null);
if (file == null || file.isEmpty()) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "유효한 이미지 파일이 없습니다.", LocalDateTime.now());
}
String originalName = file.getOriginalFilename();
if (originalName == null || originalName.isEmpty()) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "파일명이 비어 있습니다.", LocalDateTime.now());
}
String ext = FilenameUtils.getExtension(originalName).toLowerCase();
if (!ext.matches("jpg|jpeg|png")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "지원하지 않는 이미지 형식입니다.");
}
long size = file.getSize();
if (size > 5 * 1024 * 1024) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지 용량은 5MB 이내여야 합니다.");
}
BufferedImage image = ImageIO.read(file.getInputStream());
if (image == null) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "이미지를 읽을 수 없습니다.");
}
int width = image.getWidth();
int height = image.getHeight();
String type = kakaoVO.getImageType();
if ("W".equals(type)) {
if (width != 800 || height != 600) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "와이드 이미지는 800x600 사이즈만 허용됩니다.");
}
} else {
float ratio = width / (float) height;
// log.info("width : [{}], ",width);
// log.info("height : [{}], ",height);
// log.info("ratio : [{}], ",ratio);
if (width < 500 || ratio < 0.75 || ratio > 2.0) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "일반 이미지는 가로 500px 이상, 비율 2:1 이상 또는 3:4 이하만 허용됩니다.");
}
}
String atchFileId = this.saveImgFile(files);
String newName = EgovStringUtil.getTimeStamp() + fileKeyParam;
String filePath = storePathString + File.separator + newName + "." + ext;
file.transferTo(new File(filePath));
// 카카오 API 호출
CloseableHttpClient httpClient = HttpClients.createDefault();
String apiUrl = mjonBizUrl + "/v3/kakao/image/upload";
HttpPost httpPost = new HttpPost(apiUrl);
/*HttpEntity httpEntity = MultipartEntityBuilder.create()
.addTextBody("bizId", mjonBizId)
.addTextBody("apiKey", mjonBizKakaoApiKey)
.addTextBody("imageType", kakaoVO.getImageType())
.addTextBody("title", kakaoVO.getImgTitle())
.addTextBody("link", kakaoVO.getImgLink())
.addTextBody("senderKey", kakaoVO.getSenderKey())
.addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext)
.build();
*/
HttpEntity httpEntity = MultipartEntityBuilder.create()
.addTextBody("bizId", mjonBizId)
.addTextBody("apiKey", mjonBizKakaoApiKey)
.addTextBody("imageType", kakaoVO.getImageType())
.addTextBody("title", originalName)
.addTextBody("link", StringUtils.isEmpty(kakaoVO.getImgLink()) ? "https://" : kakaoVO.getImgLink())
.addTextBody("senderKey", kakaoVO.getSenderKey())
.addBinaryBody("image", new File(filePath), ContentType.MULTIPART_FORM_DATA, newName + "." + ext)
.build();
;
httpPost.setEntity(httpEntity);
CloseableHttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(result);
log.info("object + :: [{}]", object.toJSONString());
String code = object.get("code").toString();
if ("200".equals(code)) {
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("imgUrl", object.get("image").toString());
returnMap.put("fileName", originalName);
returnMap.put("atchFileId", atchFileId);
return new StatusResponse(HttpStatus.OK, "이미지 등록이 완료 되었습니다.", returnMap);
} else {
return new StatusResponse(HttpStatus.BAD_REQUEST, object.get("message").toString(), LocalDateTime.now());
}
} else {
return new StatusResponse(HttpStatus.BAD_REQUEST, "카카오 API 요청 실패", LocalDateTime.now());
}
// }
// } catch (Exception e) {
// log.error("kakaoApiImageUpload_advc API Error", e);
// return new StatusResponse(HttpStatus.BAD_REQUEST, "친구톡 이미지 등록에 실패했습니다.", LocalDateTime.now());
// }
}
private String saveImgFile(Map<String, MultipartFile> files) throws Exception {
String atchFileId = "";
String isThumbFile = "";
String imagePath = "";
String KeyStr = "CANVASIMG_";
Date now = new Date();
SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
String fdlDate = formatDate.format(now);
imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
if (!files.isEmpty()) {
List<FileVO> result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId, imagePath, isThumbFile);
atchFileId = fileMngService.insertFileInfs(result);
}
return atchFileId;
}
/**
* @Method Name : kakaoApiTemplateImageUpload
* @작성일 : 2023. 2. 16.
@ -488,6 +680,8 @@ public class KakaoApiImageUpload {
jsonObject.put("apiKey", mjonBizKakaoApiKey);
jsonObject.put("imageUrl", kakaoVO.getTemplateImageUrl());
log.info("kakaoVO.getTemplateImageUrl() :: [{}]", kakaoVO.getTemplateImageUrl());
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(sendUrl);
httpPost.setEntity(new StringEntity(jsonObject.toString(), "UTF-8"));
@ -499,6 +693,7 @@ public class KakaoApiImageUpload {
String result = "";
String statusCode = Integer.toString(response.getStatusLine().getStatusCode());
log.info(" + statusCode :: [{}]", statusCode);
if(statusCode.equals("200")) {
result = EntityUtils.toString(response.getEntity());
@ -529,4 +724,6 @@ public class KakaoApiImageUpload {
return kakaoReturnVO;
}
}

View File

@ -8,16 +8,24 @@ import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.KakaoButtonVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO;
@Component
@ -32,7 +40,57 @@ public class KakaoApiJsonSave {
static String json;
@SuppressWarnings("unchecked")
public String kakaoApiJsonSave_advc(KakaoSendAdvcVO sendVO, KakaoReturnVO templateDetail) {
// 버튼리스트 JSON 생성
JSONArray buttonList = new JSONArray();
for(KakaoButtonVO buttonInfoVO : sendVO.getButtonList()) {
JSONObject buttonInfo = new JSONObject();
buttonInfo.put("name", buttonInfoVO.getName());
buttonInfo.put("type", buttonInfoVO.getLinkType());
if(buttonInfoVO.getLinkType().equals("WL")) {
buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo());
buttonInfo.put("url_pc", buttonInfoVO.getLinkPc());
}else if(buttonInfoVO.getLinkType().equals("AL")) {
buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos());
buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd());
}else if(buttonInfoVO.getLinkType().equals("BC")) {
// 상담톡 진행시 등록해야함
}else if(buttonInfoVO.getLinkType().equals("BT")) {
// 전환 전달
}
buttonList.add(buttonInfo);
}
// 강조유형 JSON 생성
JSONObject templateDetailInfo = new JSONObject();
String emphasizeType = templateDetail.getTemplateEmphasizeType();
if(emphasizeType.equals("TEXT")) {
templateDetailInfo.put("title", sendVO.getTemplateTitle());
}else if(emphasizeType.equals("IMAGE")) {
templateDetailInfo.put("msg_type", "ai");
}
JSONObject jo = new JSONObject();
if(buttonList.size() != 0) {
jo.put("button", buttonList);
}
if(templateDetailInfo.size() != 0) {
jo.put("extra", templateDetailInfo);
}
// 입력 json 데이터를 파일로 변경
String jsonStr = jo.toString();
return jsonStr;
}
public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
// json파일 저장
@ -109,12 +167,12 @@ public class KakaoApiJsonSave {
for(int i=0; i < varNm.length; i++) {
for(int j=0; j < varValInfo.length; j++) {
if (templateTitle.indexOf(varNm[i]) > -1) {
if(varValInfo[j] != null) {
templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
}else {
templateTitle = templateTitle.replaceAll(varNm[i] , "");
}
}
if(varValInfo[j] != null) {
templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
}else {
templateTitle = templateTitle.replaceAll(varNm[i] , "");
}
}
}
}
@ -140,7 +198,7 @@ public class KakaoApiJsonSave {
// 입력 json 데이터를 파일로 변경
String jsonStr = jo.toString();
System.out.println("jsonFileName : "+jsonFileName);
// System.out.println("jsonFileName : "+jsonFileName);
File outPut = new File(jsonFileName);
outPut.createNewFile();
@ -156,6 +214,139 @@ public class KakaoApiJsonSave {
return jsonFileName;
}
/*
* 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성
* 2025.04.18
* 우영두
* 파일은 하나만 생성해서 동일하게 사용함.
*
* */
public String kakaoApiFTJsonSave_advc(KakaoVO kakaoVO) throws JsonProcessingException {
// json파일 저장
ObjectMapper mapper = new ObjectMapper();
ObjectNode jo = mapper.createObjectNode();
// 버튼
if (kakaoVO.getButtonVOList() != null && !kakaoVO.getButtonVOList().isEmpty()) {
ArrayNode buttonList = mapper.createArrayNode();
for (KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) {
ObjectNode button = mapper.createObjectNode();
button.put("name", buttonInfoVO.getName());
button.put("type", buttonInfoVO.getLinkType());
switch (buttonInfoVO.getLinkType()) {
case "WL":
button.put("url_mobile", buttonInfoVO.getLinkMo());
button.put("url_pc", buttonInfoVO.getLinkPc());
break;
case "AL":
button.put("scheme_ios", buttonInfoVO.getLinkIos());
button.put("scheme_android", buttonInfoVO.getLinkAnd());
break;
case "BC":
// 상담톡
break;
case "BT":
// 전환
break;
}
buttonList.add(button);
}
jo.set("button", buttonList);
}
// 이미지
String imageType = kakaoVO.getImageType();
if (StringUtils.isNotEmpty(imageType)) {
ObjectNode image = mapper.createObjectNode();
image.put("img_url", kakaoVO.getTemplateImageUrl());
image.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl());
jo.set("image", image);
// wide 여부
if ("W".equals(imageType)) {
ObjectNode extra = mapper.createObjectNode();
extra.put("wide", "Y");
jo.set("extra", extra);
}
}
// 문자열로 변환 (이스케이프 없음)
return mapper.writeValueAsString(jo);
/*
// 버튼리스트 JSON 생성
JSONArray buttonList = new JSONArray();
for(KakaoButtonVO buttonInfoVO : kakaoVO.getButtonVOList()) {
JSONObject buttonInfo = new JSONObject();
buttonInfo.put("name", buttonInfoVO.getName());
buttonInfo.put("type", buttonInfoVO.getLinkType());
if(buttonInfoVO.getLinkType().equals("WL")) {
buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo());
buttonInfo.put("url_pc", buttonInfoVO.getLinkPc());
}else if(buttonInfoVO.getLinkType().equals("AL")) {
buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos());
buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd());
}else if(buttonInfoVO.getLinkType().equals("BC")) {
// 상담톡 진행시 등록해야함
}else if(buttonInfoVO.getLinkType().equals("BT")) {
// 전환 전달
}
buttonList.add(buttonInfo);
}
// 강조유형 JSON 생성
JSONObject templateImageInfo = new JSONObject();
JSONObject templateImageExtInfo = new JSONObject();
String imageType = kakaoVO.getImageType();
if(StringUtils.isNotEmpty(imageType)) {
templateImageInfo.put("img_url", kakaoVO.getTemplateImageUrl());
templateImageInfo.put("img_link", StringUtils.isNotEmpty(kakaoVO.getImgLink()) ? kakaoVO.getImgLink() : kakaoVO.getTemplateImageUrl() );
}
// wide 여부
if ("W".equals(imageType)) {
ObjectNode extra = mapper.createObjectNode();
extra.put("wide", "Y");
jo.set("extra", extra);
}
JSONObject jo = new JSONObject();
if(buttonList.size() != 0) {
jo.put("button", buttonList);
}
if(templateImageInfo.size() != 0) {
jo.put("image", templateImageInfo);
}
if(templateImageExtInfo.size() != 0) {
jo.put("extra", templateImageExtInfo);
}
// 입력 json 데이터를 파일로 변경
String jsonStr = jo.toString();
return jsonStr;*/
}
/*
* 친구톡 발송시 이미지, 버튼 추가에 따른 Json 파일 생성
* 2024.01.17

View File

@ -1,5 +1,7 @@
package itn.let.kakao.kakaoComm.kakaoApi;
import java.util.Optional;
import javax.annotation.Resource;
import org.apache.http.HttpResponse;
@ -146,24 +148,8 @@ public class KakaoApiProfile {
kakaoReturnVO.setBizReturnMsg(msg);
if(code.equals("200")) {
JSONObject tempCate = (JSONObject) object.get("data");
String senderKey = tempCate.get("senderKey").toString();
kakaoVO.setSenderKey(senderKey);
int profileCnt = kakaoApiService.selectKakaoProfileCnt(kakaoVO);
//중복된 발신프로필이 없으면 추가 입력
if(profileCnt == 0) {
kakaoApiService.insertKakaoProfileInfo(kakaoVO);
}else {//중복이 있는 경우 처리
kakaoReturnVO.setBizReturnCode("310");
kakaoReturnVO.setBizReturnMsg("이미 등록되어 있는 발신프로필 입니다");
return kakaoReturnVO;
}
kakaoReturnVO.setSenderKey((String) ((JSONObject) object.get("data")).get("senderKey"));
}
}else {
kakaoReturnVO.setBizReturnCode(statusCode);
@ -228,24 +214,25 @@ public class KakaoApiProfile {
if(code.equals("200")) {
JSONObject templateProfile = (JSONObject) object.get("data");
System.out.println("templateProfile = " + templateProfile.toJSONString());
String senderKey = (templateProfile.get("senderKey") == null) ? null : templateProfile.get("senderKey").toString(); //발신프로필키
String uuid = (templateProfile.get("uuid") == null) ? null : templateProfile.get("uuid").toString(); //카카오톡 채널
String name = (templateProfile.get("name") == null) ? null : templateProfile.get("name").toString(); //카카오톡 채널 발신프로필
String status = (templateProfile.get("status") == null) ? null : templateProfile.get("status").toString(); //발신프로필 상태
boolean block = (boolean) templateProfile.get("block"); //발신프로필 차단 여부
boolean dormant = (boolean) templateProfile.get("dormant"); //발신프로필 휴면 여부
String profileStatus = (templateProfile.get("profileStatus") == null) ? null : templateProfile.get("profileStatus").toString(); //카카오톡 채널 상태((A: activated, C: deactivated, B: block, E: deleting, D: deleted)
String createdAt = (templateProfile.get("createdAt") == null) ? null : templateProfile.get("createdAt").toString(); //발신프로필 등록일
String modifiedAt = (templateProfile.get("modifiedAt") == null) ? null : templateProfile.get("modifiedAt").toString(); //최종수정일
String categoryCode = (templateProfile.get("categoryCode") == null) ? null : templateProfile.get("categoryCode").toString(); //발신프로필 카테고리코드
boolean alimtalk = (boolean) templateProfile.get("alimtalk"); //알림톡 사용 여부
boolean bizchat = (boolean) templateProfile.get("bizchat"); //상담톡 사용 여부
boolean brandtalk = (boolean) templateProfile.get("brandtalk"); //브랜드톡 사용 여부
String committalCompanyName = (templateProfile.get("committalCompanyName") == null) ? null : templateProfile.get("committalCompanyName").toString(); //위탁사 이름(상담톡 관련)
String channelKey = (templateProfile.get("channelKey") == null) ? null : templateProfile.get("channelKey").toString(); //메시지 전송 결과 수신 채널키
boolean businessProfile = (boolean) templateProfile.get("businessProfile"); //카카오톡 채널 비즈니스 인증 여부
String businessType = (templateProfile.get("businessType") == null) ? null : templateProfile.get("businessType").toString(); //카카오톡 채널 비즈니스 인증 타입
String senderKey = getStringValue(templateProfile, "senderKey"); //발신프로필키
String uuid = getStringValue(templateProfile, "uuid"); //카카오톡 채널
String name = getStringValue(templateProfile, "name"); //카카오톡 채널 발신프로필
String status = getStringValue(templateProfile, "status"); //발신프로필 상태
boolean block = extractBoolean(templateProfile,"block", false); //발신프로필 차단 여부
boolean dormant = extractBoolean(templateProfile, "dormant", false); //발신프로필 휴면 여부
String profileStatus = getStringValue(templateProfile, "profileStatus"); //카카오톡 채널 상태((A: activated, C: deactivated, B: block, E: deleting, D: deleted)
String createdAt = getStringValue(templateProfile, "createdAt"); //발신프로필 등록일
String modifiedAt = getStringValue(templateProfile, "modifiedAt"); //최종수정일
String categoryCode = getStringValue(templateProfile, "categoryCode"); //발신프로필 카테고리코드
boolean alimtalk = extractBoolean(templateProfile, "alimtalk", false); //알림톡 사용 여부
boolean bizchat =extractBoolean(templateProfile, "bizchat", false); //상담톡 사용 여부
boolean brandtalk = extractBoolean(templateProfile, "brandtalk", false); //브랜드톡 사용 여부
String committalCompanyName = getStringValue(templateProfile, "committalCompanyName"); //위탁사 이름(상담톡 관련)
String channelKey = getStringValue(templateProfile, "channelKey"); //메시지 전송 결과 수신 채널키
boolean businessProfile = extractBoolean(templateProfile, "businessProfile", false); //카카오톡 채널 비즈니스 인증 여부
String businessType = getStringValue(templateProfile, "businessType"); //카카오톡 채널 비즈니스 인증 타입
/*if(templateProfile.get("committalCompanyName") != null) {//위탁사 이름(상담톡 관련) 데이터가 NULL 넘어오는 경우가 있어서 예외처리해줌
@ -290,4 +277,16 @@ public class KakaoApiProfile {
return kakaoReturnVO;
}
// 헬퍼 메서드
private String getStringValue(JSONObject json, String key) {
return Optional.ofNullable(json.get(key))
.map(Object::toString)
.orElse(null);
}
// Boolean 추출 헬퍼 메서드 (기본값 포함)
private boolean extractBoolean(JSONObject json, String key, boolean defaultValue) {
return Optional.ofNullable(json.get(key))
.map(value -> (boolean) value) // boolean으로 캐스팅
.orElse(defaultValue); // 키가 없으면 기본값 반환
}
}

View File

@ -41,6 +41,7 @@ import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.utl.fcc.service.EgovStringUtil;
import lombok.extern.slf4j.Slf4j;
/**
* @FileName : KakaoApiTemplate.java
@ -50,6 +51,7 @@ import itn.let.utl.fcc.service.EgovStringUtil;
* @프로그램 설명 :
*/
@Slf4j
@Component
public class KakaoApiTemplate {
@ -394,6 +396,7 @@ public class KakaoApiTemplate {
String sendUrl = mjonBizUrl + "/v3/kakao/template/list";
log.info(" + kakaoVO.getCategoryCode() :: [{}]", kakaoVO.getCategoryCode());
JSONObject jsonObject = new JSONObject();
jsonObject.put("bizId", mjonBizId);
jsonObject.put("apiKey", mjonBizKakaoApiKey);
@ -437,6 +440,8 @@ public class KakaoApiTemplate {
JSONParser parser = new JSONParser();
Object obj = parser.parse(result);
JSONObject object = (JSONObject) obj;
log.info(" + object [{}]",object.toJSONString());
String code = object.get("code").toString();
String msg = object.get("message").toString();
@ -456,6 +461,9 @@ public class KakaoApiTemplate {
List<KakaoReturnVO> templatList = new ArrayList<KakaoReturnVO>() ;
for(int i=0; i < tempJSONList.size(); i++) {
JSONObject templateInfo = (JSONObject)tempJSONList.get(i);
log.info(" + templateInfo [{}]",templateInfo.toJSONString());
KakaoReturnVO templateInfoVO = new KakaoReturnVO();
String senderKey = templateInfo.get("senderKey").toString();

View File

@ -30,115 +30,6 @@ public class KakaoFTJsonSave {
static String json;
@SuppressWarnings("unchecked")
public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
// json파일 저장
Date nowDate = new Date();
SimpleDateFormat todayFrom = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timeFrom = new SimpleDateFormat("HHmmss");
String jsonFileName = mjonBizJsonDir+"/"+kakaoVO.getUserId()+"/"+todayFrom.format(nowDate)+"/"+kakaoVO.getSendType(); // 아이디/날짜/타입
String fileName = timeFrom.format(nowDate)+"_"+kakaoVO.getDestPhone()+".json";
try {
File userIdFile = new File(jsonFileName);
if(!userIdFile.exists()) {
userIdFile.mkdirs(); // 없으면 하위 디렉토리 까지 생성
jsonFileName = jsonFileName +"/"+fileName;
}else {
jsonFileName = jsonFileName +"/"+fileName;
System.out.println("jsonFileName : "+jsonFileName);
File file1 = new File(jsonFileName);
if (file1.isFile()) {
return jsonFileName;
}
}
KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
// 버튼리스트 JSON 생성
JSONArray buttonList = new JSONArray();
// 버튼 수량 체크 진행
for(KakaoButtonVO buttonInfoVO : templateDetail.getButtonList()) {
JSONObject buttonInfo = new JSONObject();
buttonInfo.put("name", buttonInfoVO.getName());
buttonInfo.put("type", buttonInfoVO.getLinkType());
if(buttonInfoVO.getLinkType().equals("WL")) {
buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo());
buttonInfo.put("url_pc", buttonInfoVO.getLinkPc());
}else if(buttonInfoVO.getLinkType().equals("AL")) {
buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos());
buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd());
}else if(buttonInfoVO.getLinkType().equals("BC")) {
// 상담톡 진행시 등록해야함
}else if(buttonInfoVO.getLinkType().equals("BT")) {
// 전환 전달
}
buttonList.add(buttonInfo);
}
// Image JSON 생성
JSONObject imageJson = new JSONObject();
// img형과 wide 형인경우만 등록 (if문으로 제어)
imageJson.put("img_url", "등록된 이미지 URL");
imageJson.put("img_link", "이동 페이지 URL");
// Wide JSON 생성
JSONObject wideJson = new JSONObject();
// wide 형인경우만 등록(if문으로 제어)
wideJson.put("wide", "Y");
JSONObject jo = new JSONObject();
if(imageJson.size() != 0) {
jo.put("image", imageJson);
}
if(wideJson.size() != 0) {
jo.put("extra", wideJson);
}
if(buttonList.size() != 0) {
jo.put("button", buttonList);
}
// 입력 json 데이터를 파일로 변경
String jsonStr = jo.toString();
System.out.println("jsonFileName : "+jsonFileName);
File outPut = new File(jsonFileName);
outPut.createNewFile();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPut), "euc-kr"));
bw.write(jsonStr);
bw.close();
} catch (IOException e) {
System.out.println("json 생성 실패");
e.printStackTrace();
}
return jsonFileName;
}
@SuppressWarnings("unchecked")
public String kakaoApiJsonSave(KakaoVO kakaoVO) {

View File

@ -2,7 +2,11 @@ package itn.let.kakao.user.kakaoAt.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
public interface KakaoAlimTalkService {
@ -19,10 +23,13 @@ public interface KakaoAlimTalkService {
//카카오 친구톡 발신
public MjonMsgReturnVO insertKakaoFtSendAjax(KakaoVO kakaoVO) throws Exception;
//카카오 알림톡 전송 실패 환불리스트 조회
public void selectKakaoAtSentRefundList() throws Exception;
StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
//카카오 친구톡 전송 실패 환불리스트 조회
public void selectKakaoFtSentRefundList() throws Exception;
//카카오(알림톡, 친구톡 통합) 전송 실패 환불리스트 조회
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception;
public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception;
//발신 프로필 등록 처리
public KakaoReturnVO createKaKaoProfile(KakaoVO kakaoVO) throws Exception;
}

View File

@ -6,6 +6,7 @@ import java.util.List;
import org.springframework.stereotype.Repository;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoVO;
@Repository("kakaoAlimTalkDAO")
@ -43,27 +44,13 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
return result;
}
public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
int result = 0;
result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
return result;
}
public void insertKakaoSendPrice(KakaoVO kakaoVO) throws Exception{
insert("kakaoAlimTalkDAO.insertKakaoSendPrice",kakaoVO);
}
@SuppressWarnings("unchecked")
public List<KakaoVO> selectKakaoAtSentRefundList() throws Exception{
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoAtSentRefundList");
}
@SuppressWarnings("unchecked")
public List<KakaoVO> selectKakaoFtSentRefundList() throws Exception{
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoFtSentRefundList");
public List<KakaoVO> selectKakaoSentRefundList() throws Exception{
return (List<KakaoVO>) list("kakaoAlimTalkDAO.selectKakaoSentRefundList");
}
public KakaoVO selectKakaoAtUmid(KakaoVO kakaoVO) throws Exception{
@ -94,4 +81,31 @@ public class KakaoAlimTalkDAO extends EgovAbstractDAO {
public void updateKakaoFtNotSend(KakaoVO kakaoVO) {
select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO);
}
public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
int result = 0;
result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
return result;
}
public int insertKakaoAtDataInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
return update("kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc", kakaoSendAdvcVOList);
}
public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList);
}
public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
}
public KakaoVO selectBizLog(String bizUmid) {
return (KakaoVO) select("kakaoAlimTalkDAO.selectBizLog", bizUmid);
// return (KakaoVO) select("kakaoAlimTalkDAO.selectKakaoAtUmid", bizUmid);
}
}

View File

@ -1,19 +1,40 @@
package itn.let.kakao.user.kakaoAt.service.impl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.BizKakaoPriceVO;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.mjocommon.MjonHolidayApi;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msg.service.impl.MjonMsgDAO;
@ -24,9 +45,14 @@ import itn.let.mjo.msgholiday.service.MsgHolidayVO;
import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.mjo.pay.service.impl.MjonPayDAO;
import itn.let.module.base.PriceAndPoint;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.sym.site.service.impl.SiteManagerDAO;
import itn.let.uss.umt.service.EgovUserManageService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service("kakaoAlimTalkService")
public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{
@ -48,12 +74,41 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
@Resource(name = "egovMjonMsgIdGnrService")
private EgovIdGnrService idgenMsgId;
@Resource(name = "egovMjonMsgGroupIdGnrService")
private EgovIdGnrService idgenMjonMsgGroupId;
@Resource(name = "mjonPayService")
private MjonPayService mjonPayService;
@Resource(name = "egovMjonCashIdGnrService")
private EgovIdGnrService idgenMjonCashId;
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@Resource(name = "kakaoApiService")
private KakaoApiService kakaoApiService;
@Autowired
private MjonPayDAO mjonPayDAO;
@Autowired
KakaoSendUtil kakaoSendUtil;
@Autowired
private MjonCommon mjonCommon;
@Autowired
private PriceAndPoint priceAndPoint;
final String KAKAO_SUCCESS_CODE = "7000";
final String RESEND_YN_YES = "Y";
final String SMS_SUCCESS_CODE = "4100"; // SMS 성공 코드
final String MMS_SUCCESS_CODE = "6600"; // MMS 성공 코드
final String AT_MSG_TYPE = "8"; // MSG 타입 알림톡
final String FT_MSG_TYPE = "9"; // MSG 타입 친구톡
//발신프로필 상태값 변경(삭제/복구 기능)
@Override
public int updateKakaoProfileStatus(KakaoVO kakaoVO) throws Exception{
@ -741,79 +796,491 @@ public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements
return returnVO;
}
private void processKakaoSendCharge(KakaoVO kakaoVO) throws Exception {
/*
* 카카오 알림톡 발송 실패에 따른 금액 환불 처리
//1-1.카카오톡 발송 성공 + 대체문자 신청 O : 대체문자 금액 환불
if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {
BizKakaoPriceVO bizKakaoPriceVO = mjonPayDAO.selectBizKakaoPrice(kakaoVO.getMsgGroupId());
BigDecimal sendPrice = null;
if(AT_MSG_TYPE.equals(kakaoVO.getMsgType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoAtPrice());
}else {
if(StringUtils.isEmpty(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtPrice());
}else if("I".equals(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtImgPrice());
}else if("W".equals(kakaoVO.getBizKakaoImageType())){
sendPrice = new BigDecimal(bizKakaoPriceVO.getBizKakaoFtWideImgPrice());
}
}
// 예시: 건당 가격이 이미 String 형태라면 변환
BigDecimal eachPrice = new BigDecimal(kakaoVO.getEachPrice());
// 차이 계산
BigDecimal diffPrice = eachPrice.subtract(sendPrice);
//대체문자 비용(eachPrace - sendPrice)
if (diffPrice.compareTo(BigDecimal.ZERO) > 0) {
String result = diffPrice.toString();
kakaoVO.setEachPrice(result);
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 발송 성공 후 대체문자 금액 환불");
}
}
//1-2.카카오톡 발송 성공 + 대체문자 신청 X : 금액 환불 X
}
private void handleAlternativeMessageScenario(KakaoVO kakaoVO) throws Exception {
KakaoVO bizLogVO = kakaoAlimTalkDAO.selectBizLog(kakaoVO.getBizUmid());
log.info("대체문자 전송 UMID: {}", kakaoVO.getBizUmid());
//2-1.카카오톡 발송 실패 + 대체문자 발송 성공 : 금액 환불 X
boolean isAlternativeMessageSuccessful = false;
if (bizLogVO != null && StringUtils.isNotEmpty(bizLogVO.getBizLogCallStatus())) {
if (SMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())
|| MMS_SUCCESS_CODE.equals(bizLogVO.getBizLogCallStatus())) {
isAlternativeMessageSuccessful = true;
}
log.info("bizLogVO.getBizLogCallStatus() :: [{}]", bizLogVO.getBizLogCallStatus());
log.info("isAlternativeMessageSuccessful :: [{}]", isAlternativeMessageSuccessful);
}
//2-2.카카오톡 발송 실패 + 대체문자 발송 실패 : 전액 환불
if (!isAlternativeMessageSuccessful) {
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 전송 실패로 인한 결제 금액 환불");
}
}
private void handleRefund(KakaoVO vo, String msg) throws Exception {
// mj_cash 테이블에 환불 내역 추가 회원 금액 업데이트
// eachPrice는 환불될 금액이므로 양수여야 합니다.
priceAndPoint.insertCashAndPointNoUpdate(
vo.getUserId(),
Float.parseFloat(vo.getEachPrice()), // 환불 금액은 양수
msg,
vo.getMsgGroupId(),
vo.getUserData()
);
}
@Override
public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
log.info(" :: [{}]", kakaoVO.toString());
// 측정할 메소드 호출 시간 기록
Instant start = Instant.now();
// KakaoSendAdvcVO
Map<String, Object> returnMap = new HashMap<>();
Map<String, Object> apiReturnMap = new HashMap<>();
String userId = "";
if("A".equals(kakaoVO.getSendKind()))
{
userId = kakaoVO.getMberId();
}else {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
}
kakaoVO.setUserId(userId);
/**
* 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
*/
boolean mberSttus = userManageService.selectUserStatusInfo(userId);
if (!mberSttus) {
request.getSession().invalidate();
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.UNAUTHORIZED,
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.", "STAT_1070");
}
StatusResponse statusResponse = new StatusResponse();
/** @isHolidayNotified
* @false : 알림 X
* @true : 알림 O */
boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO);
/** @카카오톡 전송 list 셋팅 -------------------------------------------*/
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, isNotified, statusResponse);
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
return statusResponse;
}
/** @전송금액 확인 --------------------------------------------------*/
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
log.error("Insufficient balance for message sending.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060");
}
/** @json파일이 있을 떄 biz_attachments insert */
kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
// this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
// instTotalCnt : 화면에서 보여줄 발송건수
int instTotalCnt = 0;
// 임시
List<String> nextMsgGroupIdA = new ArrayList<>();
// 대안: entrySet() 직접 사용
String apiMsgGroupId = "";
String apiMsgType = "";
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
// entry 사용
List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
// api 전달
apiMsgGroupId = StringUtils.isNotEmpty(apiMsgGroupId)
? apiMsgGroupId + "," + nextMsgGroupId
: nextMsgGroupId;
apiMsgType = StringUtils.isNotEmpty(apiMsgType)
? apiMsgType + "," + kakaoSendAdvcListVO.get(0).getMsgType()
: kakaoSendAdvcListVO.get(0).getMsgType();
groupedMsgList.stream().forEach(t-> log.info("t.toString() [{}]", t.toString()));
//
// if(1==1) {
//
// // 강제로 예외 발생
// throw new RuntimeException("강제 예외 발생 테스트");
// }
//
//
// 발송 데이터 삽입
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
// int instCnt = 6;
if(instCnt > 0) {
instTotalCnt += instCnt;
KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
// log.info(" ++ kakaoVO.getAtSmishingYn() :: [{}]", kakaoVO.getAtSmishingYn());
// log.info(" ++ kakaoVO.getAtDelayYn() :: [{}]", kakaoVO.getAtDelayYn());
/** @groupData 테이블 insert */
kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/
kakaoVO.setMsgGroupId(sendVO.getMsgGroupId());
kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getKakaoAtPrice()));
kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice()));
kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice()));
kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO);
priceAndPoint.insertCashAndPoint(kakaoVO.getUserId()
, -Float.parseFloat(sendVO.getTotPrice())
, "카카오 알림톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송"
, nextMsgGroupId
);
/** @SLACK발송 */
/** @발송조건이되면 발송 */
if(isNotified) {
mjonCommon.getAdminKakaoAtSendSlack(sendVO);
}else if("Y".equals(kakaoVO.getAtSmishingYn())){
/** @발송조건이 안되면 DB INSERT */
mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder()
.msgGroupId(nextMsgGroupId)
.userId(kakaoVO.getUserId())
.reqDate(kakaoVO.getReqDate())
.smsTxt(groupedMsgList.get(0).getTemplateContent())
.totalCallCnt(instCnt)
.callFrom(kakaoVO.getCallFrom())
.msgType("8")
.reserveYn(kakaoVO.getReserveYn())
.build()
);
}
nextMsgGroupIdA.add(nextMsgGroupId);
}
}
apiReturnMap.put("resultSts", instTotalCnt);
// 그룹 ID
apiReturnMap.put("msgGroupId", apiMsgGroupId);
// 메세지 타입
apiReturnMap.put("msgType", apiMsgType);
returnMap.put("resultSts", instTotalCnt);
returnMap.put("reserYn", kakaoVO.getReserveYn());
returnMap.put("groupIds", nextMsgGroupIdA);
// 측정할 메소드 호출 시간 기록
Instant end = Instant.now();
log.info(" + start :: [{}]", start);
// 실행 시간 계산 (나노초, 밀리초, )
long seconds = Duration.between(start, end).getSeconds();
System.out.println("메소드 실행 시간 (초): " + seconds + " s");
double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔
returnMap.put("second", seconds+" s");
returnMap.put("minutes", minutes+" min");
// System.out.println("메소드 실행 시간 (분): " + minutes + " min");
// priceAndPoint.getBefCash(userId);
statusResponse.setStatus(HttpStatus.OK);
statusResponse.setObject(returnMap);
apiReturnMap.put("result", HttpStatus.OK);
apiReturnMap.put("message", "전송이 완료되었습니다.");
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}
@Override
public List<KakaoVO> selectKakaoSentRefundListForSingle() throws Exception{
return kakaoAlimTalkDAO.selectKakaoSentRefundList();
}
@Override
public void kakaoSingleRefund(KakaoVO kakaoVO) throws Exception {
System.out.println(kakaoVO.getMsgGroupId() +"________결과 : " +kakaoVO.getRsltCode() +" 대체문자 전송 : "+kakaoVO.getSubMsgSendYn());
kakaoVO.setMsgTypeTxt(AT_MSG_TYPE.equals(kakaoVO.getMsgType()) ? "알림톡" : "친구톡");
if(KAKAO_SUCCESS_CODE.equals(kakaoVO.getRsltCode())) {
//1.카카오톡 발송 성공
processKakaoSendCharge(kakaoVO);
}else if(RESEND_YN_YES.equals(kakaoVO.getSubMsgSendYn())) {//카카오톡 발송 실패, 대체문자 발송 신청 O
//2.카카오톡 발송 실패 + 대체문자 신청 O
handleAlternativeMessageScenario(kakaoVO);
}else {
//3.카카오톡 발송 실패 + 대체문자 신청 X : 전액 환불
handleRefund(kakaoVO, "카카오 " + kakaoVO.getMsgTypeTxt() + " 전송 실패로 인한 결제 금액 환불");
}
//모든 유형 환불 완료 처리
mjonMsgDAO.updateRefundY(kakaoVO);
}
private void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
// TODO Auto-generated method stub
// 측정할 메소드 호출 시간 기록
List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO);
jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
if(jsonInfoData.size() > 0) {
kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData);
}
}
private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
// TODO Auto-generated method stub
// log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
// log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
sendVO.setMsgGroupCnt(Integer.toString(instCnt));
sendVO.setReserveYn(kakaoVO.getReserveYn());
sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
Float totPrice = eachPrice * instCnt;
sendVO.setTotPrice(String.format("%.1f", totPrice));
sendVO.setAtDelayYn(StringUtils.isEmpty(kakaoVO.getAtSmishingYn()) ? "N" : kakaoVO.getAtSmishingYn());
sendVO.setSendKind(StringUtils.isEmpty(kakaoVO.getSendKind()) ? "H" : kakaoVO.getSendKind());
sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
}
/**
* @methodName : insertKakaoData_advc
* @author : 이호영
* @date : 2025. 3. 20.
* @description : 카카오 batch 발송 => mj_msg_data
* @return : int
* @param kakaoSendAdvcVOList
* @param parentLoopCount
* @param isJsonNotEmpty
* @param isJsonNameAllSame
* @return
*
* */
@Override
public void selectKakaoAtSentRefundList() throws Exception {
*/
private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
/**
* 1. 카카오 AT 전송성공 확인
* 2. 카카오 AT 전송실패, 대채문자 전송확인
* 3. 카카오 AT 전송 실패 확인
*/
List<KakaoVO> kakaoAtSentRefundList = kakaoAlimTalkDAO.selectKakaoAtSentRefundList();
for(KakaoVO vo : kakaoAtSentRefundList) {
System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn());
if(vo.getRsltCode().equals("7000")) {
kakaoAlimTalkDAO.updateKakaoAtSend(vo);
}else if(vo.getSubMsgSendYn().equals("Y")) {
KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo);
// 시작 시간 측정
long totalStartTime = System.currentTimeMillis();
System.out.println("대체문자 전송 : " + info.getBizUmid());
if (info.getBizUmid() != null) {
kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo);
}else {
kakaoAlimTalkDAO.updateKakaoAtNotSend(vo);
}
int totalSize = kakaoSendAdvcVOList.size(); // 데이터 개수
// Batch 크기 설정 (고정값)
// int batchSize = 10000; 465
int batchSize = 50000; // 9분 18초
}else {
kakaoAlimTalkDAO.updateKakaoAtNotSend(vo);
}
log.info("총 데이터 개수 :: [{}] ", totalSize);
log.info("설정된 Batch 크기 :: [{}] ", batchSize);
// insert 카운트
int instCnt = 0;
int batchCount = 0;
// 배치별 실행 시간 기록
List<Double> batchExecutionTimes = new ArrayList<>();
// 번째 배치에서만 삽입했는지 추적하는 플래그
for (int i = 0; i < totalSize; i += batchSize) {
// Batch 시작 시간 측정
long batchStartTime = System.currentTimeMillis();
// Batch 리스트 생성
List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize));
System.out.println("Batch 시작 인덱스: " + i);
// mj_msg_data 테이블 insert
int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
/** @kakaoSendUtil.populateSendLists
* 하단에서
* getJsonStr 데이터 처리 활용
* */
instCnt += insertedCount;
// Batch 종료 시간 측정 실행 시간 계산
long batchEndTime = System.currentTimeMillis();
double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0;
// 실행 시간 기록
batchExecutionTimes.add(batchExecutionTimeInSeconds);
batchCount++;
}
// 종료 시간 측정
long totalEndTime = System.currentTimeMillis();
// 실행 시간 계산 (밀리초 -> 초로 변환)
double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0;
// 실행 시간 출력
log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
log.info("batchSize :: [{}] ", batchSize);
log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "");
log.info("총 삽입 건수 :: [{}] ", instCnt);
// 배치별 실행 시간 출력
for (int k = 0; k < batchExecutionTimes.size(); k++) {
System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "");
}
return instCnt;
}
// 보유 금액이 충분한지 확인하는 메서드
private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
String userMoney = priceAndPoint.getBefCash(userId);
// 쉼표 제거
userMoney = userMoney.replace(",", "");
// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
// 메시지 금액 계산 (HALF_EVEN 적용)
BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
// 비교 수행
return befCash.compareTo(totalEachPrice) >= 0;
}
/*
* 카카오 친구톡 발송 실패에 따른 금액 환불 처리
* 카카오 친구톡 대체문자 선택에 대해 성공시 친구톡과 문자 금액 차액의 환불도 처리 .
* */
@Override
public void selectKakaoFtSentRefundList() throws Exception {
public KakaoReturnVO createKaKaoProfile(KakaoVO kakaoVO) throws Exception {
KakaoReturnVO returnVO = new KakaoReturnVO();
/**
* 1. 카카오 FT 전송성공 확인
* 2. 카카오 FT 전송실패, 대채문자 전송확인
* 3. 카카오 FT 전송 실패 확인
*/
List<KakaoVO> kakaoFtSentRefundList = kakaoAlimTalkDAO.selectKakaoFtSentRefundList();
for(KakaoVO vo : kakaoFtSentRefundList) {
System.out.println(vo.getMsgGroupId() +"________결과 : " +vo.getRsltCode() +" 대체문자 전송 : "+vo.getSubMsgSendYn());
if(vo.getRsltCode().equals("7000")) {//친구톡 발송 성공시
kakaoAlimTalkDAO.updateKakaoFtSend(vo);
}else if(vo.getSubMsgSendYn().equals("Y")) {//친구톡 발송 실패 했을 경우
//대체문자 발송 UMID 번호 조회 - 알림톡 쿼리 동일하게 사용
KakaoVO info = kakaoAlimTalkDAO.selectKakaoAtUmid(vo);
System.out.println("대체문자 전송 : " + info.getBizUmid());
if (info.getBizUmid() != null) {//대체문자 발송 완료인 경우
kakaoAlimTalkDAO.updateKakaoAtSubMsgSend(vo);
}else {
kakaoAlimTalkDAO.updateKakaoFtNotSend(vo);
}
/* senderKey 사용 우무 */
int profileCnt = kakaoApiService.selectKakaoProfileCnt(kakaoVO);
if(profileCnt > 0) {
returnVO.setBizReturnMsg("이미 등록된 발신프로필입니다. 동일 채널ID는 중복 등록이 불가합니다.");
}else {
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
delProfileList = selectDeleteProfileInfo(kakaoVO);
if(delProfileList.size() != 0) {
kakaoVO.setProfileId(delProfileList.get(0).getProfileId());
kakaoVO.setDeleteYn("N");
updateKakaoProfileStatus(kakaoVO);
returnVO.setBizReturnMsg("삭제 발신프로필의 복구가 완료 되었습니다.");
}else {
kakaoAlimTalkDAO.updateKakaoFtNotSend(vo);
kakaoApiService.insertKakaoProfileInfo(kakaoVO);
returnVO.setBizReturnMsg("발신프로필의 등록이 완료 되었습니다.");
}
}
return returnVO;
}
}

View File

@ -96,7 +96,10 @@ public class KakaoAlimTalkController {
KakaoReturnVO tmpProfileVO = kakaoApiProfile.kakaoApiProfileList(kakaoProfileVO);
resultApiProfileList.add(tmpProfileVO);
/* API를 통하여 정상적으로 조회된 프로필만 add 처리 */
if("200".equals(tmpProfileVO.getBizReturnCode())) {
resultApiProfileList.add(tmpProfileVO);
}
}
@ -137,21 +140,8 @@ public class KakaoAlimTalkController {
KakaoReturnVO kakaoInfo = kakaoApiProfile.kakaoApiProfileToken(kakaoVO); //발신프로필 인증 토큰 요청하기
String bizReturnCd = kakaoInfo.getBizReturnCode();
String bizReturnMsg = kakaoInfo.getBizReturnMsg();
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
if(bizReturnCd.equals("310") && bizReturnMsg.equals("이미 등록되어 있는 발신프로필 입니다")) {
kakaoVO.setUserId(userId);
delProfileList = kakaoAlimTalkService.selectDeleteProfileInfo(kakaoVO);
}
int listSize = delProfileList.size();
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
modelAndView.addObject("delInfoCnt", listSize);
}catch(Exception ex){
ex.printStackTrace();
@ -269,68 +259,14 @@ public class KakaoAlimTalkController {
kakaoVO.setLastUpdusrId(userId);
KakaoReturnVO kakaoInfo = kakaoApiProfile.kakaoApiProfileCreate(kakaoVO);
String bizReturnCd = kakaoInfo.getBizReturnCode();
String bizReturnMsg = kakaoInfo.getBizReturnMsg();
System.out.println(bizReturnCd);
System.out.println(bizReturnMsg);
/*
* 기존에 등록된 발신프로필이라고 결과가 오는 경우 데이터베이스에서 삭제 기록을 조회해 본다.
* 삭제 기록이 있는 경우 복구를 해주고(deleteYn 값을 'N'으로 변경)
* 기록이 없는 경우 사이트에 등록되었을 있음.
*
* */
List<KakaoVO> delProfileList = new ArrayList<KakaoVO>();
if((bizReturnCd.equals("509") && bizReturnMsg.equals("이미 사용중인 카카오톡 채널입니다.")) || (bizReturnCd.equals("310") && bizReturnMsg.equals("이미 등록되어 있는 발신프로필 입니다"))) {
delProfileList = kakaoAlimTalkService.selectDeleteProfileInfo(kakaoVO);
}
//삭제처리된 발신프로필이 있는 경우
if(delProfileList != null && delProfileList.size() > 0) {
int resultCnt = 0;
for(int i=0; i< delProfileList.size(); i++) {
KakaoVO tmpKakaoVO = new KakaoVO();
tmpKakaoVO.setUserId(userId);
tmpKakaoVO.setProfileId(delProfileList.get(i).getProfileId());
tmpKakaoVO.setDeleteYn("N");
int count = kakaoAlimTalkService.updateKakaoProfileStatus(tmpKakaoVO);
resultCnt = resultCnt + count;
}
KakaoReturnVO kakaoReturnVO = new KakaoReturnVO();
if(resultCnt > 0) {
kakaoReturnVO.setBizReturnCode("200");
kakaoReturnVO.setBizReturnMsg("삭제 발신프로필의 복구가 완료 되었습니다.");
modelAndView.addObject("kakaoInfo", kakaoReturnVO);
modelAndView.addObject("result", "success");
}else {
kakaoReturnVO.setBizReturnCode("200");
kakaoReturnVO.setBizReturnMsg("삭제 발신프로필의 복구에 오류가 발생하였습니다.");
modelAndView.addObject("kakaoInfo", kakaoReturnVO);
modelAndView.addObject("result", "zeroUpdate");
}
}else {//삭제된 내역이 없는 경우 사이트에 발신프로필이 등록되어 있을 있다.
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
if("200".equals(kakaoInfo.getBizReturnCode())) {
kakaoVO.setSenderKey(kakaoInfo.getSenderKey());
KakaoReturnVO internalReuslt = kakaoAlimTalkService.createKaKaoProfile(kakaoVO);
kakaoInfo.setBizReturnMsg(internalReuslt.getBizReturnMsg());
}
modelAndView.addObject("kakaoInfo", kakaoInfo);
modelAndView.addObject("result", "success");
}
}catch(Exception ex){

View File

@ -9,9 +9,11 @@ import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Resource;
@ -35,9 +37,11 @@ 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.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -46,6 +50,8 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
@ -65,6 +71,7 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiProfileCategory;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.mjocommon.MjonHolidayApi;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
@ -73,6 +80,9 @@ import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.mjo.msgholiday.service.MsgAlarmSetVO;
import itn.let.mjo.msgholiday.service.MsgHolidayService;
import itn.let.mjo.msgholiday.service.MsgHolidayVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.mjo.pay.service.MjonPayVO;
import itn.let.org.web.OrgChartManageController;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.EgovUserManageService;
@ -96,6 +106,8 @@ import itn.let.uss.umt.service.UserManageVO;
@Controller
public class KakaoAlimTalkSendController {
private final OrgChartManageController orgChartManageController;
@Resource(name = "egovMjonMsgGroupIdGnrService")
private EgovIdGnrService idgenMjonMsgGroupId;
@ -141,6 +153,16 @@ public class KakaoAlimTalkSendController {
@Autowired
KakaoApiJsonSave kakaoApiJsonSave;
@Autowired
private MjonCommon mjonCommon;
@Resource(name = "mjonPayService")
private MjonPayService mjonPayService;
KakaoAlimTalkSendController(OrgChartManageController orgChartManageController) {
this.orgChartManageController = orgChartManageController;
}
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView.do"})
public String KakaoAlimtalkMsgDataView(ModelMap model
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
@ -213,7 +235,29 @@ public class KakaoAlimTalkSendController {
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
}
if("Y".equals(kakaoVO.getMsgResendAllFlag())) {
List<MjonMsgDataVO> resendList = new ArrayList<MjonMsgDataVO>();
MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO();
mjonMsgDataVO.setMsgGroupId(kakaoVO.getMsgResendAllGroupId());
mjonMsgDataVO.setUserId(userId);
resendList = mjonMsgDataService.selectMjMsgListByResend(mjonMsgDataVO);
ObjectMapper mapper = new ObjectMapper();
try {
String resendListJson = mapper.writeValueAsString(resendList);
model.addAttribute("resendListJson", resendListJson);
} catch (Exception e) {
e.printStackTrace();
}
}
return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView";
// return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310";
}
@ -519,8 +563,8 @@ public class KakaoAlimTalkSendController {
HSSFWorkbook workbook = new HSSFWorkbook(files.get(0).getInputStream());
HSSFSheet sheet = workbook.getSheetAt(0);
if(sheet.getLastRowNum() > 501) {
errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다.";
if(sheet.getLastRowNum() > 300000) {
errMessage = "한번에 전송 가능한 최대 발송건은 300,000건 입니다.";
jr.setSuccess(false);
jr.setMessage(errMessage);
return jr;
@ -652,13 +696,21 @@ public class KakaoAlimTalkSendController {
}
if(totRowDataCnt > 501) { //
errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다.";
// if(totRowDataCnt > 501) { //
// errMessage = "한번에 전송 가능한 최대 발송건은 500건 입니다.";
// jr.setSuccess(false);
// jr.setMessage(errMessage);
// return jr;
// }
if(sheet.getLastRowNum() > 300000) {
errMessage = "한번에 전송 가능한 최대 발송건은 300,000건 입니다.";
jr.setSuccess(false);
jr.setMessage(errMessage);
return jr;
}
List<HashMap<String, String>> json = new ArrayList<HashMap<String, String>>();
for(int i=1; i< sheet.getLastRowNum() + 1; i++){ //먼저 밸리데이션 체크(1줄은 생략)
@ -789,13 +841,13 @@ public class KakaoAlimTalkSendController {
modelAndView.setViewName("jsonView");
try {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
// LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
// String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(userId == "") {
modelAndView.addObject("result", "notLogin");
return modelAndView;
}else {
// if(userId == "") {
// modelAndView.addObject("result", "notLogin");
// return modelAndView;
// }else {
KakaoReturnVO kakaoTemplateTempList = kakaoApiTemplate.selectKakaoApiTemplate(kakaoVO);
@ -811,7 +863,7 @@ public class KakaoAlimTalkSendController {
modelAndView.addObject("kakaoTemplateList", kakaoTemplateTempList);
modelAndView.addObject("result", "success");
}
// }
}catch(Exception ex){
ex.printStackTrace();
modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.select"));
@ -1054,6 +1106,16 @@ public class KakaoAlimTalkSendController {
return modelAndView;
}
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST)
public ResponseEntity<StatusResponse> kakaoAlimTalkMsgSendAjax_advc(
@RequestBody KakaoVO kakaoVO,
HttpServletRequest request
) throws Exception {
System.out.println(" + kakaoAlimTalkMsgSendAjax_advc + ");
return ResponseEntity.ok().body(kakaoAlimTalkService.insertKakaoAtSandAjax_advc(kakaoVO, request)) ;
}
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST)
// @ResponseBody
public ModelAndView kakaoAlimTalkMsgSendAjax(
@ -1061,6 +1123,10 @@ public class KakaoAlimTalkSendController {
HttpServletRequest request,
@ModelAttribute("kakaoVO") KakaoVO kakaoVO
) throws Exception {
// 시작 시간
long startTime = System.currentTimeMillis();
System.out.println(" :: kakaoAlimTalkMsgSendAjax :: ");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
@ -1385,8 +1451,7 @@ public class KakaoAlimTalkSendController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
MjonCommon comm = new MjonCommon();
comm.getAdminKakaoAtSandSlack(kakaoVO);
// mjonCommon.getAdminKakaoAtSendSlack(kakaoVO);
}
@ -1398,7 +1463,145 @@ public class KakaoAlimTalkSendController {
} catch (Exception e) {
throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e);
}
// 종료 시간
long endTime = System.currentTimeMillis();
// 실행 시간 계산 ( 단위)
double executionTimeSeconds = (endTime - startTime) / 1000.0;
System.out.println("실행 시간: " + String.format("%.3f", executionTimeSeconds) + "");
String returnTxt = String.format("%.3f", executionTimeSeconds) + "";
modelAndView.addObject("seconds", returnTxt);
return modelAndView;
}
@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView_test_set.do"})
public String kakaoAlimtalkMsgDataView_test_set(ModelMap model
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
model.addAttribute("loginVO", loginVO);
/* if(userId == "") {
return "redirect:/web/user/login/login.do";
}*/
//2.사용자 개인 단가 정보 불러오기
if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
// 사용자 아이디를 이용한 발신프로필 조회
kakaoVO.setUserId(userId);
List<KakaoVO> selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("kakaoProfileList", selectKakaoProfileList);
//발신번호 불러오기
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
MJUtil mjUtil = new MJUtil();
for(String phone : resultSendPhonList) {
resultPhonList.add(mjUtil.addDash(phone));
}
model.addAttribute("resultPhonList", resultPhonList);
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
Float shortPrice = mberManageVO.getShortPrice();
Float longPrice = mberManageVO.getLongPrice();
Float picturePrice = mberManageVO.getPicturePrice();
Float picture2Price = mberManageVO.getPicture2Price();
Float picture3Price = mberManageVO.getPicture3Price();
BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
model.addAttribute("userMoney", userMoney);
//////////////////////////////////////////////////////////////////
//최근 전송 내역
MjonMsgDataVO searchVO = new MjonMsgDataVO();
Calendar cal = Calendar.getInstance();
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(now);
cal.add(Calendar.DATE, -3);
String chkDate = format.format(cal.getTime());
searchVO.setUserId(userId);
searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작
model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO));
//자주보내는 번호
model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO));
// 사용자 저으이
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
}
return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp";
}
public void kakaoRefundSingleTransaction() throws Exception{
System.out.println("=============카카오 환불 싱글 트랜잭션 수행 =============");
/* 회원 money 업데이트 처리 트랜잭션 분리를 위하여 impl이 아닌 현재 위치에서 반복문 실행 */
System.out.println("=============SchedulerUtil=====runKakaoOneTime =============>");
List<KakaoVO> kakaoRefundList = kakaoAlimTalkService.selectKakaoSentRefundListForSingle();
Set<String> targetIdSet = new HashSet<>();
for(KakaoVO kakaoVO : kakaoRefundList) {
try {
kakaoAlimTalkService.kakaoSingleRefund(kakaoVO);
targetIdSet.add(kakaoVO.getUserId());
} catch (Exception e) {
String msg = "[문자온] 환불 실패 - " + kakaoVO.getMsgId() +"("+ kakaoVO.getUserId() + ")";
mjonCommon.sendSimpleSlackMsg(msg);;
}
}
MjonPayVO mjonPayVO = new MjonPayVO();
for(String userId : targetIdSet) {
try {
mjonPayVO.setUserId(userId);
mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트
} catch(Exception e) {
String msg = "[문자온] 환불 후 잔액 갱신 실패 - " + userId;
mjonCommon.sendSimpleSlackMsg(msg);;
}
}
}
/**
* @Method Name : kakaoMsgSendRefundTestAjax
* @작성일 : 2025. 8. 6.
* @작성자 : 이지우
* @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트
*/
@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoMsgSendRefundTestAjax.do"})
public ModelAndView kakaoMsgSendRefundTestAjax(ModelMap model
, HttpServletRequest request
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
this.kakaoRefundSingleTransaction();
modelAndView.addObject("result", "success");
return modelAndView;
}
}

View File

@ -305,6 +305,9 @@ public class KakaoAlimTalkTemplateController {
KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
System.out.println("kakaoTemplateInfo :; "+ kakaoTemplateInfo);
String kakaoButtonTypeDs = "";
for(int i=0; i < kakaoTemplateInfo.getButtonList().size(); i++) {
String buttonType = kakaoTemplateInfo.getButtonList().get(i).getLinkType();

View File

@ -0,0 +1,12 @@
package itn.let.kakao.user.kakaoFt.service;
import javax.servlet.http.HttpServletRequest;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.mail.service.StatusResponse;
public interface KakaoFriendsTalkService {
StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
}

View File

@ -0,0 +1,292 @@
package itn.let.kakao.user.kakaoFt.service.impl;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.LoginVO;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.user.kakaoAt.service.impl.KakaoAlimTalkDAO;
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msg.service.impl.MjonMsgDAO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.module.base.PriceAndPoint;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserManageVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service("KakaoFriendsTalkService")
public class KakaoFriendsTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoFriendsTalkService{
@Resource(name = "egovFriendstalkTemplateIdService")
private EgovIdGnrService idgenFriendTalkTmpId;
@Resource(name="kakaoFriendsTalkTemplateDAO")
private KakaoFriendsTalkTemplateDAO kakaoFriendsTalkTemplateDAO;
@Resource(name="mjonMsgDAO")
private MjonMsgDAO mjonMsgDAO;
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@Resource(name = "egovMjonMsgGroupIdGnrService")
private EgovIdGnrService idgenMjonMsgGroupId;
@Resource(name="kakaoAlimTalkDAO")
private KakaoAlimTalkDAO kakaoAlimTalkDAO;
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@Autowired
KakaoSendUtil kakaoSendUtil;
@Autowired
private MjonCommon mjonCommon;
@Autowired
private PriceAndPoint priceAndPoint;
@Override
public StatusResponse insertKakaoFtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
StatusResponse statusResponse = new StatusResponse();
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.toString());
log.info(" + kakaoVO.toString() :: [{}]", kakaoVO.ftToString());
// if(1==1) {
// throw new RuntimeException("강제로 발생시킨 예외");
// }
// 측정할 메소드 호출 시간 기록
Instant start = Instant.now();
// KakaoSendAdvcVO
Map<String, Object> returnMap = new HashMap<>();
Map<String, Object> apiReturnMap = new HashMap<>();
String userId = "";
if("A".equals(kakaoVO.getSendKind()))
{
userId = kakaoVO.getMberId();
}else {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
: null;
userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if (userId.equals("")) {
return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
}
}
kakaoVO.setUserId(userId);
/**
* 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
*/
boolean mberSttus = userManageService.selectUserStatusInfo(userId);
if (!mberSttus) {
request.getSession().invalidate();
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.UNAUTHORIZED,
"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 친구톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.", "STAT_1070");
}
/**
* 친구톡은 발송 시간 제약이 있음
*/
if(kakaoSendUtil.isRestrictedFriendTalkTime(kakaoSendUtil.resolveBaseDate(kakaoVO))) {
// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고
return new StatusResponse(HttpStatus.BAD_REQUEST,
"친구톡은 20시 50분부터 익일 08시까지 발송이 제한됩니다.","STAT_2080");
}
/** @isHolidayNotified
* @false : 알림 X
* @true : 알림 O */
boolean isHolidayNotified = mjonCommon.processUserAndCheckFT(kakaoVO);
UserManageVO userManageVO = mjonCommon.getUserManageInfo(userId);
// 스팸관련 키워드 select
List<String> resultSpamTxt = mjonMsgDataService.selectSpamKeywordList();
/** @카카오톡 전송 list 셋팅 -------------------------------------------*/
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendListsFT(kakaoVO, isHolidayNotified, statusResponse, userManageVO, resultSpamTxt);
if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
return statusResponse;
}
/** @전송금액 확인 --------------------------------------------------*/
if (!kakaoSendUtil.isCashSufficient(userId, kakaoSendAdvcListVO)) {
log.error("Insufficient balance for message sending.");
return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.", "STAT_1060");
}
/** @json파일이 있을 떄 biz_attachments insert */
kakaoSendUtil.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
// instTotalCnt : 화면에서 보여줄 발송건수
int instTotalCnt = 0;
// 임시
List<String> nextMsgGroupIdA = new ArrayList<>();
// 대안: entrySet() 직접 사용
String apiMsgGroupId = "";
String apiMsgType = "";
for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
// entry 사용
List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
// api 전달
apiMsgGroupId = StringUtils.isNotEmpty(apiMsgGroupId)
? apiMsgGroupId + "," + nextMsgGroupId
: nextMsgGroupId;
apiMsgType = StringUtils.isNotEmpty(apiMsgType)
? apiMsgType + "," + kakaoSendAdvcListVO.get(0).getMsgType()
: kakaoSendAdvcListVO.get(0).getMsgType();
// 발송 데이터 삽입
int instCnt = kakaoSendUtil.insertKakaoData_advc(groupedMsgList);
// int instCnt = 6;
if(instCnt > 0) {
instTotalCnt += instCnt;
KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
/** @groupData 테이블 insert */
kakaoSendUtil.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/
priceAndPoint.insertBizFtKakaoPrice(kakaoVO.getUserId(), sendVO.getMsgGroupId());
priceAndPoint.insertCashAndPoint(kakaoVO.getUserId()
, -Float.parseFloat(sendVO.getTotPrice())
, "카카오 친구톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송"
, nextMsgGroupId
);
/** @SLACK발송 */
/** @발송조건이되면 발송 */
if(isHolidayNotified
&& ("Y".equals(userManageVO.getAtSmishingYn()) || "Y".equals(kakaoVO.getAtDelayYn()))
) {
mjonCommon.getAdminKakaoAtSendSlack(sendVO);
}else if("Y".equals(kakaoVO.getAtSmishingYn())){
/** @발송조건이 안되면 DB INSERT */
mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder()
.msgGroupId(nextMsgGroupId)
.userId(kakaoVO.getUserId())
.reqDate(kakaoVO.getReqDate())
.smsTxt(groupedMsgList.get(0).getTemplateContent())
.totalCallCnt(instCnt)
.callFrom(kakaoVO.getCallFrom())
.msgType("8")
.reserveYn(kakaoVO.getReserveYn())
.build()
);
}
nextMsgGroupIdA.add(nextMsgGroupId);
}
}
apiReturnMap.put("resultSts", instTotalCnt);
// 그룹 ID
apiReturnMap.put("msgGroupId", apiMsgGroupId);
// 메세지 타입
apiReturnMap.put("msgType", apiMsgType);
returnMap.put("resultSts", instTotalCnt);
returnMap.put("reserYn", kakaoVO.getReserveYn());
returnMap.put("groupIds", nextMsgGroupIdA);
// 측정할 메소드 호출 시간 기록
Instant end = Instant.now();
log.info(" + start :: [{}]", start);
// 실행 시간 계산 (나노초, 밀리초, )
long seconds = Duration.between(start, end).getSeconds();
log.info("메소드 실행 시간 (초): {} s", seconds);
double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔
returnMap.put("second", seconds+" s");
returnMap.put("minutes", minutes+" min");
// System.out.println("메소드 실행 시간 (분): " + minutes + " min");
// priceAndPoint.getBefCash(userId);
statusResponse.setStatus(HttpStatus.OK);
statusResponse.setObject(returnMap);
apiReturnMap.put("result", HttpStatus.OK);
apiReturnMap.put("message", "전송이 완료되었습니다.");
statusResponse.setApiReturn(apiReturnMap);
return statusResponse;
}
}

View File

@ -13,9 +13,11 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@ -29,7 +31,9 @@ import itn.let.kakao.kakaoComm.KakaoSendUtil;
import itn.let.kakao.kakaoComm.KakaoVO;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkService;
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.mjocommon.MjonHolidayApi;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
@ -68,6 +72,9 @@ public class KakaoFriendsTalkSendController {
@Resource(name = "kakaoFriendsTalkTemplateService")
private KakaoFriendsTalkTemplateService kakaoFtTemplateService;
@Resource(name = "KakaoFriendsTalkService")
private KakaoFriendsTalkService kakaoFriendsTalkService;
/** userManageService */
@Resource(name = "userManageService")
private EgovUserManageService userManageService;
@ -113,114 +120,109 @@ public class KakaoFriendsTalkSendController {
model.addAttribute("loginVO", loginVO);
try {
if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
if(!"".equals(userId) && !"ROLE_ADMIN".equals(author)) {
//사용자 등록 발신프로필 정보 조회해오기
kakaoVO.setUserId(userId);
List<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("resultProfileList", resultProfileList);
//사용자 등록 발신프로필 정보 조회해오기
kakaoVO.setUserId(userId);
List<KakaoVO> resultProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
model.addAttribute("resultProfileList", resultProfileList);
// 특수문자 리스트 불러오기
MjonSymbolVO symbolVO = new MjonSymbolVO();
List<MjonSymbolVO> symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO);
model.addAttribute("symbolList", symbolList);
// 특수문자 리스트 불러오기
MjonSymbolVO symbolVO = new MjonSymbolVO();
List<MjonSymbolVO> symbolList = mjonSymbolService.selectMjonSymbolList(symbolVO);
model.addAttribute("symbolList", symbolList);
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
MJUtil mjUtil = new MJUtil();
for(String phone : resultSendPhonList) {
resultPhonList.add(mjUtil.addDash(phone));
}
model.addAttribute("resultPhonList", resultPhonList);
//아이디 발신번호 리스트 불러오기.
List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
List<String> resultPhonList = new ArrayList<String>();
MJUtil mjUtil = new MJUtil();
for(String phone : resultSendPhonList) {
resultPhonList.add(mjUtil.addDash(phone));
}
model.addAttribute("resultPhonList", resultPhonList);
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
/*Float shortPrice = mberManageVO.getShortPrice();
Float longPrice = mberManageVO.getLongPrice();
Float picturePrice = mberManageVO.getPicturePrice();
Float picture2Price = mberManageVO.getPicture2Price();
Float picture3Price = mberManageVO.getPicture3Price();*/
BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
/*Float shortPrice = mberManageVO.getShortPrice();
Float longPrice = mberManageVO.getLongPrice();
Float picturePrice = mberManageVO.getPicturePrice();
Float picture2Price = mberManageVO.getPicture2Price();
Float picture3Price = mberManageVO.getPicture3Price();*/
BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
model.addAttribute("userMoney", userMoney);
model.addAttribute("userMoney", userMoney);
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//최근 전송 내역
MjonMsgDataVO searchVO = new MjonMsgDataVO();
Calendar cal = Calendar.getInstance();
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(now);
cal.add(Calendar.DATE, -3);
String chkDate = format.format(cal.getTime());
searchVO.setUserId(userId);
searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작
model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO));
//최근 전송 내역
MjonMsgDataVO searchVO = new MjonMsgDataVO();
Calendar cal = Calendar.getInstance();
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(now);
cal.add(Calendar.DATE, -3);
String chkDate = format.format(cal.getTime());
searchVO.setUserId(userId);
searchVO.setMyMsgStDt(chkDate); //검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작
// model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO));
//자주보내는 번호
model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO));
//자주보내는 번호
// model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO));
// 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가)
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
// 사용자 정의 단가 정보 불러오기(시스템 단가 혹은 협의 단가)
model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
//사용자 템플릿 정보 조회
String friendId = kakaoVO.getFriendId();
KakaoVO resultTemplateVO = new KakaoVO();
//사용자 템플릿 정보 조회
String friendId = kakaoVO.getFriendId();
KakaoVO resultTemplateVO = new KakaoVO();
if(friendId != null) {
resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO);
}
model.addAttribute("resultTemplateVO", resultTemplateVO);
if(friendId != null) {
resultTemplateVO = kakaoFtTemplateService.selectKakaoFriendsTemplateDetail(kakaoVO);
}
model.addAttribute("resultTemplateVO", resultTemplateVO);
//친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지
//친구톡 발송시간 체크 하기 - 20:50 ~ 익일 08:00 사이에는 발송 금지
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nows = new Date();
String nowDate = sdf1.format(nows);
cal.setTime(nows);
Date nows = new Date();
String nowDate = sdf1.format(nows);
cal.setTime(nows);
int hours = cal.get(Calendar.HOUR_OF_DAY);
int minuts = cal.get(Calendar.MINUTE);
int hours = cal.get(Calendar.HOUR_OF_DAY);
int minuts = cal.get(Calendar.MINUTE);
boolean sendStatus = true;
boolean sendStatus = true;
if(hours >= 20) {
if(hours >= 20) {
if(minuts >= 50) {
System.out.println("발송금지 시간" + hours + ":" + minuts);
sendStatus = false;
}
}
if(hours < 8) {
if(minuts >= 50) {
System.out.println("발송금지 시간" + hours + ":" + minuts);
sendStatus = false;
}
System.out.println("발송상태는 ::: "+sendStatus);
model.addAttribute("sendStatus", sendStatus);
}
if(hours < 8) {
System.out.println("발송금지 시간" + hours + ":" + minuts);
sendStatus = false;
}
} catch (Exception e) {
System.out.println(" kakaoFriendsTalkMsgDataViewDataRegist Error ::: " + e);
System.out.println("발송상태는 ::: "+sendStatus);
model.addAttribute("sendStatus", sendStatus);
}
return "web/kakao/msgdata/ft/KakaoFriendsTalkMsgDataView";
@ -314,6 +316,28 @@ public class KakaoFriendsTalkSendController {
}
/**
* @methodName : sendMsgData_ft_advc
* @author : 이호영
* @date : 2025. 4. 17.
* @description : 친구톡 발송기능
* @return : ResponseEntity<StatusResponse>
* @param kakaoVO
* @param request
* @param model
* @return
* @throws Exception
*
*/
@RequestMapping(value = "/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendAjax_advc.do")
public ResponseEntity<StatusResponse> kakaoFriendsTalkMsgSendAjax_advc(
@RequestBody KakaoVO kakaoVO,
HttpServletRequest request
) throws Exception {
System.out.println(" :: sendMsgData_ft_advc :: ");
return ResponseEntity.ok().body(kakaoFriendsTalkService.insertKakaoFtSandAjax_advc(kakaoVO, request)) ;
}
/**
* @Method Name : kakaoFriendsTalkMsgSendAjax
@ -663,7 +687,7 @@ public class KakaoFriendsTalkSendController {
if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
MjonCommon comm = new MjonCommon();
comm.getAdminKakaoAtSandSlack(kakaoVO);
// comm.getAdminKakaoAtSendSlack(kakaoVO);
}
@ -687,27 +711,6 @@ public class KakaoFriendsTalkSendController {
return modelAndView;
}
/**
* @Method Name : kakaoFriendsTalkMsgSendRefundTestAjax
* @작성일 : 2024. 1. 18.
* @작성자 : 우영두
* @Method 설명 : 카카오 친구톡 전송 환불 스케줄러 서비스 테스트
*/
@RequestMapping(value= {"/web/mjon/kakao/friendstalk/kakaoFriendsTalkMsgSendRefundTestAjax.do"})
public ModelAndView kakaoFriendsTalkMsgSendRefundTestAjax(ModelMap model
, HttpServletRequest request
, @ModelAttribute("kakaoVO") KakaoVO kakaoVO) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
kakaoAlimTalkService.selectKakaoFtSentRefundList();
modelAndView.addObject("result", "success");
return modelAndView;
}
/**
* @Method Name : kakaoFriendsTalkMsgSendRefundTestAjax
* @작성일 : 2024. 1. 18.

View File

@ -1,5 +1,6 @@
package itn.let.kakao.user.kakaoFt.web;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -8,11 +9,16 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
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;
@ -21,6 +27,7 @@ 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.LoginVO;
import itn.com.cmm.RestResponse;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.utl.fcc.service.EgovStringUtil;
import itn.let.kakao.kakaoComm.KakaoReturnVO;
@ -32,10 +39,14 @@ import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoFTJsonSave;
import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
import itn.let.kakao.user.kakaoFt.service.KakaoFriendsTalkTemplateService;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.symbol.service.MjonSymbolService;
import itn.let.mjo.symbol.service.MjonSymbolVO;
import itn.let.uss.ion.cnt.service.CntManageVO;
import itn.let.uss.umt.service.EgovUserManageService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class KakaoFriendsTalkTemplateController {
@ -172,6 +183,67 @@ public class KakaoFriendsTalkTemplateController {
}
@RequestMapping(value="/web/pop/ft/kakaoTemplatePop.do")
public String siteContentIntro(@ModelAttribute CntManageVO cntManageVO, HttpServletRequest request, Model model) throws Exception {
return "/web/pop/kakaoFtPop";
}
@ResponseBody
@RequestMapping(value= {"/web/mjon/kakao/template/sendKakaoFriendsTemplateImageUploadAjax_advc.do"})
public ResponseEntity<StatusResponse> sendKakaoFriendsTemplateImageUploadAjax_advc(
@ModelAttribute("kakaoVO") KakaoVO kakaoVO
, final MultipartHttpServletRequest multiRequest
) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
try {
if(!"A".equals(kakaoVO.getSendKind())) {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
if(StringUtils.isEmpty(userId)) {
return ResponseEntity.ok(
new StatusResponse(HttpStatus.UNAUTHORIZED
, "로그인을 하셔야 이용 가능합니다."
, LocalDateTime.now()
)
);
}
}
final Map<String, MultipartFile> files = multiRequest.getFileMap();
/* if (!files.isEmpty()){
Map<String, String> resultMap = kakaoApiImageUpload.kakaoApiImageUpload(kakaoVO, files, 0);
//테스트
modelAndView.addObject("code", resultMap.get("code"));
modelAndView.addObject("msg", resultMap.get("msg"));
modelAndView.addObject("imgUrl", resultMap.get("imgUrl"));
}
modelAndView.addObject("result", "success");*/
return ResponseEntity.ok().body(kakaoApiImageUpload.kakaoApiImageUpload_advc(kakaoVO, files, 0));
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
return ResponseEntity.ok().body(new StatusResponse(
HttpStatus.BAD_REQUEST
, "오류가 발생하였습니다."
, ""
));
}
}
// 카카오 친구톡 템플릿 등록요청
/**
* @methodName : insertKakaoFriendsTemplateDataAjax
@ -189,9 +261,13 @@ public class KakaoFriendsTalkTemplateController {
@ModelAttribute("kakaoVO") KakaoVO kakaoVO
, final MultipartHttpServletRequest multiRequest
) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
// log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag());
log.info(" + ImgLink :: [{}]", kakaoVO.getImgLink());
try {
LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
@ -207,16 +283,18 @@ public class KakaoFriendsTalkTemplateController {
kakaoVO.setLastUpdusrId(userId);
kakaoVO.setSendType("FT");
/*
String imgUrl = kakaoVO.getTemplateImageUrl();
int buttonSize = kakaoVO.getButtonVOList().size();
if(!imgUrl.equals("") || buttonSize > 0) {
log.info(" + kakaoVO.getAdFlag() :: [{}]", kakaoVO.getAdFlag());
//json 파일 생성 처리
String resultJsonPath = kakaoFTJsonSave.kakaoApiJsonSave(kakaoVO);
kakaoVO.setBizJsonName(resultJsonPath);
}
}*/
int result = kakaoFtTemplateService.insertKakaoFriendsTemplateData(kakaoVO);

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More