Compare commits

236 Commits

Author SHA1 Message Date
이주일
6ac836b5c6 주문 결제 개선 및 결제취소 조회 인증 만료 처리
- 일반·구독 주문서(PC/모바일) 통화 라벨 표기, 통화 전환 시 첫 결제수단 자동 선택
- Stripe 이메일 자동 입력, 복귀 주소 설정 우선 적용, 진입 이력 GET 처리, 취소 안내·결제결과 회전 표시
- 일반 Stripe 상품명 전체 병 수 요약, 구독 주문은 구독서비스명을 PG에 전달
- 재고 부족 시 상품명·주문 수량·구매 가능 수량 안내
- 결제취소 조회 인증 만료 안내·로그인 이동, 조회 GET 전환, 중복 리다이렉트 종료
- 관련 Java·JS 테스트 추가

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 14:34:23 +09:00
이대환
fa3a84793f Stripe 결제/환불 완료 적용 2026-10-23 16:56:46 +09:00
이대환
dd44db6c36 Stripe 결제/환불 완료 적용 2026-10-23 15:32:31 +09:00
이대환
f1facf4612 Stripe 결제/환불 완료 적용 2026-10-23 14:06:56 +09:00
이대환
92b9fc5df7 Stripe 결제 적용(모바일) 2026-10-23 12:01:56 +09:00
이대환
dbdca33aae Stripe 결제 구분 적용 2026-10-22 15:35:06 +09:00
이대환
eefe66a2e8 구독서비스 배송횟수 2026-10-22 15:29:39 +09:00
이대환
983d6f8069 Stripe 결제 상태 재확인 2026-10-16 11:51:09 +09:00
이대환
dd2a26643f fix : 상품관리 > 상품조회 > 상품 등록/복사재등록/수정 - input 값 trim 공통함수 추가 2026-10-14 16:51:43 +09:00
이대환
6ac4a735f6 Stripe key db 조회 2026-10-14 11:07:54 +09:00
이대환
ae684dcea4 Stripe 환불 적용 2026-10-12 18:29:07 +09:00
이대환
fbd7b4758e fix : 상품관리 > 상품조회 > 상품 등록/복사재등록/수정 - input 값 trim 공통함수 추가 2026-10-08 11:33:23 +09:00
이대환
4980c20c23 Stripe 결제 적용 테스트 2026-09-30 11:08:16 +09:00
이대환
ebb473ea44 Stripe 결제 적용 테스트 2026-09-29 12:04:59 +09:00
이대환
06f4fc1bcc Stripe 결제 적용 테스트 2026-09-28 18:07:36 +09:00
이대환
9d53999ad4 Stripe 결제 적용 테스트 2026-09-28 17:45:01 +09:00
이대환
1f61c6166d Stripe 결제 적용 테스트 2026-09-28 17:40:56 +09:00
이대환
85bb5ec055 Stripe 결제 적용 테스트 2026-09-28 15:48:48 +09:00
이대환
3a42bff138 쇼핑몰 사이트맵 xml 자동 생성 2026-09-08 13:56:17 +09:00
이주일
53f5f0d3bb Revert "fix: 관리자 대시보드 쇼핑몰 선택 유지"
This reverts commit 4e39452a01.
2026-08-26 23:12:41 +09:00
이주일
5fad79ea8a Revert "fix: 관리자 대시보드 게시글 링크 쇼핑몰 코드 전달"
This reverts commit 46b7a31d57.
2026-08-26 23:12:41 +09:00
이주일
46b7a31d57 fix: 관리자 대시보드 게시글 링크 쇼핑몰 코드 전달 2026-08-26 23:07:21 +09:00
이주일
4e39452a01 fix: 관리자 대시보드 쇼핑몰 선택 유지 2026-08-26 23:00:15 +09:00
이주일
7097616aa7 fix: 모바일 전체메뉴 하위 카테고리 표시 개선 2026-08-26 17:10:35 +09:00
이대환
8f83f7c8df fix : 카카오 상담문의 아이콘 스타일 적용(모바일)
fix : 상품 문의(모바일)
fix : 게시판 목록 조회(모바일)
2026-08-26 12:24:44 +09:00
이대환
afcb21c435 fix : 카카오 상담문의 아이콘 변경 2026-08-25 17:19:09 +09:00
이대환
a7bb3ec591 게시판 > 게시판 관리 > 게시글 보기/등록/수정 - 화폐단위 변경 (원 → 円) 2026-08-25 11:06:28 +09:00
이대환
7e61bf91f2 게시판 > 게시판 관리 > 게시글 등록/수정 - 상품 정보(추천 상품) 문구 2026-08-20 17:45:33 +09:00
이대환
9fcbc3d582 fix : 카카오 상담문의 아이콘 위치 변경 2026-08-19 16:23:52 +09:00
이대환
cc6599c9b4 fix : 카카오 상담문의 아이콘 위치 변경 2026-08-19 15:00:05 +09:00
이대환
c4ca12416a fix : 주문 > 주문 관리 > 전체주문조회 > 프린트 - 발주서 다운로드 화면으로 대체 2026-08-18 16:07:08 +09:00
이대환
0311562483 fix : 배송조회(운송장번호 조회) - 발송 예정 문구 수정
(cherry picked from commit 668823a32a)
2026-08-14 17:35:56 +09:00
이대환
ca8830256f rollback : 결제, 취소 - 키움결제 네이버페이 CPID 관련 적용 2026-08-12 13:35:35 +09:00
이대환
40686ddba6 fix : 결제, 취소 - 키움결제 네이버페이 CPID 관련 적용 2026-08-12 12:24:39 +09:00
이대환
2dee0d76b2 fix : 서치어드바이저 소유권 코드 수정
(cherry picked from commit 9347d5407c)
2026-08-07 12:20:19 +09:00
이대환
5fd99d3bb1 fix : 카카오 상담문의(카카오톡 채널) 추가 2026-08-07 11:45:06 +09:00
이대환
cd8406094b fix : 서치어드바이저 소유권 코드 수정
fix : 카카오 상담문의(카카오톡 채널) 삭제

(cherry picked from commit 0aad369f61)
2026-08-07 11:42:52 +09:00
이대환
07c145eee4 카카오 상담문의(카카오톡 채널) 2026-08-05 11:09:00 +09:00
이주일
f2b57c5d00 fix: 주문 원화 결제금액 10원 단위 버림 적용 2026-07-25 20:28:26 +09:00
이대환
dd7506d071 fix : 주문 > 주문 관리 > 전체주문조회 > 발주서 다운로드 - 발주서 관리 2026-07-22 17:28:52 +09:00
이대환
c311fb4a68 fix : 주문 > 주문 관리 > 전체주문조회 > 주문 상세 - 배송지 정보 개인통관부호 추가 2026-07-22 16:18:56 +09:00
이대환
fa3c915183 주문 > 주문 관리 > 전체주문조회 > 발주서 다운로드 - 발주서 관리 2026-07-22 11:05:04 +09:00
이주일
1db509b04b fix: 관리자 세션 만료 리다이렉트 루프 방지 2026-07-21 10:26:34 +09:00
이주일
51e7793f7b fix: 게시판 연관상품 이미지 필드 통일 2026-07-19 15:56:16 +09:00
이주일
4088a38652 fix: 게시판 상세 등록일 및 모바일 등록 권한 노출 보정 2026-07-19 14:46:13 +09:00
이주일
f79976b128 fix: 관리자 게시판 연관상품 이미지 및 로컬 인증 보정 2026-07-19 09:07:16 +09:00
이주일
04d3506dd1 fix: 관리자 게시판 인증 및 저장 오류 처리 2026-07-18 20:06:31 +09:00
이주일
923bb4a1a4 fix: 사용자 게시판 등록 버튼 권한별 노출 처리 2026-07-18 15:48:43 +09:00
이주일
f4df00c1d2 fix: 추천상품 표시 순서 적용 2026-07-18 12:33:28 +09:00
이주일
3458cfc963 fix: 추천상품 표시 설정 및 품절 안내 적용 2026-07-18 12:28:41 +09:00
이주일
8412f58b59 fix: 추천상품 PC 카드 목록 구조 통일 2026-07-18 12:16:35 +09:00
이주일
31fa5bf0ec fix: 추천상품 카드 표시 기준 보정 2026-07-18 12:08:29 +09:00
이주일
afbc268b57 feat: 게시판 연관상품 목록 표준화 2026-07-18 12:02:52 +09:00
이주일
713bd6a64d fix: 상품 이미지 업로드 투명도 보존 2026-07-17 14:45:55 +09:00
이주일
5e4d837012 feat: 일반게시판 연관상품 노출 지원 2026-07-17 02:48:34 +09:00
이주일
48af5d88f4 fix: 관리자 게시판 등록 권한 및 URL 표시 개선 2026-07-17 02:24:19 +09:00
이주일
c96dde1323 fix: 품절 및 판매중지 상품 후순위 정렬 2026-07-16 16:57:59 +09:00
이주일
00c5235366 fix: 매거진 상세 목록 버튼 이동 오류 수정 2026-07-16 16:57:58 +09:00
이주일
64fcbdefea feat: 상품배지설정관리 프로그램 추가 2026-07-16 02:16:50 +09:00
이주일
dee18f8605 feat: 쇼핑몰 상품 배지 마스터 연동 2026-07-15 18:09:48 +09:00
이대환
331587ee56 fix : 품절 문구 수정 (Sold Out → 입고 대기중) 2026-07-13 16:20:59 +09:00
jazz
dbe74eeb36 Revert "fix : 상품상세화면 호출시 title 및 meta 정보에 상품제목 노출"
This reverts commit c5948e87
2026-07-13 10:12:49 +09:00
jazz
c5948e87ec fix : 상품상세화면 호출시 title 및 meta 정보에 상품제목 노출
(cherry picked from commit 194ab35ba6)
2026-07-10 17:56:24 +09:00
이대환
44bc0104ce 미할인 상품 - 판매가, 할인율 미표시
>> 쇼핑몰 메인
>> 카테고리 목록
>> 상품 검색
>> 상품 상세
>> 장바구니 담기 팝업
>> 장바구니
>> 결제 화면

(cherry picked from commit f894756a5f)
2026-07-10 11:54:27 +09:00
이주일
ec3718a2c4 fix: 주문상세 배송지 수정 응답 메시지 처리 보정 2026-07-10 00:21:56 +09:00
이주일
89249429ad fix: 주문상세 배송지 조회 시 배송지역 코드 포함 2026-07-09 22:42:21 +09:00
이주일
16b1ad14f4 fix: 주문상세 배송지 수정 시 배송지역 코드 누락 보정 2026-07-09 22:26:31 +09:00
jazz
cba5e39c8e fix : 서치어드바이저 소유권 코드 추가
(cherry picked from commit 6222c3b7d1)
2026-07-09 18:07:48 +09:00
jazz
5be8b39cd7 fix : 서치어드바이저 소유권 코드 추가
(cherry picked from commit 297664b621)
2026-07-09 17:36:26 +09:00
이대환
efda4e8471 fix : 결제 - 키움결제 네이버페이 CPID 관련처리(모바일)
(cherry picked from commit 184dbbe21b)
2026-07-09 14:59:42 +09:00
이대환
edfd9e2474 fix: 주문관리 > 전체주문조회 > 발주서 엑셀 다운로드 - 상품단가(과세 USD)
(cherry picked from commit 2e28122d97)
2026-07-09 12:20:43 +09:00
이대환
02c35d87d2 fix : 주문 관리 > 전체주문조회 > 전체 주문 목록 - 프린트 화폐단위 변경 (원 → 円)
(cherry picked from commit c51f716cc4)
2026-07-08 18:32:15 +09:00
이대환
ca00a15c57 fix : 상품 목록 - 스크롤 불러오기 화폐단위 변경 (원 → 円)
(cherry picked from commit 2b8e84799d)
2026-07-08 14:11:58 +09:00
이대환
2b2d00cdd0 fix : 주문 > 반품환불 관리 > 반품환불 처리 > 반품/환불상세 - 네이버페이 주문 제어 제한
(cherry picked from commit cb655263af)
2026-07-08 11:32:21 +09:00
이대환
ed4d0a98a7 fix : 주문 > 주문 관리 > 전체주문조회, 주문 상세 - 네이버페이 주문 제어 제한
(cherry picked from commit 1de8b5c39f)
2026-07-08 11:22:07 +09:00
이대환
5f90985157 배송조회(운송장번호 조회) - aciExpress 팝업 적용
>> 쇼핑몰 주문/배송 > 주문 상세

(cherry picked from commit 4074ace97d)
2026-07-08 10:37:08 +09:00
이대환
49c8d6c20c fix : 주문 > 주문 관리 > 전체주문조회, 주문 상세 - 네이버페이 주문 제어 제한
(cherry picked from commit 28ee8f8556)
2026-06-29 12:55:30 +09:00
이대환
1c3238a7b4 fix : 주문 > 주문 관리 > 전체주문조회 - 네이버페이 주문 제어 제한
(cherry picked from commit bbeb2a630a)
2026-06-29 12:42:45 +09:00
이대환
480a9997f3 fix : 상품관리 > 상품조회 > 상품 등록/복사재등록 - 상품명(영문), HS Code, 실무게(KG)
(cherry picked from commit bc7f738e55)
2026-06-26 18:36:50 +09:00
이대환
de1dc3cea5 fix : 상품관리 > 상품조회 > 상품 등록/복사재등록 - 상품명(영문), HS Code, 실무게(KG)
(cherry picked from commit 32250636e9)
2026-06-26 18:36:50 +09:00
이대환
6bb7c4928d 주문 > 주문 관리 > 전체주문조회, 주문 상세 - 네이버페이 주문 제어 제한
(cherry picked from commit 6858b24344)
2026-06-26 18:09:24 +09:00
이대환
ee95e09d12 fix : 배송/반품정보 문구 수정 (반품/교환 → 배송/반품)
(cherry picked from commit c04668fda2)
2026-06-19 14:41:13 +09:00
이대환
3ab6988fb8 쇼핑몰 매거진 - 열람 권한 설정(모바일)
(cherry picked from commit 1cab83f69f)
2026-06-11 17:49:03 +09:00
이대환
beb9fbab7b 쇼핑몰 매거진 - 열람 권한 설정
(cherry picked from commit 784cadc6f2)
2026-06-11 17:49:03 +09:00
이대환
b00534af6b batch > 출고 상태 변경
(cherry picked from commit 39ce46c4dc)
2026-06-10 11:41:20 +09:00
이대환
3eda19f6fd 쇼핑몰 검색어 저장
(cherry picked from commit 03ec9d863e)
2026-06-05 14:44:21 +09:00
이대환
3e2ebaabc8 rollback : 결제, 취소 - 키움결제 네이버페이 CPID 관련 적용 취소 2026-06-04 16:08:25 +09:00
이대환
04ee9f1275 fix : 상품 > 상품관리 > 구독서비스 관리 > 구독서비스 삭제 개선, 목록 선택 체크박스 개선
(cherry picked from commit 7bfa5a288c)
2026-06-02 11:50:05 +09:00
이대환
9b2fdee768 fix : 설정 > 원가 설정 - 기준일자 datepicker 적용
(cherry picked from commit 56f29943b6)
2026-06-02 09:47:26 +09:00
이대환
913e5bd678 설정 > 원가 설정 추가
(cherry picked from commit 31561200c2)
2026-06-01 15:49:57 +09:00
이대환
465cde8a16 fix : 설정 > 패밀리사이트 설정 > 입력창 추가 - 스크립트 개선
fix : 상품관리 > 상품조회 > 상품 등록/복사재등록/수정 - 실무게(KG) 자릿수 제한 개선

(cherry picked from commit 5fa4aa5c37)
2026-06-01 15:49:56 +09:00
이주일
923d74d37a fix: FAQ 상세 조회 Ajax Content-Type 추가 2026-05-30 23:30:46 +09:00
이주일
2ec020ecd4 Merge remote-tracking branch 'origin/develop' into develop 2026-05-29 15:46:10 +09:00
이주일
d55f52b752 fix : gitignore 제외 2026-05-29 15:45:51 +09:00
이대환
3cddf4e038 주문관리 > 전체주문조회 > 엑셀 다운로드, 다운로드 항목설정 - 상품명(영문), HS Code, 실무게, 부피무게, 포장개수 추가
(cherry picked from commit 450e43aecb)
2026-05-29 15:19:32 +09:00
이대환
99bbfec448 쇼핑몰 상품상세, 주문결제화면 - 예상 적립 마일리지 관련
fix : 쇼핑몰 회원정보수정 - 취소 버튼
fix : 쇼핑몰 회원탈퇴 - 취소 버튼, 주요 혜택

(cherry picked from commit 1d72e28600)
2026-05-29 09:52:28 +09:00
이주일
25fcfc3555 fix: MyActController 중복 메서드 제거 2026-05-28 23:57:45 +09:00
jilee4unity
e298e9066c add .gitignore and remove build artifacts 2026-05-28 23:41:46 +09:00
jilee4unity
3668cc89b2 merge master into develop - CscListRForm.jsp FAQ 아코디언 버그 수정 2026-05-28 23:34:06 +09:00
claudecode
de463cbb8f fix: FAQ 사용자 화면 아코디언 아코디언 Ajax 응답 처리 오류 수정
- CscListRForm.jsp 117번줄: data 변수 덮어쓰기 방지
  data = JSON.parse(...) → const parsed = JSON.parse(...)
- fn_branch_bbsctt_posble 호출 시 parsed 전달로 변경
- 원인: data 변수 재사용으로 data.result.moveAt 접근 불가
2026-05-28 23:09:49 +09:00
이대환
e293ffe451 ACI Express apikey 추가
(cherry picked from commit 262c9ba03e)
2026-05-28 18:26:25 +09:00
이대환
262c9ba03e ACI Express apikey 추가 2026-05-28 18:26:18 +09:00
이대환
acb8d314d9 ACI Express - ACI Key 발급 API
배송조회(운송장번호 조회) - aciExpress 팝업 적용
>> 쇼핑몰 주문/배송 > 주문 상세,
>> 주문 관리 > 전체주문조회 > 주문상세,
>> 주문 관리 > 출고 조회 > 출고 목록 조회,
>> 주문 관리 > 출고 조회 > 출고 상세 조회,
>> 주문 관리 > 출고 조회 > 출고 상태 변경,
>> 반품환불관리 > 반품환불 처리 > 반품/환불 상세 > 원주문 정보 펼쳐보기

(cherry picked from commit 1e1ee301d6)
2026-05-28 17:58:08 +09:00
이대환
45c85b6079 fix: 주문관리 > 전체주문조회 > 발주서 엑셀 다운로드 - 수취인 전화번호 복호화 2026-05-28 17:57:53 +09:00
이대환
7be7a8851d fix: 개인결제관리 > 개인결제 등록/수정 - 결제수단 체크박스
(cherry picked from commit 6ea1568800)
2026-05-28 17:57:16 +09:00
이주일
f590507308 fix : FAQ 카테고리 버튼 폰트 사이즈 조정 (15px → 14px) 2026-05-28 17:53:29 +09:00
이대환
1e1ee301d6 ACI Express - ACI Key 발급 API
배송조회(운송장번호 조회) - aciExpress 팝업 적용
>> 쇼핑몰 주문/배송 > 주문 상세,
>> 주문 관리 > 전체주문조회 > 주문상세,
>> 주문 관리 > 출고 조회 > 출고 목록 조회,
>> 주문 관리 > 출고 조회 > 출고 상세 조회,
>> 주문 관리 > 출고 조회 > 출고 상태 변경,
>> 반품환불관리 > 반품환불 처리 > 반품/환불 상세 > 원주문 정보 펼쳐보기
2026-05-28 17:53:15 +09:00
이대환
472d5b07e9 fix: 주문관리 > 전체주문조회 > 발주서 엑셀 다운로드 - 수취인 전화번호 복호화 2026-05-28 17:24:15 +09:00
이대환
6ea1568800 fix: 개인결제관리 > 개인결제 등록/수정 - 결제수단 체크박스 2026-05-28 17:21:34 +09:00
이주일
c08a3d3a90 fix : FAQ 카테고리 버튼 폰트 사이즈 조정 (15px → 14px) 2026-05-28 16:11:46 +09:00
김현욱
edcf9f7ad7 전화번호 암호화 문제 수정 2026-05-26 10:35:43 +09:00
이대환
5a5e9944da 주문관리 > 전체주문조회 > 발주서 엑셀 다운로드 2026-05-22 14:40:38 +09:00
이대환
7805d58c94 주문관리 > 전체주문조회 > 발주서 엑셀 다운로드 2026-05-22 14:39:25 +09:00
이대환
77fb6d7e19 결제 - 파라미터 추가(HS Code, 실무게, 부피무게, 포장갯수)
(cherry picked from commit 893a208c82)
2026-05-19 16:31:14 +09:00
이대환
893a208c82 결제 - 파라미터 추가(HS Code, 실무게, 부피무게, 포장갯수) 2026-05-19 16:31:02 +09:00
이대환
e5e4a72577 상품관리 > 상품조회 > 상품 등록/복사재등록/수정 - 상품명(영문), HS Code, 실무게(KG) 추가
(cherry picked from commit 5da6ad42d0)
2026-05-19 11:16:50 +09:00
이대환
5da6ad42d0 상품관리 > 상품조회 > 상품 등록/복사재등록/수정 - 상품명(영문), HS Code, 실무게(KG) 추가 2026-05-19 11:16:34 +09:00
이대환
f4370db796 결제 - 키움결제 네이버페이 CPID 관련처리
(cherry picked from commit 5997dc8de8)
2026-05-13 16:12:46 +09:00
이경숙
8294c9c591 결제 - 키움결제취소 네이버키 적용
(cherry picked from commit 7e54dd22f9)
2026-05-13 14:40:25 +09:00
이경숙
7e54dd22f9 결제 - 키움결제취소 네이버키 적용 2026-05-13 14:40:02 +09:00
이대환
5997dc8de8 결제 - 키움결제 네이버페이 CPID 관련처리 2026-05-12 16:27:28 +09:00
이대환
99a3c126f6 결제 - 키움결제 고객명 파라미터 추가
(cherry picked from commit fd419494b4)
2026-05-07 12:08:35 +09:00
이대환
fd419494b4 결제 - 키움결제 고객명 파라미터 추가 2026-05-07 12:08:27 +09:00
이대환
737ee90122 fix : 주문 > 주문 관리 > 전체주문조회 > 주문 상세 > 결제 처리내역 - 결제취소 완료/취소 출력 순서 개선
(cherry picked from commit e282db97ed)
2026-05-07 11:34:39 +09:00
이대환
e282db97ed fix : 주문 > 주문 관리 > 전체주문조회 > 주문 상세 > 결제 처리내역 - 결제취소 완료/취소 출력 순서 개선 2026-05-07 11:34:25 +09:00
이대환
c014f00a13 fix : 설정 > 배송설정 > 배송그룹 수정 - 일본 주소 옵션 수정
(cherry picked from commit 2d777adeb6)
2026-05-07 10:51:28 +09:00
이대환
2d777adeb6 fix : 설정 > 배송설정 > 배송그룹 수정 - 일본 주소 옵션 수정 2026-05-07 10:51:14 +09:00
이경숙
5d94218e98 결제 - 키움결제 운영 URL 수정
(cherry picked from commit e4b5803f24)
2026-05-06 17:52:35 +09:00
이경숙
e4b5803f24 결제 - 키움결제 운영 URL 수정 2026-05-06 17:52:13 +09:00
이경숙
16c373cb14 Merge remote-tracking branch 'origin/master' 2026-05-06 17:05:25 +09:00
이대환
59cf8da8e4 fix : 주문 > 주문관리 > 전체주문조회 > 주문상세보기 - 총 결제금액 원화 표시
(cherry picked from commit 9cc4a26f0f)
2026-04-30 17:40:17 +09:00
이대환
9cc4a26f0f fix : 주문 > 주문관리 > 전체주문조회 > 주문상세보기 - 총 결제금액 원화 표시 2026-04-30 17:40:09 +09:00
이대환
3fbd19a1e7 쇼핑몰 > 연령확인 팝업
(cherry picked from commit f3918ed7b1)
2026-04-30 16:17:15 +09:00
이대환
f3918ed7b1 쇼핑몰 > 연령확인 팝업 2026-04-30 16:16:58 +09:00
이대환
903374cbee 설정 > 패밀리사이트 설정, 환율 설정, 안내문구 설정 - 추가 2026-04-29 13:53:50 +09:00
이대환
891b0a7f4f fix : 설정 > 마일리지 설정 - 마일리지 사용조건 추가 2026-04-29 13:53:49 +09:00
이대환
fd385fe898 설정 > 패밀리사이트 설정, 환율 설정, 안내문구 설정 - 추가 2026-04-29 13:53:41 +09:00
이대환
6bf80ca297 fix : 설정 > 마일리지 설정 - 마일리지 사용조건 추가 2026-04-29 13:52:21 +09:00
김현욱
b0d1060dd7 메인페이지 미리보기 카테고리별 조회수정 2026-04-27 17:32:10 +09:00
이대환
d4d47751c0 fix : 쇼핑몰 모바일 - 햄버거메뉴 이전 (TabBar.jsp → Include.jsp) 2026-04-27 17:27:51 +09:00
이대환
16662c9e33 fix : 쇼핑몰 모바일 - 햄버거메뉴 이전 (TabBar.jsp → Include.jsp) 2026-04-27 17:24:10 +09:00
김현욱
e649dc3eca 메인페이지 미리보기 카테고리별 조회수정 2026-04-27 17:23:42 +09:00
이대환
174657ac2c fix : 프로모션 > 할인 이벤트 관리 > 이벤트 등록/복사/수정 - 이벤트 혜택 (할인) 개선
(cherry picked from commit 739cd09e1a)
2026-04-27 11:51:33 +09:00
이대환
739cd09e1a fix : 프로모션 > 할인 이벤트 관리 > 이벤트 등록/복사/수정 - 이벤트 혜택 (할인) 개선 2026-04-27 11:51:18 +09:00
이대환
3d91eb6e52 fix : 프로모션 > 쿠폰발송관리 > 쿠폰 발급내역 팝업 - 함수 위치 이동 2026-04-24 13:59:25 +09:00
이대환
8f1a53d048 fix : 메인화면 미리보기 영역 추가 (베스트리뷰, 매거진, 공지, FAQ) 2026-04-24 13:54:48 +09:00
김현욱
70bf2e68dd 쿠폰발송관리-마케팅대상검색 ajax오류 수정(1) 2026-04-23 11:49:36 +09:00
이대환
18bcf1e9de 결제 - 키움결제 네이버페이 관련 처리, 키움결제 네이버페이 포인트주문 관련처리 2026-04-22 18:44:52 +09:00
김현욱
6505bfd975 쿠폰발송관리-마케팅대상검색 ajax오류 수정 2026-04-22 18:16:32 +09:00
이대환
a26dcabe4a fix : 회원가입 안내 화면 - 가입 혜택 개선
fix : 업무사용자관리 > 업무사용자 등록
2026-04-22 11:34:14 +09:00
이대환
bbe2e20e4f fix : 쇼핑몰 모바일 - 햄버거메뉴 탭바 개선 및 이전 (Include.jsp → TabBar.jsp) 2026-04-21 16:23:24 +09:00
이대환
017211f121 fix : 설정 > 팝업설정 > 팝업정보 등록 - 팝업 위치 문구 추가(모바일) 2026-04-20 18:33:10 +09:00
이대환
a08c67f7ff fix : 관리자 메인 - 쇼핑몰 코드 할당 2026-04-20 16:20:59 +09:00
이대환
c68400a4e6 fix : 관리자 구독서비스 등록/복사재등록 - 실판매가 자동 계산, 판매수량 추가 2026-04-20 12:19:57 +09:00
이대환
329b1f4b4c fix : 반품교환 → 배송/반품 문구 변경 2026-04-17 10:40:48 +09:00
이대환
da46a84a69 fix : 주문/구독서비스 결제 > 무통장 결제 - 결제사명 적용 2026-04-16 17:13:09 +09:00
이경숙
eff6ce35bd 결제 - 키움결제 네이버페이 포인트주문취소 관련처리 2026-04-16 12:08:55 +09:00
이경숙
c78197583f Merge remote-tracking branch 'origin/master' 2026-04-16 12:07:04 +09:00
이대환
16523bba0a fix : 상점관리 > 쇼핑몰관리 > 쇼핑몰 등록/수정 - 구독서비스 결제수단 추가 2026-04-16 11:58:15 +09:00
이경숙
28a4552815 결제 - 키움결제 네이버페이 포인트주문 관련처리 2026-04-15 18:04:30 +09:00
김현욱
54b7b3ee45 구독 결제화면 설정 수정 2026-04-15 18:02:59 +09:00
이경숙
7bfcae2f99 Merge remote-tracking branch 'origin/master' 2026-04-15 18:02:10 +09:00
이대환
9722f2135f fix : 주문관리 > 전체주문조회 > 다운로드 항목설정 - 주문구분(subsvc_at) 항목 추가, 상품명 항목 개선 2026-04-15 17:07:06 +09:00
이경숙
920ba7de31 Merge remote-tracking branch 'origin/master' 2026-04-15 16:09:42 +09:00
김현욱
7e13117ad4 결제화면에서 무통장 결제시 설정 수정 2026-04-15 14:57:44 +09:00
이대환
c02fc822ea fix : 주문관리 > 전체주문조회, 주문상세 - 구독서비스 주문 건 상품준비 상태 변경 방지 2026-04-15 14:46:59 +09:00
김현욱
7cb633a784 Merge remote-tracking branch 'origin/master' 2026-04-15 14:12:14 +09:00
김현욱
165d8c244f 출고조회 화면 수정 2026-04-15 14:12:06 +09:00
이대환
bb5dd223c9 fix : 로그아웃 2026-04-15 10:06:15 +09:00
이대환
eda43b3d17 fix : 주문/배송 상세조회(모바일) - 여러곳 배송/선물하기 주문취소 개선 2026-04-14 15:47:38 +09:00
이대환
a1d95d1e01 fix : 구독서비스 주문/배송 - 주문 접수(15) → 주문 무효(95) 버튼 추가 2026-04-14 11:00:52 +09:00
이대환
71914f125e fix : 관리자 구독서비스 수정 - 실판매가 자동 계산, 판매수량 추가 2026-04-13 17:45:32 +09:00
이대환
81b9a872db 구독서비스 결제 - 주문무효 처리 후 재고 및 상태 변경 2026-04-13 16:44:07 +09:00
이대환
576c5c5734 Merge remote-tracking branch 'origin/master' 2026-04-13 16:43:07 +09:00
김현욱
657ecc9d2e 관리자 게시판 대쉬보드 오류 수정 2026-04-13 16:35:59 +09:00
김현욱
21c074500d 마이페이지 일반문의 추가(PC/모바일) 2026-04-13 15:58:32 +09:00
이대환
85e1922188 Merge remote-tracking branch 'origin/master' 2026-04-13 12:28:16 +09:00
이경숙
308c515038 결제 - 키움결제 네이버페이 관련 처리 2026-04-10 18:44:41 +09:00
이경숙
87b9da9475 Merge remote-tracking branch 'origin/master' 2026-04-10 18:40:22 +09:00
김현욱
3e430345ab 배송료(조건부) 계산 변경 2026-04-10 16:56:21 +09:00
이경숙
b059648cf0 Merge remote-tracking branch 'origin/master' 2026-04-10 16:37:10 +09:00
김현욱
e24049ae22 배송그룹 설정(조건부) 화면 수정 2026-04-10 16:16:30 +09:00
김현욱
b54c127330 젠킨스파일 점검페이지 웹 블록 설정 및 해제 추가 2026-04-10 16:03:44 +09:00
이대환
e40b140926 구독서비스 결제 - 결제취소 처리 후 재고 및 상태 변경 2026-04-10 15:45:29 +09:00
이대환
9d376958b7 구독서비스 결제 - 주문 상품 테이블 다중 Insert 적용 2026-04-09 11:27:53 +09:00
이경숙
e648e7462d 결제 - 키움결제 결제취소 관련 처리 2026-04-08 16:47:58 +09:00
이경숙
0bbd8e3891 Merge remote-tracking branch 'origin/master' 2026-04-08 16:45:21 +09:00
이대환
60ff733d4d 구독서비스 결제 - 결제 처리 후 재고 및 상태 변경 2026-04-08 14:44:42 +09:00
이대환
21115a9c34 Merge remote-tracking branch 'origin/master' 2026-04-08 09:54:58 +09:00
김현욱
946f1f9a95 화면타이틀 주문 > 마일리지 변경 2026-04-07 18:41:38 +09:00
김현욱
e567b3bbbc 상품 상세페이지 무료배송 표시 2026-04-07 16:57:56 +09:00
이대환
925282fa2b 구독서비스 - 키움 결제 적용 2026-04-07 10:21:22 +09:00
이대환
56b1f70ce9 Merge remote-tracking branch 'origin/master' 2026-04-07 09:48:06 +09:00
이경숙
30025eaaad 결제 - 키움결제 log삭제 2026-04-06 19:45:46 +09:00
이경숙
c776165df5 결제 - 키움결제 주문자명 PC인코딩 확인 2026-04-06 19:39:10 +09:00
이경숙
f9f561d05a Merge remote-tracking branch 'origin/master' 2026-04-06 19:35:40 +09:00
김현욱
105da88530 관리자 로고변경 추가 2026-04-06 18:49:02 +09:00
이대환
43d819d5a1 fix : 구독서비스 - 결제 처리 전 정합성 검사 2026-04-06 16:24:01 +09:00
이경숙
86c0b9cd10 Merge remote-tracking branch 'origin/master' 2026-04-06 14:43:08 +09:00
김현욱
cb4c9e6d97 defailt.css .product-badge 컬러 수정 2026-04-06 14:34:27 +09:00
김현욱
497545f730 무료배송에 개별배송 적용 2026-04-06 14:23:50 +09:00
이대환
8d4aa4277f Merge remote-tracking branch 'origin/master' 2026-04-03 09:50:03 +09:00
김현욱
936bfcb6a7 마일리지 '원' > '점'으로 수정 2026-04-02 17:48:41 +09:00
김현욱
92347d3304 무료배송 그룹에 개별배송 추가 2026-04-02 17:43:03 +09:00
이대환
eac94e1e2b fix : 관리자 구독서비스 등록 - 기본&판매정보 입력값 0 허용 2026-04-02 17:36:04 +09:00
이경숙
ccde39374d 결제 - 키움결제 주문자명 모바일 인코딩 확인4 2026-04-02 16:12:22 +09:00
이경숙
0f7938eec7 결제 - 키움결제 주문자명 모바일 인코딩 확인3 2026-04-02 15:58:30 +09:00
이경숙
ef4b40682a 결제 - 키움결제 주문자명 모바일 인코딩 확인2 2026-04-02 15:51:59 +09:00
이경숙
cbb31223f1 결제 - 키움결제 주문자명 모바일 인코딩 확인 2026-04-02 15:44:09 +09:00
이경숙
83aa30e4f5 결제 - 키움결제 모바일 적용 이동테스트 버전6 2026-04-02 15:12:30 +09:00
이경숙
ef37efc226 Merge remote-tracking branch 'origin/master' 2026-04-02 12:36:36 +09:00
이대환
e4fc054a78 fix : 쇼핑몰 배송지 관리 - 배송지 등록 팝업(모달) 크기 조절 2026-04-02 11:32:10 +09:00
이경숙
13fe17484d 결제 - 키움결제 모바일 적용 이동테스트 버전5 2026-04-01 19:24:51 +09:00
이경숙
9275c9189e 결제 - 키움결제 모바일 적용 이동테스트 버전4 2026-04-01 19:03:25 +09:00
이경숙
94f853d71d 결제 - 키움결제 모바일 적용 이동테스트 버전3 2026-04-01 18:54:52 +09:00
이경숙
80d8447eae 결제 - 키움결제 모바일 적용 이동테스트 버전2 2026-04-01 18:45:46 +09:00
이경숙
52f9c11244 결제 - 키움결제 모바일 적용 이동테스트 버전 2026-04-01 18:18:00 +09:00
이대환
9207d58b04 쇼핑몰 - 활성 환경(Active Profile)에 따른 타이틀 변경 2026-04-01 17:05:11 +09:00
이경숙
fd5fb1db80 결제 - 키움결제 모바일 적용 2026-04-01 17:04:45 +09:00
이대환
113bc9ffcc 통합 관리자 - 활성 환경(Active Profile)에 따른 타이틀 변경 2026-04-01 17:04:13 +09:00
이경숙
ac27213169 Merge remote-tracking branch 'origin/master' 2026-04-01 17:02:58 +09:00
이대환
371f1fa471 관리자 - 활성 환경(Active Profile)에 따른 타이틀 변경 2026-04-01 16:19:22 +09:00
이경숙
367ade4bad 결제 - 키움결제 매출전표에 키움 링크 추가 2026-04-01 15:35:38 +09:00
이대환
2e2bf59021 fix : 쇼핑몰 구독서비스 - 구독서비스 정보 조건부 숨김처리
fix : 관리자 구독서비스 수정 - 기본&판매정보 입력값 0 허용, 재고정책 변경 시 판매가능 재고수량 초기화
2026-04-01 15:14:24 +09:00
이경숙
4a91b40254 결제 - 키움결제 중간 결제창 삭제 2026-03-31 18:19:00 +09:00
이경숙
5ac14532e2 결제 - 키움결제 sitemid db 연결 2026-03-31 17:52:57 +09:00
이경숙
a434e3eade 결제 - 키움결제 무이자할부 수정 2026-03-31 16:37:54 +09:00
이경숙
9a61e308e1 결제 - 키움결제 승인날짜 수정 2026-03-31 16:27:25 +09:00
이경숙
2632b23056 결제 - 키움결제 적용 3차 2026-03-31 14:31:37 +09:00
이경숙
63b675f435 결제 - 키움결제 적용 2차 2026-03-30 18:35:06 +09:00
이대환
8fd58d80b0 개발환경 세팅 수정 2026-03-30 17:02:48 +09:00
이대환
955979b7d6 fix : 쇼핑몰 주문결제화면 - 배송지 정합성 검사(모바일) 2026-03-30 14:41:48 +09:00
김현욱
085ae7f2b4 개발환경 세팅 수정 2026-03-30 13:27:54 +09:00
이경숙
03193351cc Merge remote-tracking branch 'origin/master' 2026-03-27 18:34:43 +09:00
이경숙
8573a3e7a4 결제 - 키움결제 적용 1차 2026-03-27 18:34:29 +09:00
이대환
87efc0362e fix : 마이페이지 정보 조회 쿼리 개선 2026-03-27 15:31:02 +09:00
193 changed files with 10813 additions and 3632 deletions

View File

@@ -157,7 +157,8 @@ dependencies {
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")
implementation("io.jsonwebtoken:jjwt-jackson:0.11.5") implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")
// stripe
implementation "com.stripe:stripe-java:33.4.0"
} }
ext { ext {

View File

@@ -282,6 +282,9 @@ public class BOMaMtngService {
int useMlgAmt = Integer.parseInt(goodsList.get(0).getUseMlgAmt()); int useMlgAmt = Integer.parseInt(goodsList.get(0).getUseMlgAmt());
int useCashMlgAmt = Integer.parseInt(goodsList.get(0).getUseCashMlgAmt()); int useCashMlgAmt = Integer.parseInt(goodsList.get(0).getUseCashMlgAmt());
Set<String> validKeys = new HashSet<>(); // 변경 구매정보 리스트 Set<String> validKeys = new HashSet<>(); // 변경 구매정보 리스트
InventoryShortageMessage inventoryMessage = new InventoryShortageMessage();
Set<String> validationKeys = Arrays.stream(PurchsValidCode.values())
.map(PurchsValidCode::getCode).collect(Collectors.toSet());
//마일리지 잔액 확인 //마일리지 잔액 확인
BOMlgSrchVO mlgVo = new BOMlgSrchVO(); BOMlgSrchVO mlgVo = new BOMlgSrchVO();
@@ -317,12 +320,14 @@ public class BOMaMtngService {
// 값이 1인 항목 == 변경항목 // 값이 1인 항목 == 변경항목
List<String> rs = resultValid.stream() List<String> rs = resultValid.stream()
.flatMap(map -> map.entrySet().stream()) .flatMap(map -> map.entrySet().stream())
.filter(entry -> validationKeys.contains(entry.getKey()))
.filter(entry -> "1".equals(StringUtil.isNullToString(entry.getValue()))) .filter(entry -> "1".equals(StringUtil.isNullToString(entry.getValue())))
.map(entry -> StringUtil.isNullToString(entry.getKey())) .map(entry -> StringUtil.isNullToString(entry.getKey()))
.toList(); .toList();
//구매정보 변경유형 저장 //구매정보 변경유형 저장
validKeys.addAll(rs); validKeys.addAll(rs);
inventoryMessage.add(goods, resultValid);
} }
@@ -338,7 +343,9 @@ public class BOMaMtngService {
StringBuilder returnMsg = new StringBuilder(); StringBuilder returnMsg = new StringBuilder();
//상품구매수량제한걸렸을 경우 //상품구매수량제한걸렸을 경우
if(validKeys.contains("purchsQyLmtt")){ if (inventoryMessage.hasShortages()) {
returnMsg.append(inventoryMessage.render());
}else if(validKeys.contains("purchsQyLmtt")){
returnMsg.append("구매수량 제한 상품입니다."); returnMsg.append("구매수량 제한 상품입니다.");
returnMsg.append(System.lineSeparator()); //줄바꿈 returnMsg.append(System.lineSeparator()); //줄바꿈
@@ -519,6 +526,8 @@ public class BOMaMtngService {
BOPreOrderValidVO.builder() BOPreOrderValidVO.builder()
.sopmalCd(StringUtil.isNullToString(goods.get("sopmalCd"))) .sopmalCd(StringUtil.isNullToString(goods.get("sopmalCd")))
.goodsInnb(StringUtil.isNullToString(goods.get("goodsInnb"))) .goodsInnb(StringUtil.isNullToString(goods.get("goodsInnb")))
.goodsNm(StringUtil.isNullToString(goods.get("goodsNm")))
.optionNm(StringUtil.isNullToString(goods.get("option")))
.goodsOptnInnb(StringUtil.isNullToString(goods.get("goodsOptnInnb"))) .goodsOptnInnb(StringUtil.isNullToString(goods.get("goodsOptnInnb")))
.subsvcInnb(StringUtil.isNullToString(goods.get("subsvcInnb"))) .subsvcInnb(StringUtil.isNullToString(goods.get("subsvcInnb")))
.mbrInnb(StringUtil.isNullToString(goods.get("mbrInnb"))) .mbrInnb(StringUtil.isNullToString(goods.get("mbrInnb")))

View File

@@ -0,0 +1,103 @@
package com.wb.domainserver.domain.admin.instcSle.mtng.service;
import com.wb.domainserver.domain.admin.instcSle.mtng.vo.BOPreOrderValidVO;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.springframework.util.StringUtils;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** 재고 판정은 변경하지 않고 조회된 재고 수량으로 안내문만 구성한다. */
final class InventoryShortageMessage {
private final Map<String, Goods> goodsById = new LinkedHashMap<>();
void add(BOPreOrderValidVO request, List<DataMap> rows) {
if (rows.isEmpty()) {
return;
}
boolean subscription = StringUtils.hasText(request.getSubsvcInnb());
String key = request.getSopmalCd() + ":" + (subscription
? "subscription:" + request.getSubsvcInnb() : "goods:" + request.getGoodsInnb());
Goods goods = goodsById.computeIfAbsent(key, ignored -> new Goods());
goods.name = StringUtils.hasText(request.getGoodsNm()) ? request.getGoodsNm()
: "상품번호 " + request.getGoodsInnb();
goods.requested = request.getGoodsTotalQy();
goods.unit = "SK".equals(request.getSopmalCd()) ? "병" : "개";
String optionKey = subscription ? request.getSubsvcInnb() : request.getGoodsOptnInnb();
Option option = goods.options.computeIfAbsent(optionKey, ignored -> new Option());
option.name = StringUtils.hasText(request.getOptionNm()) ? request.getOptionNm()
: "옵션번호 " + request.getGoodsOptnInnb();
option.requested += Long.parseLong(request.getQy());
for (DataMap row : rows) {
if (row.get("stockGoodsNm") != null && StringUtils.hasText(row.get("stockGoodsNm").toString())) {
goods.name = String.valueOf(row.get("stockGoodsNm"));
}
goods.shortage |= "1".equals(String.valueOf(row.get("invntry")))
|| "1".equals(String.valueOf(row.get("invntryPolicy")));
option.available = minimum(option.available, row.get("optionAvailableQy"));
goods.available = minimum(goods.available, row.get("goodsAvailableQy"));
}
}
boolean hasShortages() {
return goodsById.values().stream().anyMatch(goods -> goods.shortage);
}
String render() {
StringBuilder message = new StringBuilder("다음 상품의 구매 가능한 재고가 부족합니다.");
boolean sharedLimit = false;
for (Goods goods : goodsById.values()) {
if (!goods.shortage) {
continue;
}
message.append("\n\n· ").append(goods.name);
if (goods.options.size() == 1) {
Option option = goods.options.values().iterator().next();
message.append("\n 주문 수량: ").append(goods.requested)
.append(goods.unit).append(" / 현재 구매 가능: ")
.append(quantity(minimum(option.available, goods.available), goods.unit));
} else {
sharedLimit = true;
message.append("\n 총 주문 수량: ").append(goods.requested)
.append(goods.unit).append(" / 상품 전체 재고 한도: ").append(quantity(goods.available, goods.unit));
for (Option option : goods.options.values()) {
message.append("\n - ").append(option.name).append(": 주문 ")
.append(option.requested).append(goods.unit).append(" / 옵션별 구매 가능 ")
.append(quantity(minimum(option.available, goods.available), goods.unit));
}
}
}
if (sharedLimit) {
message.append("\n\n옵션별 가능 수량은 상품 전체 재고 한도 안에서 함께 적용됩니다.");
}
return message.append("\n\n주문 수량을 줄이거나 해당 상품을 제외한 후 다시 주문해 주세요.").toString();
}
private static Long minimum(Long current, Object value) {
if (value == null) {
return current;
}
long quantity = Math.max(0L, Long.parseLong(value.toString()));
return current == null ? quantity : Math.min(current, quantity);
}
private static String quantity(Long value, String unit) {
return value == null ? "확인 불가" : value + unit;
}
private static final class Goods {
String name;
String unit;
long requested;
Long available;
boolean shortage;
final Map<String, Option> options = new LinkedHashMap<>();
}
private static final class Option {
String name;
long requested;
Long available;
}
}

View File

@@ -21,6 +21,10 @@ public class BOPreOrderValidVO {
/*상품고유번호*/ /*상품고유번호*/
private String goodsInnb; private String goodsInnb;
private String goodsNm;
private String optionNm;
/*상품옵션고유번호*/ /*상품옵션고유번호*/
private String goodsOptnInnb; private String goodsOptnInnb;

View File

@@ -3,13 +3,13 @@ package com.wb.domainserver.domain.admin.store.sopmal.mapper;
import java.util.List; import java.util.List;
import com.wb.domainserver.domain.admin.store.sopmal.vo.Shop; import com.wb.domainserver.domain.admin.store.sopmal.vo.Shop;
import com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO;
import com.wb.domainserver.domain.gcone.promtn.coupon.vo.BOCouponVO; import com.wb.domainserver.domain.gcone.promtn.coupon.vo.BOCouponVO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO; import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOShopSetupVO; import com.wb.domainserver.domain.admin.store.sopmal.vo.BOShopSetupVO;
import com.wb.domainserver.domain.admin.sys.menu.vo.BOMaMenuVO;
import com.wb.domainserver.util.dataaccess.DataMap; import com.wb.domainserver.util.dataaccess.DataMap;
/** /**
@@ -81,6 +81,10 @@ public interface BOMaSopmalMapper {
public int updateBOSopmalUpdt(BOMaSopmalVO vo); public int updateBOSopmalUpdt(BOMaSopmalVO vo);
public int updateBOExchngrtSetup(BOMaSopmalVO vo);
public int updateBOGuidanceSetup(BOMaSopmalVO vo);
public int deteteBOShopFamilySite(BOMaSopmalVO vo); public int deteteBOShopFamilySite(BOMaSopmalVO vo);
public int deteteBOShopClause(BOMaSopmalVO vo); public int deteteBOShopClause(BOMaSopmalVO vo);
@@ -199,4 +203,7 @@ public interface BOMaSopmalMapper {
/*전체 쇼핑몰 목록*/ /*전체 쇼핑몰 목록*/
List<DataMap> selectSopmalList(); List<DataMap> selectSopmalList();
// XML 수정 임시
public List<DataMap> selectSitemapXml(String sopmalCd);
} }

View File

@@ -19,6 +19,7 @@ import com.wb.domainserver.domain.admin.sys.menu.vo.BOMaMenuVO;
import com.wb.domainserver.domain.gcone.goods.goodsinfo.mapper.BOGoodsinfoMapper; import com.wb.domainserver.domain.gcone.goods.goodsinfo.mapper.BOGoodsinfoMapper;
import com.wb.domainserver.domain.gcone.goods.goodsinfo.vo.BOGoodsInfoVO; import com.wb.domainserver.domain.gcone.goods.goodsinfo.vo.BOGoodsInfoVO;
import lombok.Data; import lombok.Data;
import org.apache.commons.text.StringEscapeUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -842,6 +843,7 @@ public class BOMaSopmalService {
mapping.put("memor", "MEMOR_USE_AT"); mapping.put("memor", "MEMOR_USE_AT");
mapping.put("npay", "NPAY_USE_AT"); mapping.put("npay", "NPAY_USE_AT");
mapping.put("kpay", "KPAY_USE_AT"); mapping.put("kpay", "KPAY_USE_AT");
mapping.put("stripe", "STRIPE_USE_AT");
// 모든 매핑된 값의 기본값을 "N"으로 설정 // 모든 매핑된 값의 기본값을 "N"으로 설정
for (String key : mapping.values()) { for (String key : mapping.values()) {
@@ -984,4 +986,43 @@ public class BOMaSopmalService {
return mapper.selectSopmalList(); return mapper.selectSopmalList();
} }
/**
* 사이트맵 XML
* @param sopmalCd
* @return
*/
@Transactional
public String selectSitemapXml(String sopmalCd) {
List<DataMap> resultList = new ArrayList<>();
StringBuilder xml = new StringBuilder();
try {
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
xml.append("<?xml-stylesheet type=\"text/css\" href=\"https://www.xml-sitemaps.com/css/sitemap.css\"?>");
xml.append("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\n");
resultList = mapper.selectSitemapXml(sopmalCd);
for (DataMap data : resultList) {
xml.append(" <url>");
xml.append(" <loc>")
.append(StringEscapeUtils.escapeXml11(String.valueOf(data.get("targetUrl"))))
.append("</loc>");
xml.append(" <lastmod>")
.append(StringEscapeUtils.escapeXml11(String.valueOf(data.get("lastModified"))))
.append("</lastmod>");
xml.append(" <priority>")
.append(StringEscapeUtils.escapeXml11(String.valueOf(data.get("priority"))))
.append("</priority>");
xml.append(" </url>");
}
xml.append("</urlset>");
} catch (WnbtRestException wre){
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return xml.toString();
}
} }

View File

@@ -393,6 +393,7 @@ public class BOBbsService {
if (vo.getBbscttRedngAuthorDvCd() != null && "01".equals(vo.getBbscttRedngAuthorDvCd())) { if (vo.getBbscttRedngAuthorDvCd() != null && "01".equals(vo.getBbscttRedngAuthorDvCd())) {
vo.setBbscttRedngAuthorDvCd("[all]"); vo.setBbscttRedngAuthorDvCd("[all]");
} else if (vo.getBbscttRedngAuthorDvCd() != null && "02".equals(vo.getBbscttRedngAuthorDvCd())) { } else if (vo.getBbscttRedngAuthorDvCd() != null && "02".equals(vo.getBbscttRedngAuthorDvCd())) {
validateMemberGradeSelection(vo.getBbscttRedngAuthorDvCd_c(), "게시판 읽기");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getBbscttRedngAuthorDvCd_c()) { for (String mbrInnb : vo.getBbscttRedngAuthorDvCd_c()) {
@@ -431,6 +432,8 @@ public class BOBbsService {
if (vo.getBbscttRegistAuthorDvCd() != null && "01".equals(vo.getBbscttRegistAuthorDvCd())) { if (vo.getBbscttRegistAuthorDvCd() != null && "01".equals(vo.getBbscttRegistAuthorDvCd())) {
vo.setBbscttRegistAuthorDvCd("[all]"); vo.setBbscttRegistAuthorDvCd("[all]");
} else if (vo.getBbscttRegistAuthorDvCd() != null && "02".equals(vo.getBbscttRegistAuthorDvCd())) { } else if (vo.getBbscttRegistAuthorDvCd() != null && "02".equals(vo.getBbscttRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getBbscttRegistAuthorDvCd_c(), "게시판 쓰기");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getBbscttRegistAuthorDvCd_c()) { for (String mbrInnb : vo.getBbscttRegistAuthorDvCd_c()) {
@@ -465,6 +468,8 @@ public class BOBbsService {
if (vo.getAnswRegistAuthorDvCd() != null && "01".equals(vo.getAnswRegistAuthorDvCd())) { if (vo.getAnswRegistAuthorDvCd() != null && "01".equals(vo.getAnswRegistAuthorDvCd())) {
vo.setAnswRegistAuthorDvCd("[all]"); vo.setAnswRegistAuthorDvCd("[all]");
} else if (vo.getAnswRegistAuthorDvCd() != null && "02".equals(vo.getAnswRegistAuthorDvCd())) { } else if (vo.getAnswRegistAuthorDvCd() != null && "02".equals(vo.getAnswRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getAnswRegistAuthorDvCd_c(), "답글 쓰기");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getAnswRegistAuthorDvCd_c()) { for (String mbrInnb : vo.getAnswRegistAuthorDvCd_c()) {
@@ -499,6 +504,8 @@ public class BOBbsService {
if (vo.getCmRegistAuthorDvCd() != null && "01".equals(vo.getCmRegistAuthorDvCd())) { if (vo.getCmRegistAuthorDvCd() != null && "01".equals(vo.getCmRegistAuthorDvCd())) {
vo.setCmRegistAuthorDvCd("[all]"); vo.setCmRegistAuthorDvCd("[all]");
} else if (vo.getCmRegistAuthorDvCd() != null && "02".equals(vo.getCmRegistAuthorDvCd())) { } else if (vo.getCmRegistAuthorDvCd() != null && "02".equals(vo.getCmRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getCmRegistAuthorDvCd_c(), "댓글 쓰기");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getCmRegistAuthorDvCd_c()) { for (String mbrInnb : vo.getCmRegistAuthorDvCd_c()) {
@@ -685,15 +692,21 @@ public class BOBbsService {
msgMap.put("bbsid", bbsId); msgMap.put("bbsid", bbsId);
} catch (WnbtRestException wre){ } catch (WnbtRestException wre){
throw new WnbtRestException(wre.getMessage()); throw wre;
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
throw new WnbtRestException("게시판 등록 중 오류가 발생했습니다.", e);
} }
return msgMap; return msgMap;
} }
private void validateMemberGradeSelection(String[] memberGradeArr, String authorizationName) {
if (memberGradeArr == null || memberGradeArr.length == 0) {
throw new WnbtRestException(authorizationName + " 권한의 회원등급을 선택해 주세요.");
}
}
/** /**
* 게시판 삭제 * 게시판 삭제

View File

@@ -570,19 +570,11 @@ public class BOGnrlbbscttService {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
// 게시글 연관상품 조회 // 게시글 연관상품 조회
List<DataMap> goodsList = new ArrayList<>(); List<DataMap> goodsList = new ArrayList<>();
DataMap result = new DataMap();
goodsList = mapper.selectBOBbscttDtlGoods(bbsctt); goodsList = mapper.selectBOBbscttDtlGoods(bbsctt);
/*게시판 설정 > 추천 상품 노출 선택 시 사용자 게시글 상세 상품 노출 */
if (!goodsList.isEmpty()) {
if ("sopmal".equals(bbsctt.getServerDv())) {
result = goodsService.selectBoGoodsRelateList(goodsList);
}
}
/*사용자 , 관리자 페이지 구분*/ /*사용자 , 관리자 페이지 구분*/
if ("sopmal".equals(bbsctt.getServerDv())) { if ("sopmal".equals(bbsctt.getServerDv())) {
map.put("goodsList", result); map.put("goodsList", goodsList);
} else { } else {
map.put("goodsList", goodsList); map.put("goodsList", goodsList);
} }
@@ -920,6 +912,7 @@ public class BOGnrlbbscttService {
throw new WnbtRestException(wre.getMessage()); throw new WnbtRestException(wre.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
throw new WnbtRestException("게시글 등록 중 오류가 발생했습니다.", e);
} }
return message; return message;
@@ -1106,7 +1099,7 @@ public class BOGnrlbbscttService {
} }
} }
/*1:1 문의 게시판이 아닌경우만 처리 */ /*1:1 문의 게시판이 아닌경우만 처리 */
if("12".equals(bbsctt.getBbsTyCd())){ if(!"12".equals(bbsctt.getBbsTyCd())){
//게시글 연관 상품 삭제 //게시글 연관 상품 삭제
mapper.deleteBOBbscttGoods(bbsctt); mapper.deleteBOBbscttGoods(bbsctt);
//게시글 연관 상품 등록(fm_boarddata_goods) //게시글 연관 상품 등록(fm_boarddata_goods)
@@ -1137,6 +1130,7 @@ public class BOGnrlbbscttService {
throw new WnbtRestException(wre.getMessage()); throw new WnbtRestException(wre.getMessage());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
throw new WnbtRestException("게시글 수정 중 오류가 발생했습니다.", e);
} }
return message; return message;

View File

@@ -75,6 +75,8 @@ public class BOGnrlbbscttVO extends AbstractVO {
@Length(max = 16777215, message = "내용") @Length(max = 16777215, message = "내용")
/** 내용 */ /** 내용 */
private String cn; private String cn;
/** 내용 */
private String relateGoodsWords;
/** 조회건수 */ /** 조회건수 */
private Integer inqireCnt; private Integer inqireCnt;
/** 댓글건수 */ /** 댓글건수 */

View File

@@ -47,6 +47,9 @@ public class BOCommonService {
@Value("${secret.key}") @Value("${secret.key}")
private String secretKey; private String secretKey;
@Value("${aciexpress.apikey}")
private String aciApiKey;
/** /**
* <p>비밀번호를 암호화 한다</p> * <p>비밀번호를 암호화 한다</p>
* *
@@ -287,4 +290,10 @@ public class BOCommonService {
return secretKey; return secretKey;
} }
/**
* aci Api키 조회
* @return String
*/
public String selectAciApiKey() {return aciApiKey;}
} }

View File

@@ -0,0 +1,17 @@
package com.wb.domainserver.domain.gcone.goods.badge.mapper;
import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface BOGoodsBadgeMapper {
List<DataMap> selectBOGoodsBadgeList(BOGoodsBadgeVO vo);
int selectBOGoodsBadgeCount(BOGoodsBadgeVO vo);
int insertBOGoodsBadge(BOGoodsBadgeVO vo);
int updateBOGoodsBadge(BOGoodsBadgeVO vo);
}

View File

@@ -0,0 +1,113 @@
package com.wb.domainserver.domain.gcone.goods.badge.service;
import com.wb.domainserver.domain.gcone.goods.badge.mapper.BOGoodsBadgeMapper;
import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
@Service
public class BOGoodsBadgeService {
private static final Pattern COLOR_PATTERN = Pattern.compile("^#[0-9A-Fa-f]{6}$");
private static final Pattern BADGE_CODE_PATTERN = Pattern.compile("^[A-Za-z0-9_-]+$");
@Autowired
private BOGoodsBadgeMapper mapper;
public List<DataMap> selectBOGoodsBadgeList(BOGoodsBadgeVO vo) {
return mapper.selectBOGoodsBadgeList(vo);
}
@Transactional
public DataMap updateBOGoodsBadgeSetup(BOGoodsBadgeVO request) {
DataMap message = new DataMap();
String[] badgeCdArr = request.getBadgeCdArr();
if (badgeCdArr == null || badgeCdArr.length == 0) {
message.put("result", "success");
return message;
}
validateArrayLengths(request, badgeCdArr.length);
Set<String> newBadgeCodes = new HashSet<>();
for (int i = 0; i < badgeCdArr.length; i++) {
BOGoodsBadgeVO badge = createBadge(request, i);
validateBadge(badge);
if ("Y".equals(badge.getNewAt())) {
if (!newBadgeCodes.add(badge.getBadgeCd()) || mapper.selectBOGoodsBadgeCount(badge) > 0) {
throw new WnbtRestException("이미 등록된 배지코드입니다.");
}
mapper.insertBOGoodsBadge(badge);
} else {
if (!badge.getBadgeCd().equals(trim(request.getOriginalBadgeCdArr()[i]))) {
throw new WnbtRestException("기존 배지코드는 변경할 수 없습니다.");
}
if (mapper.selectBOGoodsBadgeCount(badge) == 0) {
throw new WnbtRestException("존재하지 않는 배지코드입니다.");
}
mapper.updateBOGoodsBadge(badge);
}
}
message.put("result", "success");
return message;
}
private void validateArrayLengths(BOGoodsBadgeVO vo, int size) {
if (vo.getOriginalBadgeCdArr() == null || vo.getBadgeNmArr() == null || vo.getFontColorArr() == null || vo.getBgColorArr() == null
|| vo.getBorderColorArr() == null || vo.getSortOrdrArr() == null || vo.getUseAtArr() == null
|| vo.getNewAtArr() == null || vo.getOriginalBadgeCdArr().length != size || vo.getBadgeNmArr().length != size || vo.getFontColorArr().length != size
|| vo.getBgColorArr().length != size || vo.getBorderColorArr().length != size
|| vo.getSortOrdrArr().length != size || vo.getUseAtArr().length != size || vo.getNewAtArr().length != size) {
throw new WnbtRestException("배지 저장 요청 값이 올바르지 않습니다.");
}
}
private BOGoodsBadgeVO createBadge(BOGoodsBadgeVO request, int index) {
BOGoodsBadgeVO badge = new BOGoodsBadgeVO();
badge.setSopmalCd(request.getSopmalCd());
badge.setRegusr(request.getRegusr());
badge.setUpdusr(request.getUpdusr());
badge.setBadgeCd(trim(request.getBadgeCdArr()[index]));
badge.setBadgeNm(trim(request.getBadgeNmArr()[index]));
badge.setFontColor(trim(request.getFontColorArr()[index]));
badge.setBgColor(trim(request.getBgColorArr()[index]));
badge.setBorderColor(trim(request.getBorderColorArr()[index]));
badge.setSortOrdr(trim(request.getSortOrdrArr()[index]));
badge.setUseAt(trim(request.getUseAtArr()[index]));
badge.setNewAt(trim(request.getNewAtArr()[index]));
return badge;
}
private void validateBadge(BOGoodsBadgeVO badge) {
if (!StringUtils.hasText(badge.getBadgeCd()) || ("Y".equals(badge.getNewAt()) && !BADGE_CODE_PATTERN.matcher(badge.getBadgeCd()).matches())) {
throw new WnbtRestException("배지코드는 영문, 숫자, 밑줄, 하이픈만 입력할 수 있습니다.");
}
if (!StringUtils.hasText(badge.getBadgeNm()) || !COLOR_PATTERN.matcher(badge.getFontColor()).matches()
|| !COLOR_PATTERN.matcher(badge.getBgColor()).matches() || !COLOR_PATTERN.matcher(badge.getBorderColor()).matches()) {
throw new WnbtRestException("배지명과 색상값을 확인해 주세요.");
}
try {
if (Integer.parseInt(badge.getSortOrdr()) < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
throw new WnbtRestException("노출순서는 0 이상의 정수만 입력할 수 있습니다.");
}
if (!("Y".equals(badge.getUseAt()) || "N".equals(badge.getUseAt()))
|| !("Y".equals(badge.getNewAt()) || "N".equals(badge.getNewAt()))) {
throw new WnbtRestException("배지 저장 요청 값이 올바르지 않습니다.");
}
}
private String trim(String value) {
return value == null ? "" : value.trim();
}
}

View File

@@ -0,0 +1,28 @@
package com.wb.domainserver.domain.gcone.goods.badge.vo;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class BOGoodsBadgeVO extends AbstractVO {
private String sopmalCd;
private String badgeCd;
private String badgeNm;
private String fontColor;
private String bgColor;
private String borderColor;
private String sortOrdr;
private String newAt;
private String[] badgeCdArr;
private String[] originalBadgeCdArr;
private String[] badgeNmArr;
private String[] fontColorArr;
private String[] bgColorArr;
private String[] borderColorArr;
private String[] sortOrdrArr;
private String[] useAtArr;
private String[] newAtArr;
}

View File

@@ -34,6 +34,8 @@ public interface BOGoodsMapper {
public Integer selectBOGoodsCount(BOGoodsVO vo); public Integer selectBOGoodsCount(BOGoodsVO vo);
// 일반 상품 목록 리스트 // 일반 상품 목록 리스트
public List<DataMap> selectBOGoodsList(BOGoodsVO vo); public List<DataMap> selectBOGoodsList(BOGoodsVO vo);
// 관리자 상품 배지 목록
public List<DataMap> selectBOGoodsBadgeList(BOGoodsVO vo);
// 카테고리별 상품 목록 수정 // 카테고리별 상품 목록 수정
public void updateBOCtgryGoodsList(BOGoodsVO vo); public void updateBOCtgryGoodsList(BOGoodsVO vo);
// 관리자 > 일반 상품 상세 // 관리자 > 일반 상품 상세
@@ -85,6 +87,8 @@ public interface BOGoodsMapper {
public void updateBOGoodsAdditionDtl(BOGoodsAdditionVO vo); public void updateBOGoodsAdditionDtl(BOGoodsAdditionVO vo);
// 일반 상품 > 추가정보 삭제 // 일반 상품 > 추가정보 삭제
public void deleteBOGoodsAddition(BOGoodsAdditionVO vo); public void deleteBOGoodsAddition(BOGoodsAdditionVO vo);
// 사용자 - 검색 - 검색어 로그 저장
public int insertBOSrchwrdLog(BOGoodsVO vo);
// 사용자 - 검색 - 상품명 검색어 조회 // 사용자 - 검색 - 상품명 검색어 조회
public List<DataMap> selectBOSrchGoodsNm(BOGoodsVO vo); public List<DataMap> selectBOSrchGoodsNm(BOGoodsVO vo);
// 일반 상품 > 일괄 업데이트 // 일반 상품 > 일괄 업데이트

View File

@@ -7,6 +7,7 @@ import com.wb.domainserver.domain.gcone.common.service.BOCommonService;
import com.wb.domainserver.domain.gcone.goods.goods.mapper.BOGoodsMapper; import com.wb.domainserver.domain.gcone.goods.goods.mapper.BOGoodsMapper;
import com.wb.domainserver.domain.gcone.goods.goods.vo.*; import com.wb.domainserver.domain.gcone.goods.goods.vo.*;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap; import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil; import com.wb.domainserver.util.string.StringUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -16,6 +17,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.io.File; import java.io.File;
import java.math.BigInteger; import java.math.BigInteger;
@@ -74,6 +76,15 @@ public class BOGoodsService {
return resultList; return resultList;
} }
/**
* 관리자 상품 배지 목록 조회
* @param vo
* @return
*/
public List<DataMap> selectBOGoodsBadgeList(BOGoodsVO vo) {
return mapper.selectBOGoodsBadgeList(vo);
}
/** /**
* 사용자 > 상품 목록 조회 * 사용자 > 상품 목록 조회
* @param vo * @param vo
@@ -1505,6 +1516,27 @@ public class BOGoodsService {
return mapper.selectBOGoodsCategoryLink(vo); return mapper.selectBOGoodsCategoryLink(vo);
} }
/**
* 검색어 로그 저장
* @param vo
* @return
*/
public DataMap insertBOSrchwrdLog(BOGoodsVO vo){
DataMap message = new DataMap();
try {
mapper.insertBOSrchwrdLog(vo);
message.put("result", "success");
} catch (WnbtRestException wre) {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
/** /**
* 상품명 검색어 조회 * 상품명 검색어 조회
* @param vo * @param vo

View File

@@ -47,6 +47,10 @@ public class BOGoodsOptionVO extends AbstractVO {
private String optnCd4; private String optnCd4;
/** 옵션정보 */ /** 옵션정보 */
private String optnInfo; private String optnInfo;
/** HS Code */
private String hscode;
/** 실무게(KG) */
private String realWt;
/** 재고수량 */ /** 재고수량 */
private String invntryQy; private String invntryQy;
/** 가용재고수량 */ /** 가용재고수량 */

View File

@@ -41,6 +41,9 @@ public class BOGoodsVO extends AbstractVO {
/** 상품명 */ /** 상품명 */
@NotBlank(message = "상품명") @NotBlank(message = "상품명")
private String goodsNm; private String goodsNm;
/** 상품명(영문) */
@NotBlank(message = "상품명(영문)")
private String goodsNmEn;
/** 입점상품명 */ /** 입점상품명 */
private String tentMarktGoodsNm; private String tentMarktGoodsNm;
/** ? */ /** ? */
@@ -220,6 +223,10 @@ public class BOGoodsVO extends AbstractVO {
private String optnCd4; private String optnCd4;
/** 옵션정보 */ /** 옵션정보 */
private String optnInfo; private String optnInfo;
/** HS Code */
private String hscode;
/** 실무게(KG) */
private String realWt;
/** 재고수량 */ /** 재고수량 */
private Integer invntryQy; private Integer invntryQy;
/** 가용재고수량 */ /** 가용재고수량 */
@@ -478,6 +485,10 @@ public class BOGoodsVO extends AbstractVO {
private String srchType; private String srchType;
/** 검색어 */ /** 검색어 */
private String srchStr; private String srchStr;
/** 유입경로 */
private String conectUrl;
/** 유입경로 도메인 */
private String conectDomn;
/** 선택 삭제 */ /** 선택 삭제 */
private List<HashMap<String, Object>> delInnbArr; private List<HashMap<String, Object>> delInnbArr;
/** 이미지 파일 업로드 */ /** 이미지 파일 업로드 */

View File

@@ -7,6 +7,8 @@ import com.wb.domainserver.domain.gcone.bbs.cnslt.vo.BOCnsltVO;
import com.wb.domainserver.domain.gcone.common.service.BOCommonService; import com.wb.domainserver.domain.gcone.common.service.BOCommonService;
import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.*; import com.wb.domainserver.domain.gcone.goods.purchs.vo.*;
import com.wb.domainserver.domain.gcone.goods.subsvc.service.BOSubsvcService;
import com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.mapper.BOOrdrMapper; import com.wb.domainserver.domain.gcone.ordr.ordr.mapper.BOOrdrMapper;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrderRestAmtVO; import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrderRestAmtVO;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
@@ -51,6 +53,9 @@ public class BOOrderService {
@Autowired @Autowired
private BOOrderNoService orderNoService; private BOOrderNoService orderNoService;
@Autowired
private BOSubsvcService subsvcService;
/** /**
* 관리자 주문 > 주문 등록 * 관리자 주문 > 주문 등록
* @param param * @param param
@@ -466,7 +471,7 @@ public class BOOrderService {
dlvylcListMulti.add(dlvyMap); dlvylcListMulti.add(dlvyMap);
} else { // if ("02".equals(itemDlvyGroupDvCd)) { // 무료 배송일 경우 } else { //if ("02".equals(itemDlvyGroupDvCd)) { // 무료 배송일 경우
// 추가배송비 계산 (MUL) // 추가배송비 계산 (MUL)
if (!StringUtils.isEmpty(itemDlvyAreaAditAt) && "Y".equals(itemDlvyAreaAditAt)) { if (!StringUtils.isEmpty(itemDlvyAreaAditAt) && "Y".equals(itemDlvyAreaAditAt)) {
@@ -976,6 +981,10 @@ public class BOOrderService {
***************************************** */ ***************************************** */
BOOrderSetleVO setleVO = insertSetle(orderVO, setle, insertedGoodsList, enuri, purchsr); // 결제 정보 등록 BOOrderSetleVO setleVO = insertSetle(orderVO, setle, insertedGoodsList, enuri, purchsr); // 결제 정보 등록
if (orderVO.getSubsvcInnb() == null && "stripe".equals(setleVO.getPgCmpnyNm())) {
setleVO.setGoodsNm(buildStripeGoodsName(insertedGoodsList.get(0).getGoodsNm(), goodsList));
}
// 결제금액 원화로 변경 // 결제금액 원화로 변경
// setleVO.setSetleAmt(setleVO.getWonSetleAmt()); // setleVO.setSetleAmt(setleVO.getWonSetleAmt());
@@ -987,6 +996,13 @@ public class BOOrderService {
return content; return content;
} }
static String buildStripeGoodsName(String firstGoodsName, List<LinkedHashMap> goodsList) {
long totalQuantity = goodsList.stream()
.mapToLong(goods -> ((Number) goods.get("qy")).longValue())
.sum();
return totalQuantity > 1 ? firstGoodsName + " 외 " + (totalQuantity - 1) + "병" : firstGoodsName;
}
@Transactional @Transactional
public void insertCnsltMemo(String sopmalCd, BigInteger ordrInnb, LinkedHashMap purchsr, LinkedHashMap enuri, AnonymousUser user) { public void insertCnsltMemo(String sopmalCd, BigInteger ordrInnb, LinkedHashMap purchsr, LinkedHashMap enuri, AnonymousUser user) {
try{ try{
@@ -1094,6 +1110,7 @@ public class BOOrderService {
itemVO.setGoodsKndCd((String) goods.get("goodsKndCd")); itemVO.setGoodsKndCd((String) goods.get("goodsKndCd"));
itemVO.setGoodsImgCours((String) goods.get("goodsImgWithoutHostImage")); itemVO.setGoodsImgCours((String) goods.get("goodsImgWithoutHostImage"));
itemVO.setGoodsNm((String) goods.get("goodsNm")); itemVO.setGoodsNm((String) goods.get("goodsNm"));
itemVO.setGoodsNmEn((String) goods.get("goodsNmEn"));
itemVO.setTaxtTrgetAt((String) goods.get("taxtTrgetAt")); itemVO.setTaxtTrgetAt((String) goods.get("taxtTrgetAt"));
itemVO.setSubscrptWthdrawPosblAt((String) goods.get("subscrptWthdrawPosblAt")); itemVO.setSubscrptWthdrawPosblAt((String) goods.get("subscrptWthdrawPosblAt"));
itemVO.setIndvdlzCanclPosblAt((String) goods.get("indvdlzCanclPosblAt")); itemVO.setIndvdlzCanclPosblAt((String) goods.get("indvdlzCanclPosblAt"));
@@ -1230,7 +1247,16 @@ public class BOOrderService {
String goodsNm = ""; String goodsNm = "";
if (insertedGoodsList.size() > 1) { if (orderVO.getSubsvcInnb() != null) {
BOSubsvcVO subscription = new BOSubsvcVO();
subscription.setSopmalCd(sopmalCd);
subscription.setSubsvcInnb(orderVO.getSubsvcInnb().toString());
DataMap detail = subsvcService.selectBOSubsvcDetail(subscription);
goodsNm = detail == null ? "" : StringUtil.isNullToString(detail.get("subsvcNm"));
if (!StringUtils.hasText(goodsNm)) {
throw new WnbtRestException("구독서비스명을 확인할 수 없습니다. 다시 시도해 주세요.");
}
} else if (insertedGoodsList.size() > 1) {
goodsNm = insertedGoodsList.get(0).getGoodsNm() + " 외" + (insertedGoodsList.size() - 1); goodsNm = insertedGoodsList.get(0).getGoodsNm() + " 외" + (insertedGoodsList.size() - 1);
} else { } else {
goodsNm = insertedGoodsList.get(0).getGoodsNm(); goodsNm = insertedGoodsList.get(0).getGoodsNm();
@@ -1922,6 +1948,10 @@ public class BOOrderService {
itemOptnVO.setOptnCd2((String) goodsOptn.get("optnCd2")); itemOptnVO.setOptnCd2((String) goodsOptn.get("optnCd2"));
itemOptnVO.setOptnCd3((String) goodsOptn.get("optnCd3")); itemOptnVO.setOptnCd3((String) goodsOptn.get("optnCd3"));
itemOptnVO.setOptnCd4((String) goodsOptn.get("optnCd4")); itemOptnVO.setOptnCd4((String) goodsOptn.get("optnCd4"));
itemOptnVO.setHscode((String) goodsOptn.get("hscode"));
itemOptnVO.setRealWt((BigDecimal) goodsOptn.get("realWt"));
itemOptnVO.setVolWt((BigInteger) goodsOptn.get("volWt"));
itemOptnVO.setPackageCnt((Integer) goodsOptn.get("packageCnt"));
itemOptnVO.setOptnInfo((String) goodsOptn.get("optnInfo")); itemOptnVO.setOptnInfo((String) goodsOptn.get("optnInfo"));
itemOptnVO.setCnsmrpric((BigDecimal) goodsOptn.get("cnsmrpric")); // 소비자가 itemOptnVO.setCnsmrpric((BigDecimal) goodsOptn.get("cnsmrpric")); // 소비자가
itemOptnVO.setSlepric((BigDecimal) goodsOptn.get("slepric")); // 판매가 itemOptnVO.setSlepric((BigDecimal) goodsOptn.get("slepric")); // 판매가

View File

@@ -142,6 +142,14 @@ public class BOOrderItemOptnVO extends AbstractVO {
private BigDecimal step85 = new BigDecimal(0); private BigDecimal step85 = new BigDecimal(0);
private String hscode;
private BigDecimal realWt;
private BigInteger volWt;
private Integer packageCnt;
private String restUpdtDv; private String restUpdtDv;
private BigDecimal updtRestAmt = new BigDecimal(0); private BigDecimal updtRestAmt = new BigDecimal(0);

View File

@@ -23,6 +23,8 @@ public class BOOrderItemVO extends AbstractVO {
private String goodsNm; private String goodsNm;
private String goodsNmEn;
private String goodsKndCd; private String goodsKndCd;
private String taxtTrgetAt; private String taxtTrgetAt;

View File

@@ -161,6 +161,14 @@ public interface BODlivyMapper {
public List<BODlivyVO> selectBOOrdrDlvyDtlsInqireGroupOrdr(BODlivyVO boDlivyVO); public List<BODlivyVO> selectBOOrdrDlvyDtlsInqireGroupOrdr(BODlivyVO boDlivyVO);
/**
* 주문 배송 추적 조회 : 송장번호 조회
* @param boDlivyVO
* @return
*/
public String selectBOOrdrInvcnb(BODlivyVO boDlivyVO);
/** /**
* 출고 상태 '상품 준비' or '배송중' 되돌리기 / 출고 상태 변경 단건 * 출고 상태 '상품 준비' or '배송중' 되돌리기 / 출고 상태 변경 단건
* @param dlivyVO * @param dlivyVO

View File

@@ -1,59 +1,40 @@
package com.wb.domainserver.domain.gcone.ordr.dlivy.service; package com.wb.domainserver.domain.gcone.ordr.dlivy.service;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOShopSetupVO; import com.fasterxml.jackson.databind.ObjectMapper;
import com.wb.domainserver.domain.gcone.common.service.BOCommonService;
import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderLogVO; import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderLogVO;
import com.wb.domainserver.domain.gcone.mbr.mlg.service.BOMlgService; import com.wb.domainserver.domain.gcone.mbr.mlg.service.BOMlgService;
import com.wb.domainserver.domain.gcone.mbr.mlg.vo.BOMlgVO; import com.wb.domainserver.domain.gcone.mbr.mlg.vo.BOMlgVO;
import com.wb.domainserver.domain.gcone.ntcn.mssage.service.BOMssageService; import com.wb.domainserver.domain.gcone.ntcn.mssage.service.BOMssageService;
import com.wb.domainserver.domain.gcone.ordr.atmcrcpmny.vo.BOAtmcRcpmnyCnfirmVO; import com.wb.domainserver.domain.gcone.ordr.dlivy.mapper.BODlivyMapper;
import com.wb.domainserver.domain.gcone.ordr.dlivy.vo.*; import com.wb.domainserver.domain.gcone.ordr.dlivy.vo.*;
import com.wb.domainserver.domain.gcone.ordr.ordr.mapper.BOOrdrMapper; import com.wb.domainserver.domain.gcone.ordr.ordr.mapper.BOOrdrMapper;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrService; import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrService;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrLogVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrShippingVO; import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrShippingVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrVO; import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrVO;
import com.wb.domainserver.domain.gcone.ordr.pay.service.BOPayService; import com.wb.domainserver.domain.gcone.ordr.pay.service.BOPayService;
import com.wb.domainserver.domain.gcone.ordr.pay.vo.BOPayVO; import com.wb.domainserver.domain.gcone.ordr.pay.vo.BOPayVO;
import com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.service.BORtngudrefndService; import com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.service.BORtngudrefndService;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil; import com.wb.domainserver.util.string.StringUtil;
import io.micrometer.common.util.StringUtils; import io.micrometer.common.util.StringUtils;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wb.domainserver.domain.gcone.ordr.dlivy.mapper.BODlivyMapper;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils; import org.springframework.web.client.RestTemplate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder; import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory; import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
@@ -83,6 +64,9 @@ public class BODlivyService {
@Autowired @Autowired
BORtngudrefndService boRtngudrefndService; BORtngudrefndService boRtngudrefndService;
@Autowired
private BOCommonService boCommonService;
/* #################################### /* ####################################
출고 리스트 서비스 시작 출고 리스트 서비스 시작
@@ -494,6 +478,167 @@ public class BODlivyService {
return contents; return contents;
} }
/**
* ACI Key 발급 API
* @param
* @return List<DataMap>
*/
public DataMap selectBOAciKey() throws WnbtRestException {
String apiKey = boCommonService.selectAciApiKey();
DataMap message = new DataMap();
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("USERID", "UNIHAN");
headers.set("APIKEY", apiKey);
Map<String, Object> body = new HashMap<>();
HttpEntity<String> apiRequest =
new HttpEntity<>("{}", headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(
"https://acieshop.com/api/kr/token/",
HttpMethod.POST,
apiRequest,
String.class
);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.getBody());
message.put("status", jsonNode.get("Status").asText());
message.put("aciKey", jsonNode.get("ACIKey").asText());
message.put("errMsg", jsonNode.get("ErrMsg").asText());
}catch (WnbtRestException wre){
log.error(wre.getMessage());
throw wre;
}catch (RuntimeException re){
log.error(re.getMessage());
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
/**
* 화물 추적 - 운송장 조회 API
* @param boDlivyVO
* @return List<DataMap>
*/
public DataMap updateBOAciDelivery(BODlivyVO boDlivyVO) throws WnbtRestException {
DataMap aciMap = selectBOAciKey();
String aciKey = String.valueOf(aciMap.get("aciKey"));
DataMap message = new DataMap();
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("USERID", "UNIHAN");
headers.set("ACIKey", aciKey);
Map<String, Object> body = new HashMap<>();
body.put("BLNO", List.of(mapper.selectBOOrdrInvcnb(boDlivyVO)));
HttpEntity<Map<String, Object>> apiRequest =
new HttpEntity<>(body, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(
"https://acieshop.com/api/kr/pod/v1.5/",
HttpMethod.POST,
apiRequest,
String.class
);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.getBody());
message.put("status", jsonNode.get("Status").asText());
JsonNode podInfoNode = jsonNode.get("PODInfo");
if(!podInfoNode.isNull()) {
List<DataMap> podInfoList = new ArrayList<>();
for(JsonNode podInfoItem : podInfoNode) {
DataMap PODInfo = new DataMap();
PODInfo.put("blno", podInfoItem.get("BLNO").asText());
PODInfo.put("dateLocalwhin", podInfoItem.get("DATE_LOCALWHIN").asText());
PODInfo.put("dateLocaldeparture", podInfoItem.get("DATE_LOCALDEPARTURE").asText());
PODInfo.put("dateIcnarrival", podInfoItem.get("DATE_ICNARRIVAL").asText());
PODInfo.put("dateCustomes", podInfoItem.get("DATE_CUSTOMES").asText());
PODInfo.put("dateDelivery", podInfoItem.get("DATE_DELIVERY").asText());
PODInfo.put("recipient", podInfoItem.get("RECIPIENT").asText());
PODInfo.put("wta", podInfoItem.get("WTA").asText());
PODInfo.put("wtdan", podInfoItem.get("WTDAN").asText());
List<DataMap> volumeList = new ArrayList<>();
for(JsonNode volumeItem : podInfoItem.get("VOLUME")) {
DataMap volume = new DataMap();
volume.put("width", volumeItem.get("WIDTH").asText());
volume.put("length", volumeItem.get("LENGTH").asText());
volume.put("height", volumeItem.get("HEIGHT").asText());
volumeList.add(volume);
}
PODInfo.put("volume", volumeList);
List<List> customsList = new ArrayList<>();
for(JsonNode customsItem : podInfoItem.get("CUSTOMS")) {
List<DataMap> customDetail = new ArrayList<>();
for(JsonNode customItem : customsItem) {
DataMap Custom = new DataMap();
Custom.put("dateEvent", customItem.get("DATE_EVENT").asText());
Custom.put("traceStatus", customItem.get("TRACE_STATUS").asText());
customDetail.add(Custom);
}
customsList.add(customDetail);
}
PODInfo.put("customs", customsList);
List<DataMap> localPodList = new ArrayList<>();
for(JsonNode localPodItem : podInfoItem.get("LOCAL_POD")) {
DataMap localPod = new DataMap();
localPod.put("traceStatus", localPodItem.get("TRACE_STATUS").asText());
localPod.put("dateEvent", localPodItem.get("DATE_EVENT").asText());
localPod.put("position", localPodItem.get("POSITION").asText());
localPodList.add(localPod);
}
PODInfo.put("localPod", localPodList);
podInfoList.add(PODInfo);
}
message.put("podInfo", podInfoList);
} else {
message.put("errMsg", jsonNode.get("ErrMsg").asText());
}
}catch (WnbtRestException wre){
log.error(wre.getMessage());
throw wre;
}catch (RuntimeException re){
log.error(re.getMessage());
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
/**
* 송장번호 조회
* @param boDlivyVO
* @return List<DataMap>
*/
public String selectBOOrdrInvcnb(BODlivyVO boDlivyVO) throws WnbtRestException {
return mapper.selectBOOrdrInvcnb(boDlivyVO);
}
/** /**

View File

@@ -497,6 +497,40 @@ public interface BOOrdrMapper {
관리자 > 주문 > 주문관리 > 다운로드항목설정 종료 관리자 > 주문 > 주문관리 > 다운로드항목설정 종료
#################################### */ #################################### */
/* ####################################
관리자 > 주문 > 주문관리 > 발주서 관리 시작
#################################### */
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 발주서 건수
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public Integer selectExcelListPurchOrderTotCnt(BOOrdrSrchVO ordrSrchVO);
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 발주서 목록 조회
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelListPurchOrder(BOOrdrSrchVO ordrSrchVO);
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 발주서 엑셀다운로드
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelPoListDwld(BOOrdrSrchVO ordrSrchVO);
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 엑셀 다운로드 일시 업데이트
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public Integer updateExcelDownDt(BOOrdrSrchVO ordrSrchVO);
/* ####################################
관리자 > 주문 > 주문관리 > 발주서 관리 종료
#################################### */
/* #################################### /* ####################################
사용자 > 마이페이지 > MY쇼핑 > 개인결제 시작 사용자 > 마이페이지 > MY쇼핑 > 개인결제 시작
#################################### */ #################################### */

View File

@@ -137,6 +137,9 @@ public class BOOrdrLogService {
} else if ("05".equals(setleTyCd)) { // 가상계좌(에스크로) } else if ("05".equals(setleTyCd)) { // 가상계좌(에스크로)
logDtlCn = mngrOrder + "이(가) 주문접수(가상계좌 에스크로) 하였습니다."; logDtlCn = mngrOrder + "이(가) 주문접수(가상계좌 에스크로) 하였습니다.";
mngrOrder += "주문접수(가상계좌 에스크로)"; mngrOrder += "주문접수(가상계좌 에스크로)";
}else if ("stripe".equals(setleTyCd)) { // Stripe(엔화결제)
logDtlCn = mngrOrder + "이(가) 주문접수(엔화결제) 하였습니다.";
mngrOrder += "주문접수(엔화결제)";
} else { } else {
mngrOrder += resCd; mngrOrder += resCd;
logDtlCn = message; logDtlCn = message;

View File

@@ -3,12 +3,15 @@ package com.wb.domainserver.domain.gcone.ordr.ordr.service;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jose.shaded.gson.Gson; import com.nimbusds.jose.shaded.gson.Gson;
import com.stripe.StripeClient;
import com.stripe.model.Charge;
import com.stripe.model.Charge.PaymentMethodDetails;
import com.stripe.model.PaymentIntent;
import com.stripe.model.checkout.Session;
import com.wb.domainserver.common.prop.PropertyService; import com.wb.domainserver.common.prop.PropertyService;
import com.wb.domainserver.domain.admin.instcSle.mtng.mapper.BOMaMtngMapper;
import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper; import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService; import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.domain.admin.sys.comncd.vo.BOMaComncdVO; import com.wb.domainserver.domain.admin.sys.comncd.vo.BOMaComncdVO;
import com.wb.domainserver.domain.gcone.goods.goods.service.BOGoodsService;
import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderNoService; import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderNoService;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService; import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService;
@@ -56,9 +59,7 @@ import org.springframework.util.StringUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.*;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException; import java.time.format.DateTimeParseException;
import java.util.*; import java.util.*;
@@ -1298,6 +1299,49 @@ public class BOOrdrService{
관리자 > 주문 > 주문관리 > 다운로드항목설정 종료 관리자 > 주문 > 주문관리 > 다운로드항목설정 종료
#################################### */ #################################### */
/* ####################################
관리자 > 주문 > 주문관리 > 발주서 관리 시작
#################################### */
/**
* 관리자 > 주문 > 주문관리 > 발주서 다운로드 > 발주서 목록 조회
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelPoList(BOOrdrSrchVO ordrSrchVO) {
List<DataMap> excelListPO = null;
// 건수 조회
Integer totCnt = mapper.selectExcelListPurchOrderTotCnt(ordrSrchVO);
ordrSrchVO.getPaginationInfo().setTotalRecordCount(totCnt);
if(totCnt > 0) {
excelListPO = mapper.selectExcelListPurchOrder(ordrSrchVO);
}
return excelListPO;
}
/**
* 관리자 > 주문 > 주문관리 > 발주서 다운로드 > 발주서 다운로드
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelPoListDwld(BOOrdrSrchVO ordrSrchVO) {
return mapper.selectExcelPoListDwld(ordrSrchVO);
}
/**
* 관리자 > 주문 > 주문관리 > 발주서 다운로드 > 엑셀 다운로드 일시 업데이트
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public Integer updateExcelDownDt(BOOrdrSrchVO ordrSrchVO) {
return mapper.updateExcelDownDt(ordrSrchVO);
}
/* ####################################
관리자 > 주문 > 주문관리 > 발주서 관리 종료
#################################### */
/* #################################### /* ####################################
관리자 > 주문 > 개인결제관리 시작 관리자 > 주문 > 개인결제관리 시작
#################################### */ #################################### */
@@ -3760,7 +3804,7 @@ public class BOOrdrService{
setleAmt = setleAmt.add(dlvyAmt).subtract(dlvyCouponDscntAmt).subtract(enuriAmt).subtract(useMlgAmt).subtract(useCashMlgAmt).compareTo(BigDecimal.ZERO) > 0 ? setleAmt.add(dlvyAmt).subtract(dlvyCouponDscntAmt).subtract(enuriAmt).subtract(useMlgAmt).subtract(useCashMlgAmt) : BigDecimal.ZERO; setleAmt = setleAmt.add(dlvyAmt).subtract(dlvyCouponDscntAmt).subtract(enuriAmt).subtract(useMlgAmt).subtract(useCashMlgAmt).compareTo(BigDecimal.ZERO) > 0 ? setleAmt.add(dlvyAmt).subtract(dlvyCouponDscntAmt).subtract(enuriAmt).subtract(useMlgAmt).subtract(useCashMlgAmt) : BigDecimal.ZERO;
// 환율계산 // 환율계산
setleAmtKr = setleAmt.multiply(buyRate); setleAmtKr = setleAmt.multiply(buyRate);
setleAmtKr = setleAmtKr.setScale(0,RoundingMode.HALF_UP); setleAmtKr = setleAmtKr.setScale(-1, RoundingMode.DOWN);
lmttUseMlg = goodsAmt.subtract(dscntAmt.add(cartCouponDscntAmt)); lmttUseMlg = goodsAmt.subtract(dscntAmt.add(cartCouponDscntAmt));
log.debug(" 결제 예정 금액 : {}", setleAmt); log.debug(" 결제 예정 금액 : {}", setleAmt);
@@ -5569,6 +5613,123 @@ public class BOOrdrService{
} }
/**
* 사용자 > 상품 > 구매/결제 > 회원구매하기 > Stirpe 결제 정보 등록
* @param payVO
* @return Map<String, Object>
*/
@Transactional
public Map<String, Object> insertStripeSetle(Session stripe, BOPayVO payVO) throws Exception {
boolean payResult = true;
Map<String, Object> content = new HashMap<>();
BOOrderPgLogVO orderPgLogVO = new BOOrderPgLogVO();
orderPgLogVO.setOrdrInnb(new BigInteger(payVO.getOrderId()));
orderPgLogVO.setSopmalCd(payVO.getSopmalCd());
orderPgLogVO.setPgCmpnyNm(payVO.getPgCmpnyNm());
orderPgLogVO.setSetlerNm(payVO.getSetlerNm());
orderPgLogVO.setSetleMthCd(payVO.getSetleTyCd());
try{
// 1. 주문상태 수정 =====================================================
BOOrderVO orderVO = new BOOrderVO();
orderVO.setSopmalCd(payVO.getSopmalCd());
orderVO.setOrdrInnb(new BigInteger(payVO.getOrderId()));
orderVO.setOrdrSttusCd("25"); // 주문상태코드(25:결제확인)
if (StringUtils.hasText(payVO.getMbrInnb())) {
orderVO.setMbrInnb(new BigInteger(payVO.getMbrInnb()));
}
log.info("insertStripeSetle service start ::: ");
// 주문 공통 전처리 ( 상태체크, 상태변경, 마일리지, 쿠폰, GC머니 )
orderCommService.commonOrderPreProcess(payVO, orderVO);
/* ===============================================
결제 API >> DB select로 진행함
================================================== */
StripeClient stripeClient = payService.createStripeClient(payVO.getSopmalCd());
int installmentCount = 0;
PaymentIntent paymentIntent = stripeClient.v1()
.paymentIntents()
.retrieve(stripe.getPaymentIntent());
Charge charge = paymentIntent.getLatestChargeObject();
if(charge != null) {
PaymentMethodDetails paymentMethodDetails = charge.getPaymentMethodDetails();
if(paymentMethodDetails != null) {
PaymentMethodDetails.Card card = paymentMethodDetails.getCard();
if (card != null && card.getInstallments() != null) {
PaymentMethodDetails.Card.Installments installments = card.getInstallments();
if (installments.getPlan() != null && installments.getPlan().getCount() != null) {
installmentCount = Integer.parseInt(installments.getPlan().getCount().toString());
}
}
}
}
/* ===============================================
5. FM_ORDER_PG_LOG 등록값 셋팅
================================================== */
orderPgLogVO.setDelngNb(StringUtil.isNullToString(stripe.getPaymentIntent())); // 거래번호 (결제키)
orderPgLogVO.setConfmDt(StringUtil.isNullToString(Instant.ofEpochSecond(stripe.getCreated()).atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime())); // 승인일시
orderPgLogVO.setApvlnb(StringUtil.isNullToString("")); //승인번호
orderPgLogVO.setCardCmpnyCd(StringUtil.isNullToString("")); //카드사코드
orderPgLogVO.setCardCmpnyNm(StringUtil.isNullToString("")); //카드사명
orderPgLogVO.setNintrAt(StringUtil.isNullToString("")); //무이자여부
orderPgLogVO.setInstlmtMtCnt(installmentCount); //할부개월수
orderPgLogVO.setDelngAmt(stripe.getAmountTotal() != null ? new BigDecimal(stripe.getAmountTotal()) : BigDecimal.valueOf(0));
orderPgLogVO.setEscwAt("N"); // 에스크로여부
orderPgLogVO.setVirtlAcntVrifyKy(""); //매출증빙영수증URL
orderPgLogVO.setRsltMssageCn("정상처리-카드거래");
orderPgLogVO.setRsltCd("0000");
// 6. FM_ORDER_SETLE 수정 ==============================================
BOOrderSetleVO orderSetleVO = new BOOrderSetleVO();
orderSetleVO.setSopmalCd(payVO.getSopmalCd());
orderSetleVO.setOrdrInnb(new BigInteger(payVO.getOrderId()));
orderSetleVO.setPgInnb(orderPgLogVO.getDelngNb());
orderSetleVO.setCredtcardApvlnb(orderPgLogVO.getApvlnb());
orderSetleVO.setSetleTyCd(payVO.getSetleTyCd());
//orderSetleVO.setSetleMid(StringUtil.isNullToString(mapper.selectBOSopSetleMidKeyInqire(payVO))); // 쇼핑몰 결제 MID(상점키) 조회
log.info("insertStripeSetle service StripePayMap_orderSetleVO ::: {}", orderSetleVO);
purchsMapper.updateOrderSetle(orderSetleVO);
log.info("insertStripeSetle service StripePayMap_orderSetleVO end::: ");
content.put("status", "0");
content.put("message", "Stripe 결제 정보 등록을 완료 하였습니다.");
try {
selectBOOrdrMssageSndngProcs(orderVO);
} catch (Exception e) {
log.debug("{} 메시지 발송 실패", payVO.getOrderId());
}
} catch (WnbtRestException wre) {
log.error("insertStripeSetle1 WnbtRestException : ", wre);
payResult = false;
throw wre;
} catch (Exception wre) {
log.error("insertStripeSetle1 Exception : ", wre);
payResult = false;
throw wre;
} finally {
log.info("insertStripeSetle1 order finally !!!!! {} ", payVO.getOrderId());
// FM_ORDER_PG_LOG 등록
ordrLogService.insertBOOrderPgLog(orderPgLogVO);
// 주문 로그
ordrLogService.insertSetleOrderLog(payVO, payResult, "0000", "Stripe 결제 실패 [결제 정보 NULL]");
}
return content;
}
/** /**
@@ -5747,6 +5908,16 @@ public class BOOrdrService{
} }
/**
* Stripe 주문 상태 조회
* @param ordrVO
* @return Map<String, Object>
*/
public DataMap selectOrdrSttus(BOOrdrVO ordrVO) {
return mapper.selectOrdrDtl(ordrVO);
}
/** /**
* 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 정보 조회 * 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 정보 조회
* @param ordrVO * @param ordrVO

View File

@@ -29,61 +29,66 @@ public class BODwldItmVO extends AbstractVO {
private String[] selItems; private String[] selItems;
public enum items { public enum items {
item01("export_group_innb", "출고그룹"), exportGroupInnb("export_group_innb", "출고그룹"),
item02("ordr_innb_with_export_group_innb", "주문번호+출고그룹"), ordrInnbWithExportGroupInnb("ordr_innb_with_export_group_innb", "주문번호+출고그룹"),
item03("ordr_innb", "주문번호"), ordrInnb("ordr_innb", "주문번호"),
item04("smrt_shopng_ordrnb", "npay주문번호"), smrtShopngOrdrnb("smrt_shopng_ordrnb", "npay주문번호"),
item05("ordr_rcept_dt", "주문일"), ordrRceptDt("ordr_rcept_dt", "주문일"),
item06("ordrr_nm", "주문자명"), ordrrNm("ordrr_nm", "주문자명"),
item07("mbr_id", "주문자아이디"), mbrId("mbr_id", "주문자아이디"),
item08("ordrr_mbtlnb", "주문자휴대폰"), ordrrMbtlnb("ordrr_mbtlnb", "주문자휴대폰"),
item09("ordrr_email", "주문자이메일"), ordrrEmail("ordrr_email", "주문자이메일"),
item10("order_memo", "사용자메모"), orderMemo("order_memo", "사용자메모"),
item11("lgstc_adm_memo", "물류담당자메모"), lgstcAdmMemo("lgstc_adm_memo", "물류담당자메모"),
item12("inflow_cours_url", "주문경로"), inflowCoursUrl("inflow_cours_url", "주문경로"),
item13("dlivy_dt", "출고일"), dlivyDt("dlivy_dt", "출고일"),
item14("dlvy_mth_nm", "받는방법"), dlvyMthNm("dlvy_mth_nm", "받는방법"),
item15("hdrycpn_nm", "택배사"), hdrycpnNm("hdrycpn_nm", "택배사"),
item16("invcnb", "운송장번호"), invcnb("invcnb", "운송장번호"),
item17("dlvylc_adres_info", "받는정보"), dlvylcAdresInfo("dlvylc_adres_info", "받는정보"),
item18("recpnt_nm", "수령인"), recpntNm("recpnt_nm", "수령인"),
item19("recpnt_mbtlnb", "수령인휴대폰"), recpntMbtlnb("recpnt_mbtlnb", "수령인휴대폰"),
item20("dlvylc_zip", "우편번호"), dlvylcZip("dlvylc_zip", "우편번호"),
item21("dlvylc_rnm_adres", "전체주소(도로명)"), dlvylcRnmAdres("dlvylc_rnm_adres", "전체주소(도로명)"),
item22("dlvy_amt", "배송비"), dlvyAmt("dlvy_amt", "배송비"),
item23("ordr_goods_innb", "상품고유번호"), ordrGoodsInnb("ordr_goods_innb", "상품고유번호"),
item24("npay_goods_ordrnb", "npay상품주문번호"), npayGoodsOrdrnb("npay_goods_ordrnb", "npay상품주문번호"),
item25("goods_nm", "상품명"), goodsNm("goods_nm", "상품명"),
item26("invntry_qy", "현재고"), goodsNmEn("goods_nm_en", "상품명(영문)"),
item27("prchspric", "매입가"), invntryQy("invntry_qy", "현재고"),
item28("cnsmrpric", "정가"), prchspric("prchspric", "매입가"),
item29("dscntpric", "할인가"), cnsmrpric("cnsmrpric", "정가"),
item30("pric_by_ordr_qy", "할인가x수량"), dscntpric("dscntpric", "할인가"),
item31("taxt_trget_at", "과세여부"), pricByOrdrQy("pric_by_ordr_qy", "할인가x수량"),
item32("input_optn", "추가입력옵션"), taxtTrgetAt("taxt_trget_at", "과세여부"),
item33("ordr_qy", "주문수량"), inputOptn("input_optn", "추가입력옵션"),
item34("refnd_qy", "취소수량"), ordrQy("ordr_qy", "주문수량"),
item35("bfr_sndng_qy", "보낸수량"), refndQy("refnd_qy", "취소수량"),
item36("aftr_sndng_qy", "보낼수량"), bfrSndngQy("bfr_sndng_qy", "보낸수량"),
item37("ordr_sttus_nm", "주문상품상태"), aftrSndngQy("aftr_sndng_qy", "보낼수량"),
item38("goods_dscnt_amt", "상품쿠폰할인"), ordrSttusNm("ordr_sttus_nm", "주문상품상태"),
item39("event_dscnt_amt", "이벤트할인"), goodsDscntAmt("goods_dscnt_amt", "상품쿠폰할인"),
item40("mlt_dscnt_amt", "복수구매할인"), eventDscntAmt("event_dscnt_amt", "이벤트할인"),
item41("dlvy_dscnt_amt", "배송비쿠폰"), mltDscntAmt("mlt_dscnt_amt", "복수구매할인"),
item42("mlg_dscnt_amt", "마일리지사용"), dlvyDscntAmt("dlvy_dscnt_amt", "배송비쿠폰"),
item43("spbk_dscnt_amt", "장바구니할인쿠폰"), mlgDscntAmt("mlg_dscnt_amt", "마일리지사용"),
item44("enuri_dscnt_amt", "에누리"), spbkDscntAmt("spbk_dscnt_amt", "장바구니할인쿠폰"),
item45("setle_amt", "결제금액"), enuriDscntAmt("enuri_dscnt_amt", "에누리"),
item46("setle_dt", "결제일"), setleAmt("setle_amt", "결제금액"),
item47("setle_mth_nm", "결제방법"), setleDt("setle_dt", "결제일"),
item48("snggds_accml_mlg_amt", "지급마일리지"), setleMthNm("setle_mth_nm", "결제방법"),
item49("dlvylc_group_nb", "배송그룹번호"), snggdsAccmlMlgAmt("snggds_accml_mlg_amt", "지급마일리지"),
item50("dlvy_amt_setle_mth_nm", "배송비결제방식"), dlvylcGroupNb("dlvylc_group_nb", "배송그룹번호"),
item51("ordr_ty_nm", "주문유형"), dlvyAmtSetleMthNm("dlvy_amt_setle_mth_nm", "배송비결제방식"),
item52("optn_cd_1", "상품코드"), ordrTyNm("ordr_ty_nm", "주문유형"),
item53("dlvy_mssage_cn", "배송메시지"), optnCd_1("optn_cd_1", "상품코드"),
item54("shipping_sttus_nm", "출고상태"), hscode("hscode", "HS Code"),
item55("subsvc_at", "주문구분"); realWt("realWt", "실무게"),
volWt("volWt", "부피무게"),
packageCnt("packageCnt", "포장개수"),
dlvyMssageCn("dlvy_mssage_cn", "배송메시지"),
shippingSttusNm("shipping_sttus_nm", "출고상태"),
subsvcAt("subsvc_at", "주문구분");
private final String key; private final String key;
private final String value; private final String value;

View File

@@ -40,6 +40,9 @@ public class BOOrdrShippingVO extends AbstractVO {
/** 받는자휴대폰번호 */ /** 받는자휴대폰번호 */
private String recpntMbtlnb; private String recpntMbtlnb;
/** 개인통관부호 */
private String cstmclerCd;
/** 배송지역코드 */ /** 배송지역코드 */
private String dlvylcAreaCd; private String dlvylcAreaCd;

View File

@@ -4,6 +4,10 @@ import com.wb.domainserver.domain.comm.vo.AbstractVO;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class BOOrdrSrchVO extends AbstractVO{ public class BOOrdrSrchVO extends AbstractVO{
@@ -82,7 +86,15 @@ public class BOOrdrSrchVO extends AbstractVO{
private String[] srchOrdrInnbs; // 주문번호 배열 private String[] srchOrdrInnbs; // 주문번호 배열
private String[] srchOrdrDlvyInnbs; // 배송번호 배열
private List<Map<String, String>> srchInnbPairs; // 발주서 주키 배열
private String srchDatePeriod; // 날짜구간코드 private String srchDatePeriod; // 날짜구간코드
private String[] dlvylcAreaCds; // 배송지역코드
private String excelInclude; // 엑셀 다운여부
/* /*
#################################### ####################################
전체 주문 조회 검색 추가 조건 종료 전체 주문 조회 검색 추가 조건 종료

View File

@@ -20,6 +20,10 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.nimbusds.jose.shaded.gson.Gson; import com.nimbusds.jose.shaded.gson.Gson;
import com.stripe.StripeClient;
import com.stripe.exception.StripeException;
import com.stripe.model.Event;
import com.stripe.net.Webhook;
import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrLogService; import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrLogService;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
@@ -1499,8 +1503,14 @@ public class BOPayService{
String kiwoom_ENC = ""; String kiwoom_ENC = "";
try { try {
String url = "https://apitest.kiwoompay.co.kr/pay/hash"; String targetURL = "";
URL goUrl = new URL(url); if(cpId.equals("CTS18056")) {
targetURL = "https://apitest.kiwoompay.co.kr/pay/hash"; //개발서버
}else{
targetURL = "https://api.kiwoompay.co.kr/pay/hash"; //운영서버
}
log.info("insertKiwoomPay targetURL :::{} ",targetURL);
URL goUrl = new URL(targetURL);
HttpURLConnection con = (HttpURLConnection) goUrl.openConnection(); HttpURLConnection con = (HttpURLConnection) goUrl.openConnection();
con.setRequestMethod("POST"); con.setRequestMethod("POST");
@@ -1558,9 +1568,17 @@ public class BOPayService{
//관련 키값 DB 조회 //관련 키값 DB 조회
DataMap resultMap = selectPayLink(payVO.getSopmalCd()); DataMap resultMap = selectPayLink(payVO.getSopmalCd());
log.debug("cancelKiwoomPay step2 resultMap :::> {}", resultMap);
//요청코드 //요청코드
String authKey = resultMap.get("kcpSecretKey").toString(); String authKey = resultMap.get("kcpSecretKey").toString();
String cpId = resultMap.get("kcpMid").toString(); String cpId = resultMap.get("kcpMid").toString();
// 개발서버 네이버페이 CPID 관련 적용 취소
// if ("naverpay".equals(payVO.getModGubun())) {
// authKey = resultMap.get("bpaySecretKey").toString();
// cpId = resultMap.get("bpayMid").toString();
// }
String amount = payVO.getCancelAmount(); //취소금액 String amount = payVO.getCancelAmount(); //취소금액
String trxId = payVO.getTno(); //거래번호 String trxId = payVO.getTno(); //거래번호
String cancelReason = payVO.getCancelReason(); //취소사유 String cancelReason = payVO.getCancelReason(); //취소사유
@@ -1568,10 +1586,6 @@ public class BOPayService{
String cancelReq = "Y"; //취소URL 요청여부 String cancelReq = "Y"; //취소URL 요청여부
//String TAXFREEAMT = nullCheck(request.getParameter("TAXFREEAMT")); //비과세 취소금액 //String TAXFREEAMT = nullCheck(request.getParameter("TAXFREEAMT")); //비과세 취소금액
/*if(payVO.getSetleTyCd().equals("01")) {
payMethod = "CARD";
}*/
//1차 요청코드 //1차 요청코드
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
obj.put("cancelReason", cancelReason); //취소사유 obj.put("cancelReason", cancelReason); //취소사유
@@ -1609,6 +1623,7 @@ public class BOPayService{
}else{ }else{
targetURL = "https://api.kiwoompay.co.kr/pay/ready"; //운영서버 targetURL = "https://api.kiwoompay.co.kr/pay/ready"; //운영서버
} }
log.info("cancelKiwoomPay targetURL :::{} ",targetURL);
URL goUrl = new URL(targetURL); URL goUrl = new URL(targetURL);
HttpURLConnection con = (HttpURLConnection) goUrl.openConnection(); HttpURLConnection con = (HttpURLConnection) goUrl.openConnection();
@@ -1733,5 +1748,32 @@ public class BOPayService{
} }
/**
* stripeClient 생성
* @param sopmalCd
*/
public StripeClient createStripeClient(String sopmalCd) throws StripeException {
String stripeSecretKey = selectPayLink(sopmalCd).get("stripeSecretKey").toString();
StripeClient stripeClient = new StripeClient(stripeSecretKey);
return stripeClient;
}
/**
* stripe WebhookEvent 생성
* @param payload
* @param sigHeader
*/
public Event createWebhookEvent(String payload, String sigHeader, String sopmalCd) throws StripeException {
String stripeWebhookKey = selectPayLink(sopmalCd).get("stripeWebhookKey").toString();
Event event = Webhook.constructEvent(
payload,
sigHeader,
stripeWebhookKey
);
return event;
}
} }

View File

@@ -1,6 +1,9 @@
package com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.service; package com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.service;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.stripe.StripeClient;
import com.stripe.model.Refund;
import com.stripe.param.RefundCreateParams;
import com.wb.domainserver.domain.gcone.goods.goods.service.BOGoodsService; import com.wb.domainserver.domain.gcone.goods.goods.service.BOGoodsService;
import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper; import com.wb.domainserver.domain.gcone.goods.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService; import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService;
@@ -1119,6 +1122,8 @@ public class BORtngudrefndService {
payVO.setMemorSetleAt("Y"); payVO.setMemorSetleAt("Y");
} }
// 개발서버 네이버페이 CPID 구분 적용 취소
// payVO.setModGubun(setle.getPgCmpnyNm()); //결제키 구분용
if ("kiwoom".equals(setle.getPgCmpnyNm())) { if ("kiwoom".equals(setle.getPgCmpnyNm())) {
payVO.setPayMethod("CARD"); payVO.setPayMethod("CARD");
} else if ("naverpay".equals(setle.getPgCmpnyNm())) { } else if ("naverpay".equals(setle.getPgCmpnyNm())) {
@@ -1149,6 +1154,30 @@ public class BORtngudrefndService {
throw new WnbtRestException("잘못된 요청입니다. 관리자에게 문의하세요."); throw new WnbtRestException("잘못된 요청입니다. 관리자에게 문의하세요.");
} }
} else if ("stripe".equals(setle.getPgCmpnyNm())) {
log.debug("stripe 취소 진입");
StripeClient stripeClient = payService.createStripeClient(sopmalCd);
RefundCreateParams params =
RefundCreateParams.builder()
.setPaymentIntent(setle.getPgInnb())
.setAmount(Long.valueOf(cancelAmt))
.build();
Refund refund = stripeClient.v1().refunds().create(params);
String resultCode = refund.getStatus();
if ("succeeded".equals(resultCode)) {
// succeeded : 취소성공
log.debug(resultCode);
message.put("setleStatus", resultCode);
message.put("setleMessage", "Refund is expected to arrive in customer’s bank");
} else {
log.debug(resultCode);
message.put("setleStatus", resultCode);
message.put("setleMessage", resultCode);
logDtlCn = "잘못된 요청입니다. 관리자에게 문의하세요.";
throw new WnbtRestException("잘못된 요청입니다. 관리자에게 문의하세요.");
}
} }
} }

View File

@@ -311,20 +311,6 @@ public class BOPurchsEvtService {
// 사은품 이벤트 // 사은품 이벤트
} else if ("02".equals(purchsEvtVO.getEvtDv())) { } else if ("02".equals(purchsEvtVO.getEvtDv())) {
/*
if (!StringUtils.isEmpty(Arrays.toString(purchsEvtVO.getDeleteGiftList()))) {
log.debug(" 삭제 리스트 확인 purchsEvtVO . get getDeleteGiftList : {}", purchsEvtVO.getDeleteGiftList());
for (String deleteGiftInnb : purchsEvtVO.getDeleteGiftList()) {
log.debug("deleteGiftInnb : {}", deleteGiftInnb);
purchsEvtVO.setDeleteGiftInnb(Integer.parseInt(deleteGiftInnb));
mapper.deleteBOPurchsEvtGiftDel(purchsEvtVO);
}
}
*/
if (!StringUtils.isEmpty(Arrays.toString(purchsEvtVO.getDeleteBnefList()))) { if (!StringUtils.isEmpty(Arrays.toString(purchsEvtVO.getDeleteBnefList()))) {
log.debug(" 삭제 리스트 확인 purchsEvtVO . get deleteList : {}", (Object) purchsEvtVO.getDeleteBnefList()); log.debug(" 삭제 리스트 확인 purchsEvtVO . get deleteList : {}", (Object) purchsEvtVO.getDeleteBnefList());
for (String deleteBnefInnb : purchsEvtVO.getDeleteBnefList()) { for (String deleteBnefInnb : purchsEvtVO.getDeleteBnefList()) {
@@ -334,7 +320,6 @@ public class BOPurchsEvtService {
} }
} }
if (purchsEvtVO.getDiscountBnefVOList() != null && !purchsEvtVO.getDiscountBnefVOList().isEmpty()) { if (purchsEvtVO.getDiscountBnefVOList() != null && !purchsEvtVO.getDiscountBnefVOList().isEmpty()) {
log.debug("사은품 혜택 진입"); log.debug("사은품 혜택 진입");
for (BOPurchsEvtDiscountBnefVO tempVO : purchsEvtVO.getDiscountBnefVOList()) { for (BOPurchsEvtDiscountBnefVO tempVO : purchsEvtVO.getDiscountBnefVOList()) {

View File

@@ -0,0 +1,34 @@
package com.wb.domainserver.domain.gcone.setup.cost.mapper;
import com.wb.domainserver.domain.gcone.setup.cost.vo.BOCostVO;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface BOCostMapper {
/**
* 원가 설정 목록 조회
* @param vo
* @return
*/
public List<DataMap> selectBOCostPriceList(BOCostVO vo);
/**
* 원가 설정 삭제
* @param vo
* @return
*/
public int deleteBOCostPrice(BOCostVO vo);
/**
* 원가 설정 추가
* @param dm
* @return
*/
public int insertBOCostPrice(DataMap dm);
}

View File

@@ -0,0 +1,94 @@
package com.wb.domainserver.domain.gcone.setup.cost.service;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.domain.gcone.setup.cost.mapper.BOCostMapper;
import com.wb.domainserver.domain.gcone.setup.cost.vo.BOCostVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
/**
* 원가 설정 BO Serivce
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-05-29 이대환 최초 생성
*
* </pre>
* @since 2026-05-29
*/
@Slf4j
@Service
public class BOCostService {
@Autowired
private BOMaComncdService bOMaComncdService;
@Autowired
private BOCostMapper mapper;
/**
* 원가 설정 목록 조회
* @param vo
* @return List<DataMap>
*/
public List<DataMap> selectBOCostPriceList(BOCostVO vo) {
List<DataMap> costList = new ArrayList<>();
costList = mapper.selectBOCostPriceList(vo);
return costList;
}
/**
* 원가 설정 수정
* @param vo
*/
@Transactional
public DataMap updateBOCostPriceSetup(BOCostVO vo) {
DataMap message = new DataMap();
try {
mapper.deleteBOCostPrice(vo);
DataMap paramMap = new DataMap();
paramMap.put("regusr", vo.getRegusr());
int[] ctInnbArr = vo.getCtInnbArr();
if (!ObjectUtils.isEmpty(ctInnbArr)) {
for (int i = 0; i < ctInnbArr.length; i++) {
paramMap.put("stdrDe", vo.getStdrDeArr()[i]);
paramMap.put("usdRate", vo.getUsdRateArr()[i]);
paramMap.put("jpDlvyCt", vo.getJpDlvyCtArr()[i]);
paramMap.put("intlDlvyAmt", vo.getIntlDlvyAmtArr()[i]);
paramMap.put("pltfomFee", vo.getPltfomFeeArr()[i]);
paramMap.put("expctTax", vo.getExpctTaxArr()[i]);
paramMap.put("cstmsFee", vo.getCstmsFeeArr()[i]);
paramMap.put("krDlvyCt", vo.getKrDlvyCtArr()[i]);
mapper.insertBOCostPrice(paramMap);
}
}
message.put("result", "success");
} catch (WnbtRestException wre) {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
}

View File

@@ -0,0 +1,39 @@
package com.wb.domainserver.domain.gcone.setup.cost.vo;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper=false)
public class BOCostVO extends AbstractVO {
/** 원가 고유번호 */
private int[] ctInnbArr;
/** 기준일자 */
private String[] stdrDeArr;
/** USD 환율 (1,000 円) */
private BigDecimal[] usdRateArr;
/** 일본 내 물류비 */
private int[] jpDlvyCtArr;
/** 운임비용(JP) */
private int[] intlDlvyAmtArr;
/** 플랫폼 수수료율 */
private BigDecimal[] pltfomFeeArr;
/** 예상세율 */
private BigDecimal[] expctTaxArr;
/** 통관수수료 */
private int[] cstmsFeeArr;
/** 운임비용(KR) */
private int[] krDlvyCtArr;
}

View File

@@ -0,0 +1,56 @@
package com.wb.domainserver.domain.gcone.setup.exchngrt.service;
import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 환율 설정 BO Serivce
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Slf4j
@Service
public class BOExchngrtService {
@Autowired
private BOMaComncdService bOMaComncdService;
@Autowired
private BOMaSopmalMapper mapper;
/**
* 환율 설정 수정
* @param boMaSopmalVO
*/
@Transactional
public DataMap updateBOExchngrtSetup(BOMaSopmalVO boMaSopmalVO) {
DataMap message = new DataMap();
try {
mapper.updateBOExchngrtSetup(boMaSopmalVO);
message.put("result", "success");
} catch (WnbtRestException wre) {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
}

View File

@@ -0,0 +1,32 @@
package com.wb.domainserver.domain.gcone.setup.exchngrt.vo;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BOExchngrtVO extends AbstractVO {
/** 쇼핑몰 코드 */
private String sopmalCd;
/** 1엔 환율(살때) */
private String buyRate;
/** 1엔 환율(팔때) */
private String sellRate;
/** BOMaSopmalVO로 변환 */
public BOMaSopmalVO setBOMaSopmalVO() {
BOMaSopmalVO boMaSopmalVO = new BOMaSopmalVO();
boMaSopmalVO.setSopmalCd(this.getSopmalCd());
boMaSopmalVO.setBuyRate(this.getBuyRate());
boMaSopmalVO.setSellRate(this.getSellRate());
boMaSopmalVO.setRegusr(this.getRegusr());
boMaSopmalVO.setUpdusr(this.getUpdusr());
return boMaSopmalVO;
}
}

View File

@@ -0,0 +1,76 @@
package com.wb.domainserver.domain.gcone.setup.family.service;
import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
/**
* 패밀리사이트 설정 BO Serivce
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Slf4j
@Service
public class BOFamilyService {
@Autowired
private BOMaComncdService bOMaComncdService;
@Autowired
private BOMaSopmalMapper mapper;
/**
* 패밀리사이트 설정 수정
* @param boMaSopmalVO
*/
@Transactional
public DataMap updateBOFamilySetup(BOMaSopmalVO boMaSopmalVO) {
DataMap message = new DataMap();
try {
mapper.deteteBOShopFamilySite(boMaSopmalVO);
DataMap paramMap = new DataMap();
paramMap.put("sopmalCd", boMaSopmalVO.getSopmalCd());
paramMap.put("regusr", boMaSopmalVO.getRegusr());
if (!ObjectUtils.isEmpty(boMaSopmalVO.getFamilySiteNmArr())) {
String[] siteNm = boMaSopmalVO.getFamilySiteNmArr();
String[] siteUrl = boMaSopmalVO.getFamilySiteUrlArr();
for (int i = 0; i < siteNm.length; i++) {
if (!StringUtil.isEmpty(siteNm[i])) {
paramMap.put("familySiteNm", siteNm[i]);
paramMap.put("familySiteUrl", siteUrl[i]);
mapper.insertBOShopFamilySite(paramMap);
}
}
}
message.put("result", "success");
} catch (WnbtRestException wre) {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
}

View File

@@ -0,0 +1,32 @@
package com.wb.domainserver.domain.gcone.setup.family.vo;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BOFamilyVO extends AbstractVO {
/** 쇼핑몰 코드 */
private String sopmalCd;
/** 패밀리사이트명 */
private String[] familySiteNmArr;
/** 패밀리사이트URL */
private String[] familySiteUrlArr;
/** BOMaSopmalVO로 변환 */
public BOMaSopmalVO setBOMaSopmalVO() {
BOMaSopmalVO boMaSopmalVO = new BOMaSopmalVO();
boMaSopmalVO.setSopmalCd(this.getSopmalCd());
boMaSopmalVO.setFamilySiteNmArr(this.getFamilySiteNmArr());
boMaSopmalVO.setFamilySiteUrlArr(this.getFamilySiteUrlArr());
boMaSopmalVO.setRegusr(this.getRegusr());
boMaSopmalVO.setUpdusr(this.getUpdusr());
return boMaSopmalVO;
}
}

View File

@@ -0,0 +1,56 @@
package com.wb.domainserver.domain.gcone.setup.guidance.service;
import com.wb.domainserver.domain.admin.store.sopmal.mapper.BOMaSopmalMapper;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 안내문구 설정 BO Serivce
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Slf4j
@Service
public class BOGuidanceService {
@Autowired
private BOMaComncdService bOMaComncdService;
@Autowired
private BOMaSopmalMapper mapper;
/**
* 안내문구 설정 수정
* @param boMaSopmalVO
*/
@Transactional
public DataMap updateBOGuidanceSetup(BOMaSopmalVO boMaSopmalVO) {
DataMap message = new DataMap();
try {
mapper.updateBOGuidanceSetup(boMaSopmalVO);
message.put("result", "success");
} catch (WnbtRestException wre) {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
throw new WnbtRestException(ErrorCode.INTERNAL_SERVER_ERROR);
}
return message;
}
}

View File

@@ -0,0 +1,44 @@
package com.wb.domainserver.domain.gcone.setup.guidance.vo;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class BOGuidanceVO extends AbstractVO {
/** 쇼핑몰 코드 */
private String sopmalCd;
/** 회원가입 안내 타이틀 */
private String joinGuidanceSj;
/** 회원가입 안내문구 */
private String joinGuidanceWords;
/** 회원가입 주요혜택 */
private String joinBnef;
/** 회원가입 주요문구 */
private String joinComptWords;
/** 구독서비스 안내문구 */
private String subsvcGuidanceWords;
/** BOMaSopmalVO로 변환 */
public BOMaSopmalVO setBOMaSopmalVO() {
BOMaSopmalVO boMaSopmalVO = new BOMaSopmalVO();
boMaSopmalVO.setSopmalCd(this.getSopmalCd());
boMaSopmalVO.setJoinGuidanceSj(this.getJoinGuidanceSj());
boMaSopmalVO.setJoinGuidanceWords(this.getJoinGuidanceWords());
boMaSopmalVO.setJoinBnef(this.getJoinBnef());
boMaSopmalVO.setJoinComptWords(this.getJoinComptWords());
boMaSopmalVO.setSubsvcGuidanceWords(this.getSubsvcGuidanceWords());
boMaSopmalVO.setRegusr(this.getRegusr());
boMaSopmalVO.setUpdusr(this.getUpdusr());
return boMaSopmalVO;
}
}

View File

@@ -28,28 +28,48 @@ import lombok.EqualsAndHashCode;
public class BOSetupOrdrVO extends AbstractVO { public class BOSetupOrdrVO extends AbstractVO {
/** 쇼핑몰 코드 */ /** 쇼핑몰 코드 */
private String sopmalCd; private String sopmalCd;
/**마일리지 지급 사용여부*/
private String mlgPymntAt; // 여러 곳 배송
/**마일리지 지급 구분코드*/ /** 여러곳배송여부 */
private String mlgPymntDvCd;
/**마일리지 지급 비율*/
private String mlgPymntRt;
/**마일리지 최대 지급 금액*/
private String mlgMxmmPymntAmt;
/**마일리지 최대 지급 금액 사용여부*/
private String mlgMxmmPymntAmtAt;
/**마일리지 유효기간*/
private String mlgValidPd;
/**마일리지 유효기간 사용여부*/
private String mlgValidPdAt;
/**여러곳배송여부*/
private String multiDlvyAt; private String multiDlvyAt;
/**정기배송여부*/ /** 정기배송여부 */
private String fdrmDlvyAt; private String fdrmDlvyAt;
/**선물하기여부*/
// 선물하기
/** 선물하기여부 */
private String giftDlvyAt; private String giftDlvyAt;
/**선물하기자동취소기간*/ /** 선물하기자동취소기간 */
private String giftDlvyAtmcCanclPd; private String giftDlvyAtmcCanclPd;
/*충전형마일리지 사용여부*/
// GC 머니
/** 충전형마일리지 사용여부 */
private String cashAt; private String cashAt;
// 마일리지 지급
/** 마일리지 지급 사용여부 */
private String mlgPymntAt;
/** 마일리지 지급 구분코드 */
private String mlgPymntDvCd;
/** 마일리지 지급 비율 */
private String mlgPymntRt;
/** 마일리지 최대 지급 금액 */
private String mlgMxmmPymntAmt;
/** 마일리지 최대 지급 금액 사용여부 */
private String mlgMxmmPymntAmtAt;
/** 마일리지 유효기간 */
private String mlgValidPd;
/** 마일리지 유효기간 사용여부 */
private String mlgValidPdAt;
// 마일리지 사용 조건
/** 마일리지 보유 사용 금액 */
private String mlgHoldUseAmt;
/** 마일리지 결제금액 사용 금액 */
private String mlgSetleAmtUseAmt;
/** 마일리지 최소 사용 금액 */
private String mlgMummUseAmt;
/** 마일리지 최대 사용 구분(MLG_MXMM_USE_DV) */
private String mlgMxmmUseDv;
/** 마일리지 최대 사용 금액 */
private String mlgMxmmUseAmt;
} }

View File

@@ -0,0 +1,54 @@
package com.wb.domainserver.domain.mngr.goods.badge.controller;
import com.wb.domainserver.domain.gcone.goods.badge.service.BOGoodsBadgeService;
import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/mngr/goods/badge")
public class GoodsBadgeController {
@Autowired
private BOGoodsBadgeService service;
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping("/selectGoodsBadgeSetup")
public String selectGoodsBadgeSetup(BOGoodsBadgeVO vo, ModelMap model,
@CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
DataMap content = new DataMap();
content.put("badgeList", service.selectBOGoodsBadgeList(vo));
model.addAttribute("resultMap", content);
return "mngr/goods/badge/GoodsBadgeSetupU";
}
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/updateGoodsBadgeSetup", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateGoodsBadgeSetup(BOGoodsBadgeVO vo,
@CookieValue(value = "authSopmalCd") String authSopmalCd) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
vo.setSopmalCd(authSopmalCd);
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
vo.setRegusr(user.getUserInnb());
vo.setUpdusr(user.getUserInnb());
DataMap message = service.updateBOGoodsBadgeSetup(vo);
return ResponseEntity.ok(WnbtResponse.builder().resBody(new WnbtResponseBody(message)).build());
}
}

View File

@@ -479,10 +479,8 @@ public class GoodsmngrController {
List<?> cgo134List = bOMaComncdService.selectBOCommcdDetailList(maComncdVO); List<?> cgo134List = bOMaComncdService.selectBOCommcdDetailList(maComncdVO);
content.put("goodsDftinfoInvntryPolicyList", cgo134List); content.put("goodsDftinfoInvntryPolicyList", cgo134List);
// 상품아이콘 // 상품 배지
maComncdVO = new BOMaComncdVO(); List<DataMap> iconList = service.selectBOGoodsBadgeList(vo);
maComncdVO.setGroupCd("GOODS_ICON");
List<?> iconList = bOMaComncdService.selectBOCommcdDetailList(maComncdVO);
content.put("iconList", iconList); content.put("iconList", iconList);
// 실시간수량배너구분코드 // 실시간수량배너구분코드
@@ -664,10 +662,7 @@ public class GoodsmngrController {
content.put("goodsDftinfoInvntryPolicyList", cgo134List); // 재고에 따른 판매 content.put("goodsDftinfoInvntryPolicyList", cgo134List); // 재고에 따른 판매
maComncdVO = new BOMaComncdVO(); List<DataMap> iconList = service.selectBOGoodsBadgeList(vo);
maComncdVO.setGroupCd("GOODS_ICON");
List<?> iconList = bOMaComncdService.selectBOCommcdDetailList(maComncdVO);
//브랜드 목록조회 //브랜드 목록조회
@@ -1466,10 +1461,7 @@ public class GoodsmngrController {
content.put("goodsDftinfoInvntryPolicyList", cgo134List); // 재고에 따른 판매 content.put("goodsDftinfoInvntryPolicyList", cgo134List); // 재고에 따른 판매
maComncdVO = new BOMaComncdVO(); List<DataMap> iconList = service.selectBOGoodsBadgeList(vo);
maComncdVO.setGroupCd("GOODS_ICON");
List<?> iconList = bOMaComncdService.selectBOCommcdDetailList(maComncdVO);
//브랜드 목록조회 //브랜드 목록조회

View File

@@ -197,11 +197,12 @@ public class MngrLoginController {
log.debug("리프레쉬 토큰이 없는 경우 realm :: {}", realm); log.debug("리프레쉬 토큰이 없는 경우 realm :: {}", realm);
//엑세스토큰 삭제 //엑세스토큰 삭제
CookieUtils.deleteCookie("ACT","/"+realm, request, response); CookieUtils.deleteCookie("ACT","/", request, response);
CookieUtils.deleteCookie("token_expire","/"+realm, request, response); CookieUtils.deleteCookie("RFT","/" + realm + "/tokens/refresh", request, response);
CookieUtils.deleteCookie("token_expire","/", request, response);
response.sendRedirect("/"+realm); response.sendRedirect("/"+realm);
return;
} }
//리프레쉬 토큰 있을 경우(존재한다는 자체가 refresh토큰이 만료된 상태가 아님) //리프레쉬 토큰 있을 경우(존재한다는 자체가 refresh토큰이 만료된 상태가 아님)

View File

@@ -38,6 +38,7 @@ import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
@@ -607,6 +608,24 @@ public class DlivyController {
// ); // );
} }
/**
* 배치 > 출고 상태 변경 ( 배송중, 배송완료 )
* @param boDlivyVO
* @return String
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/updateDlivySttusGetbackBatchUpdt", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateDlivySttusGetbackBatchUpdt(@RequestBody BODlivyVO boDlivyVO) {
Map<String, Object> message = new HashMap<>();
message = service.updateBODlivySttusGetbackUpdt(boDlivyVO);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/** /**
* 다운로드 항목 조회 * 다운로드 항목 조회

View File

@@ -45,9 +45,12 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.io.IOException; import java.io.IOException;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
/** /**
@@ -622,6 +625,8 @@ public class OrdrmngrController {
} }
} }
/** /**
* 주문내역서 팝업 화면 이동 * 주문내역서 팝업 화면 이동
* @param model * @param model
@@ -1056,6 +1061,14 @@ public class OrdrmngrController {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource)); throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
} }
String cstmclerCd = ordrShippingVO.getCstmclerCd();
String cstmclerCdReg = "^P\\d{12}$";
if (cstmclerCd == null || cstmclerCd.trim().isEmpty()) {
throw new WnbtRestException("개인통관번호은(는) 필수 입력값입니다.");
}else if (!cstmclerCd.matches(cstmclerCdReg)) {
throw new WnbtRestException("개인통관번호는 P로 시작하는 13자리 부호만 입력할 수 있습니다.");
}
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
ordrShippingVO.setUpdusr(user.getUserInnb()); ordrShippingVO.setUpdusr(user.getUserInnb());
@@ -1682,6 +1695,239 @@ public class OrdrmngrController {
다운로드항목설정 종료 다운로드항목설정 종료
#################################### */ #################################### */
/* ####################################
발주서 관리 시작
#################################### */
/**
* 발주서 관리 화면 이동
* @param ordrSrchVO
* @return String
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectExcelPoListInqireRForm")
public String selectExcelPoListInqireForm(ModelMap model, BOOrdrSrchVO ordrSrchVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
ordrSrchVO.setSopmalCd(authSopmalCd);
model.addAttribute("sopmalCd", ordrSrchVO.getSopmalCd());
model.addAttribute("ordrSrchVO", ordrSrchVO);
// 공통코드 호출
BOMaComncdVO bOMaComncdVO = new BOMaComncdVO();
bOMaComncdVO.setGroupCd("NATION_CD"); // 국가코드(NATION_CD)
model.addAttribute("nationCdList", bOMaComncdService.selectBOCommcdDetailList(bOMaComncdVO));
return "mngr/ordr/ordrmngr/PurchOrdrListInqireRForm";
}
/**
* 발주서 목록 조회
* @param ordrSrchVO
* @return String
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value= "/selectExcelPoListInqire" , method = RequestMethod.POST)
public String selectExcelPoListInqire(ModelMap model, BOOrdrSrchVO ordrSrchVO, @CookieValue(value = "authSopmalCd") String authSopmalCd){
Map<String, Object> content = new HashMap<>();
String secretKey = commonService.selectSecretkey();
ordrSrchVO.setSecretKey(secretKey);
ordrSrchVO.setSopmalCd(authSopmalCd);
ordrSrchVO.setSrchOrdrSttusCd("35");
//페이징 처리를 위한 pagination 객체 생성
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(ordrSrchVO.getPageIndex());
paginationInfo.setRecordCountPerPage(ordrSrchVO.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
ordrSrchVO.setPaginationInfo(paginationInfo);
//페이징 처리를 위한 값 설정
ordrSrchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
ordrSrchVO.setLastIndex(paginationInfo.getLastRecordIndex());
ordrSrchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
//회원 목록 조회 결과 및 페이징정보 넣기
content.put("paginationInfo", ordrSrchVO.getPaginationInfo());
content.put("resultList", service.selectExcelPoList(ordrSrchVO));
model.addAttribute("resultMap", content);
model.addAttribute("ordrSrchVO", ordrSrchVO);
return "mngr/ordr/ordrmngr/PurchOrdrListInqireR";
}
/**
* 주문내역서 팝업 화면 이동
* @param model
* @param ordrSrchVO
* @return OrdrDtstmnDwldPopupR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectPurchOrdrDtstmnDwldPopupForm")
public String selectPurchOrdrDtstmnDwldPopupForm(ModelMap model, BOOrdrSrchVO ordrSrchVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) throws Exception {
Map<String, Object> content = new HashMap<>();
BOOrdrVO ordrVO = new BOOrdrVO();
ordrVO.setOrdrInnbs(ordrSrchVO.getSrchOrdrInnbs());
ordrVO.setSopmalCd(authSopmalCd);
content.put("ordrDtstmnDwldList", service.selectOrdrDtstmnDwld(ordrVO));
model.addAttribute("data", content);
model.addAttribute("ordrSrchVO", ordrSrchVO);
return "mngr/ordr/ordrmngr/PurchOrdrDtstmnDwldPopupR";
}
/**
* 발주서 엑셀다운로드
* @param response
* @param ordrSrchVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value="/selectExcelPoDwldListInqire")
public void selectPurchOrderExcelList(HttpServletResponse response, BOOrdrSrchVO ordrSrchVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
String secretKey = commonService.selectSecretkey();
ordrSrchVO.setSecretKey(secretKey);
ordrSrchVO.setSopmalCd(authSopmalCd);
ordrSrchVO.setSrchOrdrSttusCd("35");
//엑셀 항목별 제목에 출력될 내용 설정
LinkedHashMap<String, String> headerMap = new LinkedHashMap<String, String>();
List<String> headerValues = List.of(
"날짜",
"업체코드",
"업체명",
"업체TEL",
"업체주소",
"특별통관업체명",
"특별통관번호",
"주문번호",
"용도구분",
"수취인",
"수취인TEL",
"수취인HP",
"개인통관고유부호",
"우편번호",
"주소",
"나머지주소",
"메모",
"고객 구입사이트",
"무게",
"포장개수",
"HS CODE",
"상거래유형",
"내용물",
"Unit Value",
"상품개수",
"Value",
"Brand",
"사전식품신고 종류",
"제조국",
"제조회사명",
"중문상품명",
"Shipper 구입사이트",
"판매중개업체명",
"판매중개업체 등록부호",
"구매(배송)대행업체명",
"구매(배송)대행업체 등록부호",
"해외판매자명",
"해외판매자 등록부호",
"사이트 주문번호"
);
for (int i = 0; i < headerValues.size(); i++) {
headerMap.put(String.format("item%02d", i + 1), headerValues.get(i));
}
String[] ordrInnbs = ordrSrchVO.getSrchOrdrInnbs();
String[] ordrDlvyInnbs = ordrSrchVO.getSrchOrdrDlvyInnbs();
List<Map<String, String>> srchInnbPairs = new ArrayList<>();
if (ordrInnbs != null && ordrDlvyInnbs != null) {
for (int i = 0; i < ordrInnbs.length; i++) {
Map<String, String> pair = new HashMap<>();
pair.put("srchOrdrInnb", ordrInnbs[i]);
pair.put("srchOrdrDlvyInnb", ordrDlvyInnbs[i]);
srchInnbPairs.add(pair);
}
}
ordrSrchVO.setSrchInnbPairs(srchInnbPairs);
//엑셀 항목에 출력될 내용 설정
List<DataMap> resultList = service.selectExcelPoListDwld(ordrSrchVO);
List<Map<String, Object>> excelList = new ArrayList<>();
if (resultList != null) {
for (int i = 0; i < resultList.size(); i++) {
HashMap<String, Object> dataMap = new HashMap<>();
// int cellInt = 1; // 셀 타입 = 숫자
List<Object> dataValues = Arrays.asList(
resultList.get(i).get("ordrRceptDt"),
resultList.get(i).get("entrpsCd"),
resultList.get(i).get("entrpsNm"),
resultList.get(i).get("entrpsTel"),
resultList.get(i).get("entrpsAdres"),
resultList.get(i).get("spclCstmclerEntrps"),
resultList.get(i).get("spclCstmclerCd"),
resultList.get(i).get("ordrInnb"),
resultList.get(i).get("purpsDv"),
resultList.get(i).get("recpntNm"),
resultList.get(i).get("recpntMbtlnb"),
resultList.get(i).get("recpntHp"),
resultList.get(i).get("cstmclerCd"),
resultList.get(i).get("dlvylcZip"),
resultList.get(i).get("dlvylcRnmLnbAdres"),
resultList.get(i).get("dlvylcAdresDtl"),
resultList.get(i).get("dlvyMssageCn"),
resultList.get(i).get("cstmrPurchsSite"),
resultList.get(i).get("realWt"),
resultList.get(i).get("packageCnt"),
resultList.get(i).get("hscode"),
resultList.get(i).get("cmmrcTy"),
resultList.get(i).get("cn"),
resultList.get(i).get("unitValue"),
resultList.get(i).get("ordrQy"),
resultList.get(i).get("value"),
resultList.get(i).get("brand"),
resultList.get(i).get("preFoodDcl"),
resultList.get(i).get("provdNation"),
resultList.get(i).get("provdCmpnyNm"),
resultList.get(i).get("chnlngGoodsNm"),
resultList.get(i).get("shipperPurchsSite"),
resultList.get(i).get("sleAgntEntrpsNm"),
resultList.get(i).get("sleAgntEntrpsRegistCd"),
resultList.get(i).get("purchsDlvyAgencyNm"),
resultList.get(i).get("purchsDlvyAgencyRegistCd"),
resultList.get(i).get("ovseaSelerNm"),
resultList.get(i).get("ovseaSelerRegistCd"),
resultList.get(i).get("siteOrdrInnb")
);
for (int j = 0; j < dataValues.size(); j++) {
dataMap.put(String.format("item%02d", j + 1), dataValues.get(j));
}
excelList.add(dataMap);
}
}
/******************************************************************/
try {
//엑셀생성 및 다운로드
/*LocalDateTime now = LocalDateTime.now();
String excelFileName = "발주서_";
excelFileName += String.format("%s~%s", ordrSrchVO.getSrchStartDate(), ordrSrchVO.getSrchEndDate()); // 엑셀 다운로드 파일명*/
String excelFileName = "발주서";
String encodedFileName = URLEncoder.encode(excelFileName, StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
ExcelDownloadUtil.createExcel(encodedFileName, headerMap, excelList, response);
service.updateExcelDownDt(ordrSrchVO);
} catch (IOException ioe) {
log.error("엑셀다운로드 중 오류가 발생하였습니다.", ioe);
throw new WnbtRestException("엑셀다운로드 중 오류가 발생하였습니다.");
}
}
/* ####################################
발주서 관리 종료
#################################### */
/* #################################### /* ####################################
주문조회 팝업 시작 주문조회 팝업 시작
#################################### */ #################################### */

View File

@@ -393,14 +393,6 @@ public class PurchsEvtController {
tempVO.setEndAmt(null); tempVO.setEndAmt(null);
} }
if ("01".equals(purchsEvtVO.getDscntBnefDvCd())) {
tempVO.setBgnAmt("0");
tempVO.setEndAmt("0");
} else if ("02".equals(purchsEvtVO.getDscntBnefDvCd())) {
tempVO.setBgnCnt("0");
tempVO.setEndCnt("0");
}
} }
for (BOPurchsEvtDiscountBnefVO tempVO : purchsEvtVO.getDiscountBnefVOList()) { for (BOPurchsEvtDiscountBnefVO tempVO : purchsEvtVO.getDiscountBnefVOList()) {

View File

@@ -0,0 +1,103 @@
package com.wb.domainserver.domain.mngr.setup.cost;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.domain.gcone.setup.cost.service.BOCostService;
import com.wb.domainserver.domain.gcone.setup.cost.vo.BOCostVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 원가 설정 Controller
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-05-29 이대환 최초 생성
*
* </pre>
* @since 2026-05-29
*/
@Controller
@RequestMapping("/mngr/setup/cost")
@Slf4j
public class CostController {
/** WebClient 호출을 위한 wrapper */
@Autowired
WnbtWebClientResponseHandler responseHandler;
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
@Autowired
private BOCostService service;
/**
* 원가 설정 페이지 이동
*
* @param vo
* @return CostPriceUpdtU.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectCostPriceSetup")
public String selectCostPriceSetup(BOCostVO vo, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
DataMap content = new DataMap();
content.put("costList", service.selectBOCostPriceList(vo));
model.addAttribute("resultMap", content);
return "mngr/setup/cost/CostPriceUpdtU";
}
/**
* 원가 설정 수정
*
* @param vo
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/updateCostPriceSetup", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateCostPriceSetup(@Validated BOCostVO vo, BindingResult bindingResult, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
if (bindingResult.hasErrors()) {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
}
DataMap message = service.updateBOCostPriceSetup(vo);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
}

View File

@@ -0,0 +1,116 @@
package com.wb.domainserver.domain.mngr.setup.exchngrt;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.gcone.setup.exchngrt.service.BOExchngrtService;
import com.wb.domainserver.domain.gcone.setup.exchngrt.vo.BOExchngrtVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 환율 설정 Controller
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Controller
@RequestMapping("/mngr/setup/exchngrt")
@Slf4j
public class ExchngrtController {
/** WebClient 호출을 위한 wrapper */
@Autowired
WnbtWebClientResponseHandler responseHandler;
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
@Autowired
private BOExchngrtService service;
@Autowired
private BOMaSopmalService bOMaSopmalService;
/**
* 환율 설정 페이지 이동
*
* @param boMaSopmalVO
* @return NbkkSetupListR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectExchngrtSetup")
public String selectExchngrtSetup(BOMaSopmalVO boMaSopmalVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
DataMap content = new DataMap();
boMaSopmalVO.setSopmalCd(authSopmalCd);
content.put("sopmalDetailList", bOMaSopmalService.selectBOSopmalUpdtForm(boMaSopmalVO));
model.addAttribute("resultMap", content);
return "mngr/setup/exchngrt/ExchngrtUpdtU";
}
/**
* 환율 설정 수정
*
* @param boExchngrtVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/updateExchngrtSetup", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateExchngrtSetup(@Validated BOExchngrtVO boExchngrtVO, BindingResult bindingResult, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
//등록자 수정자 set
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
boExchngrtVO.setRegusr(user.getUserInnb());
boExchngrtVO.setUpdusr(user.getUserInnb());
boExchngrtVO.setSopmalCd(authSopmalCd);
if (bindingResult.hasErrors()) {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
}
DataMap message = service.updateBOExchngrtSetup(boExchngrtVO.setBOMaSopmalVO());
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
}

View File

@@ -0,0 +1,115 @@
package com.wb.domainserver.domain.mngr.setup.family;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.gcone.setup.family.service.BOFamilyService;
import com.wb.domainserver.domain.gcone.setup.family.vo.BOFamilyVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 패밀리사이트 설정 Controller
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Controller
@RequestMapping("/mngr/setup/family")
@Slf4j
public class FamilyController {
/** WebClient 호출을 위한 wrapper */
@Autowired
WnbtWebClientResponseHandler responseHandler;
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
@Autowired
private BOFamilyService service;
@Autowired
private BOMaSopmalService bOMaSopmalService;
/**
* 패밀리사이트 설정 페이지 이동
*
* @param boMaSopmalVO
* @return NbkkSetupListR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectFamilySiteSetup")
public String selectFamilySiteSetup(BOMaSopmalVO boMaSopmalVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
DataMap content = new DataMap();
boMaSopmalVO.setSopmalCd(authSopmalCd);
content.put("siteList", bOMaSopmalService.selectBOSopmalUpdtFormSitelList(boMaSopmalVO));
model.addAttribute("resultMap", content);
return "mngr/setup/family/FamilySiteUpdtU";
}
/**
* 패밀리사이트 설정 수정
*
* @param boFamilyVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/updateFamilySiteSetup", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateNbkkSetup(@Validated BOFamilyVO boFamilyVO, BindingResult bindingResult, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
//등록자 수정자 set
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
boFamilyVO.setRegusr(user.getUserInnb());
boFamilyVO.setUpdusr(user.getUserInnb());
boFamilyVO.setSopmalCd(authSopmalCd);
if (bindingResult.hasErrors()) {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
}
DataMap message = service.updateBOFamilySetup(boFamilyVO.setBOMaSopmalVO());
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
}

View File

@@ -0,0 +1,117 @@
package com.wb.domainserver.domain.mngr.setup.guidance;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.gcone.setup.guidance.service.BOGuidanceService;
import com.wb.domainserver.domain.gcone.setup.guidance.vo.BOGuidanceVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 안내문구 설정 Controller
*
* @author 이대환
* @version 1.0
* @see <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-04-27 이대환 최초 생성
*
* </pre>
* @since 2026-04-27
*/
@Controller
@RequestMapping("/mngr/setup/guidance")
@Slf4j
public class GuidanceController {
/** WebClient 호출을 위한 wrapper */
@Autowired
WnbtWebClientResponseHandler responseHandler;
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
@Autowired
private BOGuidanceService service;
@Autowired
private BOMaSopmalService bOMaSopmalService;
/**
* 안내문구 설정 페이지 이동
*
* @param boMaSopmalVO
* @return NbkkSetupListR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectGuidanceSetup")
public String selectNbkkSetupList(BOMaSopmalVO boMaSopmalVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
DataMap content = new DataMap();
boMaSopmalVO.setSopmalCd(authSopmalCd);
content.put("sopmalDetailList", bOMaSopmalService.selectBOSopmalUpdtForm(boMaSopmalVO));
model.addAttribute("resultMap", content);
model.addAttribute("sopmalCd", authSopmalCd);
return "mngr/setup/guidance/GuidanceUpdtU";
}
/**
* 안내문구 설정 수정
*
* @param boGuidanceVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/updateGuidanceSetup", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateGuidanceSetup(@Validated BOGuidanceVO boGuidanceVO, BindingResult bindingResult, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
//등록자 수정자 set
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
boGuidanceVO.setRegusr(user.getUserInnb());
boGuidanceVO.setUpdusr(user.getUserInnb());
boGuidanceVO.setSopmalCd(authSopmalCd);
if (bindingResult.hasErrors()) {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
}
DataMap message = service.updateBOGuidanceSetup(boGuidanceVO.setBOMaSopmalVO());
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
}

View File

@@ -1,6 +1,8 @@
package com.wb.domainserver.domain.mngr.setup.ordr.controller; package com.wb.domainserver.domain.mngr.setup.ordr.controller;
import com.wb.domainserver.common.msg.GconeMessageSource; import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.gcone.setup.ordrmngr.service.BOOrdrMngrService; import com.wb.domainserver.domain.gcone.setup.ordrmngr.service.BOOrdrMngrService;
import com.wb.domainserver.domain.gcone.setup.ordrmngr.vo.BOSetupOrdrVO; import com.wb.domainserver.domain.gcone.setup.ordrmngr.vo.BOSetupOrdrVO;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
@@ -13,6 +15,7 @@ import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy; import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc; import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter; import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil; import com.wb.domainserver.util.string.StringUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -63,6 +66,8 @@ public class SetupOrdrController {
@Autowired @Autowired
private BOOrdrMngrService service; private BOOrdrMngrService service;
@Autowired
private BOMaSopmalService bOMaSopmalService;
/** /**
@@ -73,15 +78,14 @@ public class SetupOrdrController {
@Policy(AuthPolicy.RESTRICTED) @Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectOrdrSetupList") @RequestMapping(value="/selectOrdrSetupList")
public String selectOrdrSetupList(ModelMap model, BOSetupOrdrVO boOrdrVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) { public String selectOrdrSetupList(ModelMap model, BOSetupOrdrVO boOrdrVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
DataMap content = new DataMap();
boOrdrVO.setSopmalCd(authSopmalCd); boOrdrVO.setSopmalCd(authSopmalCd);
content.put("ordrSetupList", service.selectBOOrdrSetupList(boOrdrVO));
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); BOMaSopmalVO boMaSopmalVO = new BOMaSopmalVO();
if("01".equals(user.getSysDvCd())){ boMaSopmalVO.setSopmalCd(authSopmalCd);
boOrdrVO.setSopmalCd(user.getSopmalCd()); content.put("sopmalDetailList", bOMaSopmalService.selectBOSopmalUpdtForm(boMaSopmalVO));
}
Map<String, Object> content = service.selectBOOrdrSetupList(boOrdrVO);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse( // responseHandler.handleResponse(
@@ -154,6 +158,19 @@ public class SetupOrdrController {
vo.setMlgMxmmPymntAmt(null); vo.setMlgMxmmPymntAmt(null);
} }
//마일리지 사용 조건 파라미터 정제
if(!StringUtil.isEmpty(vo.getMlgHoldUseAmt()))
vo.setMlgHoldUseAmt(StringUtil.removeCommaChar(vo.getMlgHoldUseAmt()));
if(!StringUtil.isEmpty(vo.getMlgSetleAmtUseAmt()))
vo.setMlgSetleAmtUseAmt(StringUtil.removeCommaChar(vo.getMlgSetleAmtUseAmt()));
if(!StringUtil.isEmpty(vo.getMlgMummUseAmt()))
vo.setMlgMummUseAmt(StringUtil.removeCommaChar(vo.getMlgMummUseAmt()));
if(!StringUtil.isEmpty(vo.getMlgMxmmUseAmt()))
vo.setMlgMxmmUseAmt(StringUtil.removeCommaChar(vo.getMlgMxmmUseAmt()));
//등록자 수정자 set //등록자 수정자 set
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){ if("01".equals(user.getSysDvCd())){

View File

@@ -1385,6 +1385,8 @@ public class CscController {
url = this.selectSubPageListForm(request, model, bbsctt); //서브페이지 url = this.selectSubPageListForm(request, model, bbsctt); //서브페이지
} else if ("useGuidance".equals(bbsctt.getReqUrl())) { } else if ("useGuidance".equals(bbsctt.getReqUrl())) {
url = this.selectUseGuidanceForm(request, model, bbsctt); //이용안내 url = this.selectUseGuidanceForm(request, model, bbsctt); //이용안내
} else if ("detail".equals(bbsctt.getReqUrl())) {
url = this.selectBbscttDtlInqire(request, model, bbsctt); //기타(상세보기)
} }
} else if ("REGIST".equals(bbsctt.getAuthDv())) { //등록 이동 } else if ("REGIST".equals(bbsctt.getAuthDv())) { //등록 이동
if ("modal".equals(bbsctt.getReqUrl())) { if ("modal".equals(bbsctt.getReqUrl())) {
@@ -1571,9 +1573,24 @@ public class CscController {
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap(); DataMap bbsInfo = new DataMap();
bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO); bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO);
// 등록 기능 사용 여부와 별개로 현재 사용자의 등록 권한을 확인한다.
BOGnrlbbscttVO registAuthBbsctt = new BOGnrlbbscttVO();
registAuthBbsctt.setSopmalCd(user.getSopmalCd());
registAuthBbsctt.setBbsId(bbsctt.getBbsId());
registAuthBbsctt.setServerDv("sopmal");
registAuthBbsctt.setAuthDv("REGIST");
if (user.getUserInnb() > 0) {
registAuthBbsctt.setRegusr(user.getUserInnb());
registAuthBbsctt.setMbrDvCd(user.getMbrDvCd());
} else {
registAuthBbsctt.setRegusr(0);
}
DataMap registAuth = service.selectBOBbscttAuth(registAuthBbsctt);
DataMap content = new DataMap(); DataMap content = new DataMap();
content.put("bbsInfo", bbsInfo); content.put("bbsInfo", bbsInfo);
content.put("registAuthResult", registAuth.get("resultAuth"));
content.put("bbsctt", bbsctt); content.put("bbsctt", bbsctt);
content.put("resultList", resultList); content.put("resultList", resultList);
content.put("paginationInfo", bbsctt.getPaginationInfo()); content.put("paginationInfo", bbsctt.getPaginationInfo());

View File

@@ -21,6 +21,7 @@ import com.wb.domainserver.domain.gcone.setup.dlvygrp.service.BODlvygrpService;
import com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO; import com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO;
import com.wb.domainserver.domain.gcone.setup.ordrmngr.service.BOOrdrMngrService; import com.wb.domainserver.domain.gcone.setup.ordrmngr.service.BOOrdrMngrService;
import com.wb.domainserver.domain.gcone.setup.ordrmngr.vo.BOSetupOrdrVO; import com.wb.domainserver.domain.gcone.setup.ordrmngr.vo.BOSetupOrdrVO;
import com.wb.domainserver.realm.util.UrlExtractor;
import com.wb.domainserver.response.ApiResponse; import com.wb.domainserver.response.ApiResponse;
import com.wb.domainserver.response.WnbtResponse; import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody; import com.wb.domainserver.response.WnbtResponseBody;
@@ -189,6 +190,23 @@ public class GoodsController {
return Util.getDeviceType(request)+"/goods/GoodsSrchRForm"; return Util.getDeviceType(request)+"/goods/GoodsSrchRForm";
} }
/**
* 사용자 화면 상품 배지 목록 조회
* @return
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value = "/selectGoodsBadgeList", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<DataMap>> selectGoodsBadgeList() {
BOGoodsVO vo = new BOGoodsVO();
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
return ResponseEntity.ok(service.selectBOGoodsBadgeList(vo));
}
/** /**
* 상품 검색 리스트 * 상품 검색 리스트
* @param vo * @param vo
@@ -210,6 +228,42 @@ public class GoodsController {
return Util.getDeviceType(request)+"/goods/GoodsSrchR"; return Util.getDeviceType(request)+"/goods/GoodsSrchR";
} }
/**
* 검색어 로그 저장
* @param vo
* @return
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value = "/insertSrchwrdLog", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> insertSrchwrdLog(HttpServletRequest request, BOGoodsVO vo) {
//사용자 정보 추출 및 적용
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
vo.setMbrInnb(String.valueOf(user.getUserInnb()));
}
//요청 URL
String url = request.getRequestURI();
vo.setConectUrl(url);
//host 정보
String host = request.getHeader("X-Original-Host") != null ? request.getHeader("X-Original-Host") : UrlExtractor.getOriginalHost(request);
vo.setConectDomn(host);
DataMap message = service.insertBOSrchwrdLog(vo);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/goods/goods/selectBOSrchGoodsNm", vo),
// ReplyFromResrc::getReply
// );
}
/** /**
* 상품명 검색어 조회 * 상품명 검색어 조회
* @param vo * @param vo
@@ -251,6 +305,14 @@ public class GoodsController {
public String selectGoodsListForm(HttpServletRequest request, public String selectGoodsListForm(HttpServletRequest request,
BOGoodsVO vo, BOGoodsVO vo,
ModelMap model) { ModelMap model) {
String mobileParentCtgryId = request.getParameter("mobileParentCtgryId");
String mobileCurrentCtgryId = request.getParameter("mobileCurrentCtgryId");
boolean mobileSubCategorySelected = mobileParentCtgryId != null && !mobileParentCtgryId.isBlank()
&& mobileCurrentCtgryId != null && !mobileCurrentCtgryId.isBlank();
if (mobileSubCategorySelected) {
vo.setCtgryId(mobileParentCtgryId);
}
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){ if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd()); vo.setSopmalCd(user.getSopmalCd());
@@ -268,7 +330,7 @@ public class GoodsController {
//검색한 카테고리 정보로 vo 세팅 //검색한 카테고리 정보로 vo 세팅
if(!CollectionUtils.isEmpty(goodsCategoryList)){ if(!CollectionUtils.isEmpty(goodsCategoryList)){
vo.setUpperCtgryId(goodsCategoryList.get(0).get("baseCtgryId").toString()); vo.setUpperCtgryId(goodsCategoryList.get(0).get("baseCtgryId").toString());
vo.setCtgryId(goodsCategoryList.get(0).get("baseCtgryId").toString()); vo.setCtgryId(mobileSubCategorySelected ? mobileCurrentCtgryId : goodsCategoryList.get(0).get("baseCtgryId").toString());
}else{ }else{
vo.setUpperCtgryId("0"); vo.setUpperCtgryId("0");
vo.setCtgryId("0"); vo.setCtgryId("0");
@@ -425,6 +487,7 @@ public class GoodsController {
// 상세 조회 // 상세 조회
DataMap goodsDtl = service.selectBOGoodsDtlInfo(vo); DataMap goodsDtl = service.selectBOGoodsDtlInfo(vo);
List<DataMap> goodsBadgeList = service.selectBOGoodsBadgeList(vo);
//상품 옵션 조회 //상품 옵션 조회
DataMap goodsOptList = service.selectBOGoodsOptionList(vo); DataMap goodsOptList = service.selectBOGoodsOptionList(vo);
@@ -476,6 +539,7 @@ public class GoodsController {
//담기 //담기
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("goodsDtl", goodsDtl); content.put("goodsDtl", goodsDtl);
content.put("goodsBadgeList", goodsBadgeList);
content.put("evtBannerList", evtBannerList); content.put("evtBannerList", evtBannerList);
content.put("goodsOptList", goodsOptList); content.put("goodsOptList", goodsOptList);
content.put("GoodsRelateInfo", goodsReleateInfo); content.put("GoodsRelateInfo", goodsReleateInfo);

View File

@@ -153,6 +153,8 @@ public class LoginController {
CookieUtils.deleteCookie("token_expire", "/", request, response); CookieUtils.deleteCookie("token_expire", "/", request, response);
response.sendRedirect("/sopmal/login/page/" + RealmContextHolder.getRealm() + "?redirect_uri=" + URLEncoder.encode(request.getParameter("redirect_uri"), StandardCharsets.UTF_8)); response.sendRedirect("/sopmal/login/page/" + RealmContextHolder.getRealm() + "?redirect_uri=" + URLEncoder.encode(request.getParameter("redirect_uri"), StandardCharsets.UTF_8));
// 로그인 이동을 확정한 뒤 원래 URL로 다시 리다이렉트하지 않는다.
return;
}else{ }else{
//리프레쉬 토큰 있을 경우(존재한다는 자체가 refresh토큰이 만료된 상태가 아님) //리프레쉬 토큰 있을 경우(존재한다는 자체가 refresh토큰이 만료된 상태가 아님)

View File

@@ -198,6 +198,20 @@ public class MainController {
} }
/**
* 사이트맵 XML
* @return
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value="/sitemap", produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<String> selectSitemapXml() {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
String xml = boMaSopmalService.selectSitemapXml(user.getSopmalCd());
return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(xml);
}
/** /**
* 비회원 휴대폰번호 확인 * 비회원 휴대폰번호 확인
* @return OrdrDtlR.jsp * @return OrdrDtlR.jsp
@@ -1015,4 +1029,14 @@ public class MainController {
); );
} }
/**
* 연령확인 팝업
* @return
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value="/sopmal/main/selectAgeChkPopup", produces = MediaType.APPLICATION_JSON_VALUE)
public String selectAgeChkPopup(HttpServletRequest request) {
return Util.getDeviceType(request)+"/main/AgeChkPopupR";
}
} }

View File

@@ -48,22 +48,22 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* MyActController Class (back) * MyActController Class (back)
* *
* @author 홍길동 * @author 홍길동
* @since 2024-02-05 * @since 2024-02-05
* @version 1.0 * @version 1.0
* @see * @see
* *
* <pre> * <pre>
* == (Modification Information) == 개정이력 * == (Modification Information) == 개정이력
* *
* 수정일 수정자 수정내용 * 수정일 수정자 수정내용
* ------- -------- --------------------------- * ------- -------- ---------------------------
* 2024-03-05 김혜인 최초 생성 * 2024-03-05 김혜인 최초 생성
* *
* </pre> * </pre>
*/ */
@Controller @Controller
@RequestMapping("/sopmal/mpage/act") @RequestMapping("/sopmal/mpage/act")
@@ -115,20 +115,9 @@ public class MyActController {
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// model,
// "resultMap"
// );
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyGoodsQaR"; return Util.getDeviceType(request)+"/mpage/act/MyGoodsQaR";
} }
@@ -147,20 +136,9 @@ public class MyActController {
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// model,
// "resultMap"
// );
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyNormalQaR"; return Util.getDeviceType(request)+"/mpage/act/MyNormalQaR";
} }
@@ -191,28 +169,22 @@ public class MyActController {
bbsctt.setRegusrDvCd("99");//비회원 bbsctt.setRegusrDvCd("99");//비회원
} }
bbsctt.setSecretKey(boCommonService.selectSecretkey()); bbsctt.setSecretKey(boCommonService.selectSecretkey());
// 게시판 설정 정보
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set
bbsVO.setSopmalCd(bbsctt.getSopmalCd()); bbsVO.setSopmalCd(bbsctt.getSopmalCd());
bbsVO.setBbsId(bbsctt.getBbsId()); bbsVO.setBbsId(bbsctt.getBbsId());
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap(); DataMap bbsInfo = new DataMap();
bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO); bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO);
// 게시글 상세 조회
Map<String, Object> bbscttInfo = new HashMap<String, Object>(); Map<String, Object> bbscttInfo = new HashMap<String, Object>();
bbscttInfo = service.selectBOBbscttUpdt(bbsctt); bbscttInfo = service.selectBOBbscttUpdt(bbsctt);
// 분류 조회
List<DataMap> itmList = new ArrayList<>(); List<DataMap> itmList = new ArrayList<>();
itmList = service.selectBOBbscttItmInqire(bbsctt); itmList = service.selectBOBbscttItmInqire(bbsctt);
//추가 항목 조회, 추가항목 항목 조회
Map<String, Object> qesitmList = new HashMap<String, Object>(); Map<String, Object> qesitmList = new HashMap<String, Object>();
qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt); qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt);
//리뷰항목 리스트, 리뷰항목 항목 리스트
Map<String, Object> rvwQesitmList = new HashMap<String, Object>(); Map<String, Object> rvwQesitmList = new HashMap<String, Object>();
rvwQesitmList = service.selectBOStarItm(bbsctt); rvwQesitmList = service.selectBOStarItm(bbsctt);
@@ -225,21 +197,10 @@ public class MyActController {
content.put("rvwQesitmList", rvwQesitmList); content.put("rvwQesitmList", rvwQesitmList);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttUpdtPopupForm",bbsctt),
// model,
// "resultMap"
// );
model.addAttribute("bbsctt", bbsctt); model.addAttribute("bbsctt", bbsctt);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyNormalQnaDtlUpdtU"; return Util.getDeviceType(request)+"/mpage/act/MyNormalQnaDtlUpdtU";
} }
@@ -255,7 +216,6 @@ public class MyActController {
bbsctt.setBbsTyCd("01"); bbsctt.setBbsTyCd("01");
bbsctt.setServerDv("sopmal"); bbsctt.setServerDv("sopmal");
bbsctt.setReqUrl("mpage"); bbsctt.setReqUrl("mpage");
//게시글 노출 항목 설정값과 게시판 목록 조회
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
return ResponseEntity.ok( return ResponseEntity.ok(
@@ -263,10 +223,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -280,7 +236,6 @@ public class MyActController {
bbsctt.setBbsTyCd("05"); bbsctt.setBbsTyCd("05");
bbsctt.setServerDv("sopmal"); bbsctt.setServerDv("sopmal");
bbsctt.setReqUrl("mpage"); bbsctt.setReqUrl("mpage");
//게시글 노출 항목 설정값과 게시판 목록 조회
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
return ResponseEntity.ok( return ResponseEntity.ok(
@@ -288,10 +243,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -315,10 +266,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOFileInfo",bbsctt),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -346,28 +293,22 @@ public class MyActController {
bbsctt.setRegusrDvCd("99");//비회원 bbsctt.setRegusrDvCd("99");//비회원
} }
bbsctt.setSecretKey(boCommonService.selectSecretkey()); bbsctt.setSecretKey(boCommonService.selectSecretkey());
// 게시판 설정 정보
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set
bbsVO.setSopmalCd(bbsctt.getSopmalCd()); bbsVO.setSopmalCd(bbsctt.getSopmalCd());
bbsVO.setBbsId(bbsctt.getBbsId()); bbsVO.setBbsId(bbsctt.getBbsId());
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap(); DataMap bbsInfo = new DataMap();
bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO); bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO);
// 게시글 상세 조회
Map<String, Object> bbscttInfo = new HashMap<String, Object>(); Map<String, Object> bbscttInfo = new HashMap<String, Object>();
bbscttInfo = service.selectBOBbscttUpdt(bbsctt); bbscttInfo = service.selectBOBbscttUpdt(bbsctt);
// 분류 조회
List<DataMap> itmList = new ArrayList<>(); List<DataMap> itmList = new ArrayList<>();
itmList = service.selectBOBbscttItmInqire(bbsctt); itmList = service.selectBOBbscttItmInqire(bbsctt);
//추가 항목 조회, 추가항목 항목 조회
Map<String, Object> qesitmList = new HashMap<String, Object>(); Map<String, Object> qesitmList = new HashMap<String, Object>();
qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt); qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt);
//리뷰항목 리스트, 리뷰항목 항목 리스트
Map<String, Object> rvwQesitmList = new HashMap<String, Object>(); Map<String, Object> rvwQesitmList = new HashMap<String, Object>();
rvwQesitmList = service.selectBOStarItm(bbsctt); rvwQesitmList = service.selectBOStarItm(bbsctt);
@@ -380,24 +321,14 @@ public class MyActController {
content.put("rvwQesitmList", rvwQesitmList); content.put("rvwQesitmList", rvwQesitmList);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttUpdtPopupForm",bbsctt),
// model,
// "resultMap"
// );
model.addAttribute("bbsctt", bbsctt); model.addAttribute("bbsctt", bbsctt);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyGoodsQnaDtlUpdtU"; return Util.getDeviceType(request)+"/mpage/act/MyGoodsQnaDtlUpdtU";
} }
/** /**
* 1:1 문의 조회 * 1:1 문의 조회
* @param bbsctt * @param bbsctt
@@ -412,23 +343,13 @@ public class MyActController {
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// model,
// "resultMap"
// );
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyM2mQaR"; return Util.getDeviceType(request)+"/mpage/act/MyM2mQaR";
} }
/** /**
* 1:1 문의 ajax 조회 * 1:1 문의 ajax 조회
* @param bbsctt * @param bbsctt
@@ -440,7 +361,6 @@ public class MyActController {
bbsctt.setBbsTyCd("12"); bbsctt.setBbsTyCd("12");
bbsctt.setServerDv("sopmal"); bbsctt.setServerDv("sopmal");
bbsctt.setReqUrl("mpage"); bbsctt.setReqUrl("mpage");
//게시글 노출 항목 설정값과 게시판 목록 조회
DataMap content = selectBOBbscttListInqire(bbsctt); DataMap content = selectBOBbscttListInqire(bbsctt);
return ResponseEntity.ok( return ResponseEntity.ok(
@@ -448,10 +368,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttListInqire",bbsctt),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -480,28 +396,22 @@ public class MyActController {
bbsctt.setRegusrDvCd("99");//비회원 bbsctt.setRegusrDvCd("99");//비회원
} }
bbsctt.setSecretKey(boCommonService.selectSecretkey()); bbsctt.setSecretKey(boCommonService.selectSecretkey());
// 게시판 설정 정보
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set
bbsVO.setSopmalCd(bbsctt.getSopmalCd()); bbsVO.setSopmalCd(bbsctt.getSopmalCd());
bbsVO.setBbsId(bbsctt.getBbsId()); bbsVO.setBbsId(bbsctt.getBbsId());
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap(); DataMap bbsInfo = new DataMap();
bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO); bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO);
// 게시글 상세 조회
Map<String, Object> bbscttInfo = new HashMap<String, Object>(); Map<String, Object> bbscttInfo = new HashMap<String, Object>();
bbscttInfo = service.selectBOBbscttUpdt(bbsctt); bbscttInfo = service.selectBOBbscttUpdt(bbsctt);
// 분류 조회
List<DataMap> itmList = new ArrayList<>(); List<DataMap> itmList = new ArrayList<>();
itmList = service.selectBOBbscttItmInqire(bbsctt); itmList = service.selectBOBbscttItmInqire(bbsctt);
//추가 항목 조회, 추가항목 항목 조회
Map<String, Object> qesitmList = new HashMap<String, Object>(); Map<String, Object> qesitmList = new HashMap<String, Object>();
qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt); qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt);
//리뷰항목 리스트, 리뷰항목 항목 리스트
Map<String, Object> rvwQesitmList = new HashMap<String, Object>(); Map<String, Object> rvwQesitmList = new HashMap<String, Object>();
rvwQesitmList = service.selectBOStarItm(bbsctt); rvwQesitmList = service.selectBOStarItm(bbsctt);
@@ -514,21 +424,10 @@ public class MyActController {
content.put("rvwQesitmList", rvwQesitmList); content.put("rvwQesitmList", rvwQesitmList);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttUpdtPopupForm",bbsctt),
// model,
// "resultMap"
// );
model.addAttribute("bbsctt", bbsctt); model.addAttribute("bbsctt", bbsctt);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyM2mQnaDtlUpdtU"; return Util.getDeviceType(request)+"/mpage/act/MyM2mQnaDtlUpdtU";
} }
@@ -544,28 +443,17 @@ public class MyActController {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
bbsctt.setSopmalCd(user.getSopmalCd()); bbsctt.setSopmalCd(user.getSopmalCd());
/*리뷰 조회 폼*/
DataMap rvwBnefInfo = new DataMap(); DataMap rvwBnefInfo = new DataMap();
rvwBnefInfo = service.selectBORvwBnefInfo(bbsctt); rvwBnefInfo = service.selectBORvwBnefInfo(bbsctt);
model.addAttribute("mlgAccmlNtc", rvwBnefInfo); model.addAttribute("mlgAccmlNtc", rvwBnefInfo);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBORvwBnefInfo",bbsctt),
// model,
// "mlgAccmlNtc"
// );
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content2 = selectBOMpageInfoInqire(vo); Map<String, Object> content2 = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content2); model.addAttribute("mpageResultMap", content2);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire",bbsctt),
// model,
// "mpageResultMap"
// );
model.addAttribute("vo",bbsctt); model.addAttribute("vo",bbsctt);
return Util.getDeviceType(request)+"/mpage/act/MyRvwRForm"; return Util.getDeviceType(request)+"/mpage/act/MyRvwRForm";
} }
/** /**
* 나의 리뷰 조회 작성 가능한 리뷰 * 나의 리뷰 조회 작성 가능한 리뷰
* @param rvwVO * @param rvwVO
@@ -579,13 +467,9 @@ public class MyActController {
Map<String, Object> content = selectBOWritPosblRvw(rvwVO); Map<String, Object> content = selectBOWritPosblRvw(rvwVO);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOWritPosblRvw",rvwVO),
// model,
// "resultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/WritngPosblRvwR"; return Util.getDeviceType(request)+"/mpage/act/WritngPosblRvwR";
} }
/** /**
* 나의 리뷰 조회 작성 가능한 리뷰 ajax(인피니트스크롤) * 나의 리뷰 조회 작성 가능한 리뷰 ajax(인피니트스크롤)
* @param rvwVO * @param rvwVO
@@ -603,10 +487,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOWritPosblRvw",rvwVO),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -623,11 +503,6 @@ public class MyActController {
DataMap content = selectBOMyRvwListInqire(rvwVO); DataMap content = selectBOMyRvwListInqire(rvwVO);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOMyRvwListInqire",rvwVO),
// model,
// "resultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/MyRvwR"; return Util.getDeviceType(request)+"/mpage/act/MyRvwR";
} }
@@ -649,10 +524,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOMyRvwListInqire",rvwVO),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -665,15 +536,9 @@ public class MyActController {
public String selectRvwWritngPopupForm(HttpServletRequest request, ModelMap model, BOGnrlbbscttVO rvwVO){ public String selectRvwWritngPopupForm(HttpServletRequest request, ModelMap model, BOGnrlbbscttVO rvwVO){
rvwVO.setRvwBbscttDv("rvw"); rvwVO.setRvwBbscttDv("rvw");
rvwVO.setServerDv("sopmal"); rvwVO.setServerDv("sopmal");
//리뷰 등록 가능 여부 true시 등록폼 호출
Map<String, Object> content = selectBOBbscttRegistPopupForm(rvwVO); Map<String, Object> content = selectBOBbscttRegistPopupForm(rvwVO);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttRegistPopupForm",rvwVO),
// model,
// "resultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/RvwWritngPopupC"; return Util.getDeviceType(request)+"/mpage/act/RvwWritngPopupC";
} }
@@ -693,30 +558,24 @@ public class MyActController {
bbsctt.setSopmalCd(user.getSopmalCd()); bbsctt.setSopmalCd(user.getSopmalCd());
} }
// 작성자 정보 추출 if (user.getUserInnb() > 0) {
if (user.getUserInnb() > 0) { //회원 , 관리자
bbsctt.setUpdusr(user.getUserInnb()); bbsctt.setUpdusr(user.getUserInnb());
} else { // 비회원 } else {
bbsctt.setUpdusr(0); bbsctt.setUpdusr(0);
} }
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
/*게시글 삭제*/
DataMap bbscttDelResult = service.updateBOBbscttDel(bbsctt); DataMap bbscttDelResult = service.updateBOBbscttDel(bbsctt);
content.put("result", bbscttDelResult); content.put("result", bbscttDelResult);
/*삭제 성공 시*/
if ("success".equals(bbscttDelResult.get("result"))) { if ("success".equals(bbscttDelResult.get("result"))) {
//리뷰 관련 처리
if ("06".equals(bbsctt.getBbsTyCd()) || "07".equals(bbsctt.getBbsTyCd())) { if ("06".equals(bbsctt.getBbsTyCd()) || "07".equals(bbsctt.getBbsTyCd())) {
if (!CollectionUtils.isEmpty(bbsctt.getDelInfoArr())) { if (!CollectionUtils.isEmpty(bbsctt.getDelInfoArr())) {
/*해당 정보로 마일리지 금액 조회하기*/
List<Object> accmlmnyAmtInfoArr = new ArrayList<>(); List<Object> accmlmnyAmtInfoArr = new ArrayList<>();
BOMlgVO mlgVo = new BOMlgVO(); BOMlgVO mlgVo = new BOMlgVO();
for (BODelInfoVO delInfo : bbsctt.getDelInfoArr()) { for (BODelInfoVO delInfo : bbsctt.getDelInfoArr()) {
if ("01".equals(delInfo.getRegusrDvCd())) { if ("01".equals(delInfo.getRegusrDvCd())) {
if ("03".equals(user.getSysDvCd())) { //관리자 삭제시 마일리지 회수 if ("03".equals(user.getSysDvCd())) {
/*공통 파라미터*/
mlgVo.setMbrInnb(String.valueOf(delInfo.getRegusr())); mlgVo.setMbrInnb(String.valueOf(delInfo.getRegusr()));
mlgVo.setMbrDvCd(delInfo.getMbrDvCd()); mlgVo.setMbrDvCd(delInfo.getMbrDvCd());
mlgVo.setSopmalCd(bbsctt.getSopmalCd()); mlgVo.setSopmalCd(bbsctt.getSopmalCd());
@@ -728,8 +587,7 @@ public class MyActController {
mlgVo.setRegusr(user.getUserInnb()); mlgVo.setRegusr(user.getUserInnb());
mlgVo.setUpdusr(user.getUserInnb()); mlgVo.setUpdusr(user.getUserInnb());
/*마일리지 수동 회수 여부*/ if ("N".equals(bbsctt.getMlgPassivRtrvlAt())) {
if ("N".equals(bbsctt.getMlgPassivRtrvlAt())) { // 선택 삭제시
DataMap accmlmnyAmtInfo = new DataMap(); DataMap accmlmnyAmtInfo = new DataMap();
accmlmnyAmtInfo = mlgService.selectBOMlgByBbscttInnb(mlgVo); accmlmnyAmtInfo = mlgService.selectBOMlgByBbscttInnb(mlgVo);
if (accmlmnyAmtInfo != null) { if (accmlmnyAmtInfo != null) {
@@ -740,7 +598,7 @@ public class MyActController {
mlgVo.setAccmlmnyAmt((BigDecimal) accmlmnyAmtInfo.get("accmlmnyAmt")); mlgVo.setAccmlmnyAmt((BigDecimal) accmlmnyAmtInfo.get("accmlmnyAmt"));
mlgService.insertBOMngrMlgDn(mlgVo); mlgService.insertBOMngrMlgDn(mlgVo);
} }
} else { //단독 삭제시*/ } else {
if (delInfo.getRtrvlMlgAmt() != null) { if (delInfo.getRtrvlMlgAmt() != null) {
if (delInfo.getRtrvlMlgAmt().compareTo(BigDecimal.valueOf(0)) > 0) { if (delInfo.getRtrvlMlgAmt().compareTo(BigDecimal.valueOf(0)) > 0) {
mlgVo.setAccmlmnyAmt(delInfo.getRtrvlMlgAmt()); mlgVo.setAccmlmnyAmt(delInfo.getRtrvlMlgAmt());
@@ -749,7 +607,6 @@ public class MyActController {
} }
} }
} }
//회원 관련
if (delInfo.getRegusr() != null) { if (delInfo.getRegusr() != null) {
BOGnrlbbscttVO mbrSite = new BOGnrlbbscttVO(); BOGnrlbbscttVO mbrSite = new BOGnrlbbscttVO();
mbrSite.setSopmalCd(bbsctt.getSopmalCd()); mbrSite.setSopmalCd(bbsctt.getSopmalCd());
@@ -764,26 +621,20 @@ public class MyActController {
} }
} }
//상품관련 집계와 회원관련 집계는 관리자혹은 사용자가 모두 삭제 시 처리가 되어야해
//상품 관련
if (delInfo.getGoodsInnb() != null) { if (delInfo.getGoodsInnb() != null) {
BOGoodsVO goodsVO = new BOGoodsVO(); BOGoodsVO goodsVO = new BOGoodsVO();
goodsVO.setGoodsInnb(String.valueOf(delInfo.getGoodsInnb())); goodsVO.setGoodsInnb(String.valueOf(delInfo.getGoodsInnb()));
goodsVO.setSopmalCd(bbsctt.getSopmalCd()); goodsVO.setSopmalCd(bbsctt.getSopmalCd());
/*상품정보 > 상품후기건수 차감*/
goodsService.updateRvwRelateSm(goodsVO); goodsService.updateRvwRelateSm(goodsVO);
} }
} }
} }
} else if ("05".equals(bbsctt.getBbsTyCd())) {//상품qna는 상품문의 집계만 } else if ("05".equals(bbsctt.getBbsTyCd())) {
//상품 관련
if (!CollectionUtils.isEmpty(bbsctt.getGoodsInnbArr())) { if (!CollectionUtils.isEmpty(bbsctt.getGoodsInnbArr())) {
for (String goodsInnb : bbsctt.getGoodsInnbArr()) { for (String goodsInnb : bbsctt.getGoodsInnbArr()) {
BOGoodsVO goodsVO = new BOGoodsVO(); BOGoodsVO goodsVO = new BOGoodsVO();
goodsVO.setGoodsInnb(goodsInnb); goodsVO.setGoodsInnb(goodsInnb);
goodsVO.setSopmalCd(bbsctt.getSopmalCd()); goodsVO.setSopmalCd(bbsctt.getSopmalCd());
/*상품정보 > 상품후기건수 차감*/
goodsService.updateGoodsInqryCnt(goodsVO); goodsService.updateGoodsInqryCnt(goodsVO);
} }
} }
@@ -795,10 +646,6 @@ public class MyActController {
.resBody(new WnbtResponseBody(content)) .resBody(new WnbtResponseBody(content))
.build() .build()
); );
// return responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/updateBOBbscttDel",bbsctt),
// ReplyFromResrc::getReply
// );
} }
/** /**
@@ -814,11 +661,6 @@ public class MyActController {
Map<String, Object> content = selectBOBbscttRegistPopupForm(vo); Map<String, Object> content = selectBOBbscttRegistPopupForm(vo);
model.addAttribute("resultMap", content); model.addAttribute("resultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/bbs/gnrlbbsctt/selectBOBbscttRegistPopupForm", vo),
// model,
// "resultMap"
// );
return Util.getDeviceType(request)+"/mpage/act/RvwEasyRegistC"; return Util.getDeviceType(request)+"/mpage/act/RvwEasyRegistC";
} }
@@ -830,7 +672,7 @@ public class MyActController {
public DataMap selectBOBbscttListInqire(BOGnrlbbscttVO bbsctt) { public DataMap selectBOBbscttListInqire(BOGnrlbbscttVO bbsctt) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {//사용자 조회 일 경우 if ("01".equals(user.getSysDvCd())) {
bbsctt.setSopmalCd(user.getSopmalCd()); bbsctt.setSopmalCd(user.getSopmalCd());
} }
@@ -847,7 +689,6 @@ public class MyActController {
bbsctt.setRegusrDvCd("99"); bbsctt.setRegusrDvCd("99");
} }
} }
// pagination
PaginationInfo paginationInfo = new PaginationInfo(); PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(bbsctt.getPageIndex()); paginationInfo.setCurrentPageNo(bbsctt.getPageIndex());
paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit()); paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit());
@@ -858,13 +699,10 @@ public class MyActController {
bbsctt.setLastIndex(paginationInfo.getLastRecordIndex()); bbsctt.setLastIndex(paginationInfo.getLastRecordIndex());
bbsctt.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); bbsctt.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
// 게시글 목록조회
Map<String, Object> resultList = new HashMap<String, Object>(); Map<String, Object> resultList = new HashMap<String, Object>();
resultList = service.selectBOBbscttListInqire(bbsctt); resultList = service.selectBOBbscttListInqire(bbsctt);
// 게시판 설정 정보 조회
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set
bbsVO.setSopmalCd(bbsctt.getSopmalCd()); bbsVO.setSopmalCd(bbsctt.getSopmalCd());
bbsVO.setBbsId(bbsctt.getBbsId()); bbsVO.setBbsId(bbsctt.getBbsId());
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
@@ -884,13 +722,11 @@ public class MyActController {
* *
*/ */
public Map<String, Object> selectBOMpageInfoInqire(BOMbrVO vo) { public Map<String, Object> selectBOMpageInfoInqire(BOMbrVO vo) {
// 사용자 정보 추출 및 적용
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
vo.setSopmalCd(user.getSopmalCd()); vo.setSopmalCd(user.getSopmalCd());
vo.setMbrInnb(String.valueOf(user.getUserInnb())); vo.setMbrInnb(String.valueOf(user.getUserInnb()));
vo.setMbrDvCd(user.getMbrDvCd()); vo.setMbrDvCd(user.getMbrDvCd());
// 상품 옵션 조회
Map<String, Object> message = new HashMap<>(); Map<String, Object> message = new HashMap<>();
message = boMbrService.selectBOMpageInfoInqire(vo); message = boMbrService.selectBOMpageInfoInqire(vo);
@@ -915,7 +751,6 @@ public class MyActController {
bbsctt.setSopmalCd(user.getSopmalCd()); bbsctt.setSopmalCd(user.getSopmalCd());
bbsctt.setRegusr(user.getUserInnb()); bbsctt.setRegusr(user.getUserInnb());
bbsctt.setMbrDvCd(user.getMbrDvCd()); bbsctt.setMbrDvCd(user.getMbrDvCd());
// pagination
PaginationInfo paginationInfo = new PaginationInfo(); PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(bbsctt.getPageIndex()); paginationInfo.setCurrentPageNo(bbsctt.getPageIndex());
paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit()); paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit());
@@ -948,7 +783,6 @@ public class MyActController {
if (!"crm".equals(bbsctt.getReqUrl())) { if (!"crm".equals(bbsctt.getReqUrl())) {
bbsctt.setRegusr(user.getUserInnb()); bbsctt.setRegusr(user.getUserInnb());
} }
// pagination
PaginationInfo paginationInfo = new PaginationInfo(); PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(bbsctt.getPageIndex()); paginationInfo.setCurrentPageNo(bbsctt.getPageIndex());
paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit()); paginationInfo.setRecordCountPerPage(bbsctt.getPageUnit());
@@ -958,7 +792,7 @@ public class MyActController {
bbsctt.setFirstIndex(paginationInfo.getFirstRecordIndex()); bbsctt.setFirstIndex(paginationInfo.getFirstRecordIndex());
bbsctt.setLastIndex(paginationInfo.getLastRecordIndex()); bbsctt.setLastIndex(paginationInfo.getLastRecordIndex());
bbsctt.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); bbsctt.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
// 게시글 목록조회
Map<String, Object> resultList = new HashMap<String, Object>(); Map<String, Object> resultList = new HashMap<String, Object>();
resultList = service.selectBOMyRvwListInqire(bbsctt); resultList = service.selectBOMyRvwListInqire(bbsctt);
@@ -974,7 +808,6 @@ public class MyActController {
*/ */
public Map<String, Object> selectBOBbscttRegistPopupForm(BOGnrlbbscttVO bbsctt) { public Map<String, Object> selectBOBbscttRegistPopupForm(BOGnrlbbscttVO bbsctt) {
Map<String, Object> content = new HashMap<String, Object>(); Map<String, Object> content = new HashMap<String, Object>();
// 작성자 정보 추출
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) { if ("01".equals(user.getSysDvCd())) {
@@ -987,9 +820,9 @@ public class MyActController {
if (user.getUserInnb() > 0) { if (user.getUserInnb() > 0) {
bbsctt.setRegusr(user.getUserInnb()); bbsctt.setRegusr(user.getUserInnb());
if (!"01".equals(user.getSysDvCd())) { if (!"01".equals(user.getSysDvCd())) {
bbsctt.setRegusrDvCd("02"); //관리자 bbsctt.setRegusrDvCd("02");
} else { } else {
bbsctt.setRegusrDvCd("01"); //회원 bbsctt.setRegusrDvCd("01");
bbsctt.setMbrDvCd(user.getMbrDvCd()); bbsctt.setMbrDvCd(user.getMbrDvCd());
DataMap mbr = new DataMap(); DataMap mbr = new DataMap();
mbr.put("mbrInnb", String.valueOf(bbsctt.getRegusr())); mbr.put("mbrInnb", String.valueOf(bbsctt.getRegusr()));
@@ -1005,31 +838,25 @@ public class MyActController {
regusrInfo.setRegusrDvCd(bbsctt.getRegusrDvCd()); regusrInfo.setRegusrDvCd(bbsctt.getRegusrDvCd());
} else { } else {
regusrInfo.setRegusr(0); regusrInfo.setRegusr(0);
regusrInfo.setRegusrDvCd("99");//비회원 regusrInfo.setRegusrDvCd("99");
} }
// 게시판 설정 정보
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set
bbsVO.setSopmalCd(bbsctt.getSopmalCd()); bbsVO.setSopmalCd(bbsctt.getSopmalCd());
bbsVO.setBbsId(bbsctt.getBbsId()); bbsVO.setBbsId(bbsctt.getBbsId());
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd()); bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap(); DataMap bbsInfo = new DataMap();
bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO); bbsInfo = bbsService.selectBOBbsSetupInfo(bbsVO);
// 분류
List<DataMap> itmList = new ArrayList<>(); List<DataMap> itmList = new ArrayList<>();
itmList = service.selectBOBbscttItmInqire(bbsctt); itmList = service.selectBOBbscttItmInqire(bbsctt);
//리뷰항목 리스트, 리뷰항목 항목 리스트
Map<String, Object> rvwQesitmList = new HashMap<String, Object>(); Map<String, Object> rvwQesitmList = new HashMap<String, Object>();
rvwQesitmList = service.selectBOStarItm(bbsctt); rvwQesitmList = service.selectBOStarItm(bbsctt);
//추가항목 리스트, 추가항목 항목 리스트
Map<String, Object> qesitmList = new HashMap<String, Object>(); Map<String, Object> qesitmList = new HashMap<String, Object>();
qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt); qesitmList = service.selectBOBbscttRegistPopupForm(bbsctt);
//사용자 > 리뷰 상품 조회
DataMap rvwGoodsInfo = new DataMap(); DataMap rvwGoodsInfo = new DataMap();
DataMap mlgInfo = new DataMap(); DataMap mlgInfo = new DataMap();
if ("sopmal".equals(bbsctt.getServerDv())) { if ("sopmal".equals(bbsctt.getServerDv())) {
@@ -1041,7 +868,6 @@ public class MyActController {
List<DataMap> rvwItmList = new ArrayList<>(); List<DataMap> rvwItmList = new ArrayList<>();
List<DataMap> starItmList = new ArrayList<>(); List<DataMap> starItmList = new ArrayList<>();
//사용자 별표 평점 역으로 리스트 set(퍼블리싱으로 인한 역처리)
if (rvwQesitmList.get("starItmCnList") != null) { if (rvwQesitmList.get("starItmCnList") != null) {
rvwItmList = (List<DataMap>) rvwQesitmList.get("starItmCnList"); rvwItmList = (List<DataMap>) rvwQesitmList.get("starItmCnList");
for (int i = rvwItmList.size() - 1; i >= 0; i--) { for (int i = rvwItmList.size() - 1; i >= 0; i--) {
@@ -1052,7 +878,6 @@ public class MyActController {
} }
} }
//사용자 > 상품q&a 상품 조회
DataMap qnaGoodsInfo = new DataMap(); DataMap qnaGoodsInfo = new DataMap();
if ("sopmal".equals(bbsctt.getServerDv())) { if ("sopmal".equals(bbsctt.getServerDv())) {
if ("modal".equals(bbsctt.getReqUrl())) { if ("modal".equals(bbsctt.getReqUrl())) {

View File

@@ -36,6 +36,7 @@ import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyOrdrDlvyVO;
import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyOrdrShippingVO; import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyOrdrShippingVO;
import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyRefundVO; import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyRefundVO;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.ApiResponse;
import com.wb.domainserver.response.WnbtResponse; import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody; import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler; import com.wb.domainserver.response.WnbtWebClientResponseHandler;
@@ -54,6 +55,7 @@ import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Base64Util; import org.apache.logging.log4j.util.Base64Util;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@@ -65,6 +67,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -733,17 +736,13 @@ public class MyOrdrController {
boDlivyVO.setSopmalCd(user.getSopmalCd()); // 쇼핑몰 코드 boDlivyVO.setSopmalCd(user.getSopmalCd()); // 쇼핑몰 코드
} }
Map<String, Object> content = new HashMap<>(); BOOrdrDlvyVO ordrDlvyVO = new BOOrdrDlvyVO();
content = dlivyService.selectBOOrdrDlvyDtlsInqire(boDlivyVO); ordrDlvyVO.setSopmalCd(boDlivyVO.getSopmalCd());
ordrDlvyVO.setOrdrInnb(boDlivyVO.getOrdrInnb());
model.addAttribute("resultMap", content); model.addAttribute("ordrInfo", boOrdrService.selectMbrOrdrDtlInqire(ordrDlvyVO));
// responseHandler.handleResponse( model.addAttribute("resultMap", dlivyService.updateBOAciDelivery(boDlivyVO));
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/ordr/dlivy/selectBOOrdrDlvyDtlsInqire", dlivyVO),
// model,
// "resultMap"
// );
// return "sopmal/mpage/ordr/DlvyInqireR";
return Util.getDeviceType(request) + "/mpage/ordr/DlvyInqireR"; return Util.getDeviceType(request) + "/mpage/ordr/DlvyInqireR";
} }

View File

@@ -3,6 +3,9 @@ package com.wb.domainserver.domain.sopmal.ordr.controller;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jose.shaded.gson.Gson; import com.nimbusds.jose.shaded.gson.Gson;
import com.stripe.model.Event;
import com.stripe.model.checkout.Session;
import com.stripe.net.Webhook;
import com.wb.domainserver.common.msg.GconeMessageSource; import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.common.mvc.tags.ui.pagination.PaginationInfo; import com.wb.domainserver.common.mvc.tags.ui.pagination.PaginationInfo;
import com.wb.domainserver.common.prop.PaginationProperties; import com.wb.domainserver.common.prop.PaginationProperties;
@@ -56,7 +59,6 @@ import com.wb.domainserver.util.util.Util;
import jakarta.servlet.http.Cookie; import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.logging.log4j.util.Base64Util; import org.apache.logging.log4j.util.Base64Util;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
@@ -68,15 +70,11 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger; import java.math.BigInteger;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
@@ -854,6 +852,8 @@ public class OrdrController {
url = "sopmal/ordr/OrdrReqstTossPayR"; url = "sopmal/ordr/OrdrReqstTossPayR";
} else if ("tosspay".equals(pgCmpnyNm)||"kakaopay".equals(pgCmpnyNm)) { //||"naverpay".equals(pgCmpnyNm) 키움으로 이동 } else if ("tosspay".equals(pgCmpnyNm)||"kakaopay".equals(pgCmpnyNm)) { //||"naverpay".equals(pgCmpnyNm) 키움으로 이동
url = "sopmal/ordr/OrdrReqstTosspayPayR"; url = "sopmal/ordr/OrdrReqstTosspayPayR";
} else if ("stripe".equals(pgCmpnyNm)) { // Stripe
url = "sopmal/ordr/OrdrReqstStripePayR";
} else if ("02".equals(setleTyCd)||"08".equals(setleTyCd)||"12".equals(setleTyCd)) { // 무통장, 마일리지, 충전형마일리지 } else if ("02".equals(setleTyCd)||"08".equals(setleTyCd)||"12".equals(setleTyCd)) { // 무통장, 마일리지, 충전형마일리지
url = "sopmal/ordr/OrdrReqstPayR"; url = "sopmal/ordr/OrdrReqstPayR";
} }
@@ -1557,6 +1557,110 @@ public class OrdrController {
} }
/**
* 사용자 > 상품 > 구매/결제 > 회원구매하기 > Stripe 결제 정보 등록 (webhook)
* @param payload
* @param sigHeader
* @return OrdrRspnsKiwoomPayR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/{sopmalCd}/insertStripeSetle")
public ResponseEntity<String> insertStripeSetle(@RequestBody String payload, @RequestHeader("Stripe-Signature") String sigHeader, @PathVariable String sopmalCd) {
try {
log.info("insertStripeSetle webhook start ::: ");
Event event = payService.createWebhookEvent(payload, sigHeader, sopmalCd);
if ("checkout.session.completed".equals(event.getType())) {
Session session = (Session) event
.getDataObjectDeserializer()
.getObject()
.orElseThrow();
log.info("insertStripeSetle controller start ::: ");
BOPayVO payVO = new BOPayVO();
payVO.setOrderId(session.getMetadata().get("ordrInnb"));
payVO.setAmount(session.getMetadata().get("setleAmt"));
payVO.setSopmalCd(session.getMetadata().get("sopmalCd"));
payVO.setMbrInnb(session.getMetadata().get("mbrInnb"));
payVO.setMbrId(session.getMetadata().get("mbrId"));
payVO.setSesionId(session.getMetadata().get("sesionId"));
payVO.setPgCmpnyNm(session.getMetadata().get("pgCmpnyNm"));
payVO.setSetleTyCd(session.getMetadata().get("setleTyCd"));
payVO.setSetlerNm(session.getMetadata().get("ordrrNm"));
log.info("insertStripeSetle controller payVO ::: {}", payVO);
/* 쿠키 데이터 세팅 시작 */
String agentId = session.getMetadata().get("agentId");
String jSesionId = session.getMetadata().get("jSesionId");
String ipAdres = session.getMetadata().get("ipAdres");
String uMbrNm = session.getMetadata().get("uMbrNm");
String uSysDvCd = session.getMetadata().get("uSysDvCd");
String uSopmalCd = session.getMetadata().get("uSopmalCd");
String uMbrDvCd = session.getMetadata().get("uMbrDvCd");
//agentId 쿠키 있을 경우 가져옴
if (!"".equals(jSesionId)) {
payVO.setSessionId(jSesionId);
}
//gc_agent_id 가져옴
if (!"".equals(agentId)) {
payVO.setAgentId(agentId);
}
payVO.setIpAdres(ipAdres);
if (!"".equals(uMbrNm)) {
payVO.setMbrNm(uMbrNm); //회원명(관리자명)
}
if ("01".equals(uSysDvCd)) {
payVO.setDvCd("01");
payVO.setSopmalCd(uSopmalCd);
payVO.setMbrDvCd(uMbrDvCd);
} else {
payVO.setDvCd("02");
}
/* 쿠키 데이터 세팅 끝 */
Map<String, Object> content;
try {
content = service.insertStripeSetle(session, payVO);
log.info("insertStripeSetle controller content ::: {}", content);
} catch (WnbtRestException wre) {
log.info("insertStripeSetle : Stripe 결제 정보 등록 : 실패 WnbtRestException");
log.error(wre.getMessage(), wre);
content = new HashMap<>() {{
put("status", "1");
put("message", wre.getMessage());
}};
} catch (Exception e) {
log.info("insertStripeSetle : Stripe 결제 정보 등록 : 실패");
log.error(e.getMessage(), e);
content = new HashMap<>() {{
put("status", "1");
put("message", "Stripe 결제 정보 등록이 실패하였습니다.\n관리자에게 문의하시기 바랍니다.");
}};
}
if ("0".equals(content.get("status"))) {
commonOrderPostProcess(payVO);
}
}
} catch (Exception e) {
log.debug("Webhook error ::: {}", e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
return ResponseEntity.ok().build();
}
/** /**
* 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 화면 이동 * 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 화면 이동
* @return OrdrComptR.jsp * @return OrdrComptR.jsp

View File

@@ -0,0 +1,299 @@
package com.wb.domainserver.domain.sopmal.stripe.controller;
import com.google.gson.JsonObject;
import com.stripe.StripeClient;
import com.stripe.exception.StripeException;
import com.stripe.model.checkout.Session;
import com.stripe.param.checkout.SessionCreateParams;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrService;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrVO;
import com.wb.domainserver.domain.gcone.ordr.pay.service.BOPayService;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.cookie.CookieUtil;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.util.Util;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.http.HttpStatus;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Controller
@RequestMapping("/sopmal/stripe")
public class StripeController {
@Autowired
private BOMaSopmalService boMaSopmalService;
@Autowired
private BOPayService payService;
@Autowired
private BOOrdrService ordrService;
private Util utilClass;
@Value("${stripe.checkout.return-base-url:}")
private String stripeReturnBaseUrl = "";
String resolveStripeReturnBaseUrl(String shopDomain) {
String baseUrl = stripeReturnBaseUrl.isBlank() ? shopDomain : stripeReturnBaseUrl.trim();
return baseUrl.replaceAll("/+$", "");
}
/**
* stripe 결제 Url 호출
* @return selectStripeTest.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@PostMapping(value = "/checkout", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> createCheckoutSession(HttpServletRequest request) throws Exception {
BOMaSopmalVO sopmalVO = new BOMaSopmalVO();
sopmalVO.setSopmalCd(request.getParameter("sopmalCd"));
DataMap sopmalInfo = boMaSopmalService.selectBOSopmalUpdtForm(sopmalVO).get(0);
String domnAdres = resolveStripeReturnBaseUrl(sopmalInfo.get("pcDomnAdres").toString());
StripeClient stripeClient = payService.createStripeClient(request.getParameter("sopmalCd"));
SessionCreateParams.Builder paramsBuilder = SessionCreateParams.builder()
.setMode(SessionCreateParams.Mode.PAYMENT)
.setSuccessUrl(domnAdres + "/sopmal/stripe/stripeSuccess?sessionId={CHECKOUT_SESSION_ID}&sopmalCd=" + request.getParameter("sopmalCd"))
.setCancelUrl(domnAdres + "/sopmal/stripe/stripeCancel?sessionId={CHECKOUT_SESSION_ID}&sopmalCd=" + request.getParameter("sopmalCd"))
.setAdaptivePricing(
SessionCreateParams.AdaptivePricing.builder()
.setEnabled(false)
.build()
);
String customerEmail = request.getParameter("ordrrEmail");
if (customerEmail != null && !customerEmail.isBlank()) {
paramsBuilder.setCustomerEmail(customerEmail.trim());
}
paramsBuilder.addLineItem(
SessionCreateParams.LineItem.builder()
.setQuantity(1L)
.setPriceData(
SessionCreateParams.LineItem.PriceData.builder()
.setCurrency("jpy")
.setUnitAmount(Long.parseLong(request.getParameter("jpSetleAmt")))
.setProductData(
SessionCreateParams.LineItem.PriceData.ProductData.builder()
.setName(request.getParameter("goodsNm"))
.build()
).build()
).build()
);
paramsBuilder
.putMetadata("sopmalCd", request.getParameter("sopmalCd"))
.putMetadata("ordrInnb", request.getParameter("ordrInnb"))
.putMetadata("pgCmpnyNm", request.getParameter("pgCmpnyNm"))
.putMetadata("setleTyCd", request.getParameter("setleTyCd"))
.putMetadata("goodsNm", request.getParameter("goodsNm"))
.putMetadata("setleAmt", request.getParameter("setleAmt"))
.putMetadata("ordrrNm", request.getParameter("ordrrNm"))
.putMetadata("ordrrEmail", request.getParameter("ordrrEmail"))
.putMetadata("ordrrMbtlnb", request.getParameter("ordrrMbtlnb"))
.putMetadata("mbrId", request.getParameter("mbrId"))
.putMetadata("mbrInnb", request.getParameter("mbrInnb"))
.putMetadata("sesionId", request.getParameter("sesionId"))
.putMetadata("subsvcInnb", request.getParameter("subsvcInnb"));
/* insertStripeSetle() 결제 정보 등록 파라미터 시작 */
String agentId = "";
String jSesionId = "";
String ipAdres = "";
String uMbrNm = "";
String uSysDvCd = "";
String uSopmalCd = "";
String uMbrDvCd = "";
// 쿠키를 가져옴
Cookie[] cookies = request.getCookies();
//agentId 쿠키 있을 경우 가져옴
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("JSESSIONID")) {
jSesionId = cookie.getValue();
}
}
}
//gc_agent_id 가져옴
if (CookieUtil.hasAgentCookie(request.getCookies())) {
agentId = CookieUtil.getAgentCookieValue(request.getCookies());
}
Map<String, String> util = new HashMap<>();
util = utilClass.getRequestInfo(request);
ipAdres = util.get("XForwardedFor");
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
uMbrNm = user.getMbrNm(); //회원명(관리자명)
if ("01".equals(user.getSysDvCd())) {
uSopmalCd = user.getSopmalCd();
uMbrDvCd = user.getMbrDvCd();
}
paramsBuilder
.putMetadata("agentId", agentId)
.putMetadata("jSesionId", jSesionId)
.putMetadata("ipAdres", ipAdres)
.putMetadata("uMbrNm", uMbrNm)
.putMetadata("uSysDvCd", uSysDvCd)
.putMetadata("uSopmalCd", uSopmalCd)
.putMetadata("uMbrDvCd", uMbrDvCd);
/* insertStripeSetle() 결제 정보 등록 파라미터 끝 */
Session session = stripeClient.v1().checkout().sessions().create(paramsBuilder.build());
DataMap result = new DataMap();
result.put("checkoutUrl", session.getUrl());
result.put("redirectUrl", UriComponentsBuilder.fromPath(request.getContextPath() + "/sopmal/stripe/checkoutRedirect")
.queryParam("sessionId", session.getId())
.queryParam("sopmalCd", request.getParameter("sopmalCd"))
.build().encode().toUriString());
WnbtResponseBody body = new WnbtResponseBody(result);
WnbtResponse response = WnbtResponse.builder().resBody(body).build();
return ResponseEntity.ok(response);
}
/** Stripe 진입 이력을 GET으로 남겨 뒤로가기 시 주문 POST를 재전송하지 않는다. */
@Policy(AuthPolicy.RESTRICTED)
@GetMapping("/checkoutRedirect")
public String checkoutRedirect(ModelMap model, @RequestParam("sessionId") String sessionId,
@RequestParam("sopmalCd") String sopmalCd) throws StripeException {
Session session = payService.createStripeClient(sopmalCd).v1().checkout().sessions().retrieve(sessionId);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if (!String.valueOf(user.getUserInnb()).equals(session.getMetadata().get("mbrInnb"))
|| !sopmalCd.equals(session.getMetadata().get("sopmalCd"))) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN);
}
model.addAttribute("checkoutUrl", "open".equals(session.getStatus()) ? session.getUrl() : "");
model.addAttribute("sessionId", sessionId);
model.addAttribute("sopmalCd", sopmalCd);
return "sopmal/ordr/StripeRedirectR";
}
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/stripeSuccess")
public String stripeSuccess(ModelMap model, @RequestParam("sessionId") String sessionId, @RequestParam("sopmalCd") String sopmalCd) throws StripeException {
StripeClient stripeClient = payService.createStripeClient(sopmalCd);
Session session = stripeClient.v1().checkout().sessions().retrieve(sessionId);
String status = session.getStatus();
String paymentStatus = session.getPaymentStatus();
JsonObject customerDetails = null;
JsonObject rawJson = session.getRawJsonObject();
if (rawJson != null
&& rawJson.has("customer_details")
&& !rawJson.get("customer_details").isJsonNull()) {
customerDetails = rawJson.getAsJsonObject("customer_details");
}
BOOrdrVO ordrVO = new BOOrdrVO();
ordrVO.setSopmalCd(sopmalCd);
ordrVO.setOrdrInnb(session.getMetadata().get("ordrInnb"));
DataMap ordrDtl = ordrService.selectOrdrSttus(ordrVO);
if (ordrDtl != null && !"25".equals(ordrDtl.get("ordrSttusCd"))) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
ordrDtl = ordrService.selectOrdrSttus(ordrVO);
}
model.addAttribute("status", status);
model.addAttribute("payment_status", paymentStatus);
model.addAttribute("customer_details", customerDetails);
if("complete".equals(status) && "paid".equals(paymentStatus) && "25".equals(ordrDtl.get("ordrSttusCd"))) {
model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrCompt");
model.addAttribute("message", "Stripe 결제 정보 등록을 완료 하였습니다.");
} else {
model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrFailr");
model.addAttribute("message", "Stripe 결제 정보 등록을 실패 하였습니다.");
}
model.addAttribute("sopmalCd", session.getMetadata().get("sopmalCd"));
model.addAttribute("ordrInnb", session.getMetadata().get("ordrInnb"));
model.addAttribute("pgCmpnyNm", session.getMetadata().get("pgCmpnyNm"));
model.addAttribute("setleTyCd", session.getMetadata().get("setleTyCd"));
model.addAttribute("goodsNm", session.getMetadata().get("goodsNm"));
model.addAttribute("setleAmt", session.getMetadata().get("setleAmt"));
model.addAttribute("ordrrNm", session.getMetadata().get("ordrrNm"));
model.addAttribute("ordrrEmail", session.getMetadata().get("ordrrEmail"));
model.addAttribute("ordrrMbtlnb", session.getMetadata().get("ordrrMbtlnb"));
model.addAttribute("mbrId", session.getMetadata().get("mbrId"));
model.addAttribute("mbrInnb", session.getMetadata().get("mbrInnb"));
model.addAttribute("sesionId", session.getMetadata().get("sesionId"));
model.addAttribute("subsvcInnb", session.getMetadata().get("subsvcInnb"));
return "sopmal/ordr/PayStripeSucsC";
}
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/stripeCancel")
public String stripeCancel(HttpServletRequest request, ModelMap model, @RequestParam("sessionId") String sessionId, @RequestParam("sopmalCd") String sopmalCd) throws StripeException {
StripeClient stripeClient = payService.createStripeClient(sopmalCd);
Session session = stripeClient.v1().checkout().sessions().retrieve(sessionId);
String status = session.getStatus();
String paymentStatus = session.getPaymentStatus();
if (!("complete".equals(status) && "paid".equals(paymentStatus))) {
model.addAttribute("mobile", "sopmal_m".equals(Util.getDeviceType(request)));
return "sopmal/ordr/StripeCancelR";
}
JsonObject customerDetails = null;
JsonObject rawJson = session.getRawJsonObject();
if (rawJson != null
&& rawJson.has("customer_details")
&& !rawJson.get("customer_details").isJsonNull()) {
customerDetails = rawJson.getAsJsonObject("customer_details");
}
model.addAttribute("status", status);
model.addAttribute("payment_status", paymentStatus);
model.addAttribute("customer_details", customerDetails);
if("complete".equals(status) && "paid".equals(paymentStatus)) {
model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrCompt");
model.addAttribute("message", "Stripe 결제 정보 등록을 완료 하였습니다.");
} else {
model.addAttribute("returnUrl", "/sopmal/ordr/selectOrdrFailr");
model.addAttribute("message", "Stripe 결제 정보 등록을 실패 하였습니다.");
}
model.addAttribute("sopmalCd", session.getMetadata().get("sopmalCd"));
model.addAttribute("ordrInnb", session.getMetadata().get("ordrInnb"));
model.addAttribute("pgCmpnyNm", session.getMetadata().get("pgCmpnyNm"));
model.addAttribute("setleTyCd", session.getMetadata().get("setleTyCd"));
model.addAttribute("goodsNm", session.getMetadata().get("goodsNm"));
model.addAttribute("setleAmt", session.getMetadata().get("setleAmt"));
model.addAttribute("ordrrNm", session.getMetadata().get("ordrrNm"));
model.addAttribute("ordrrEmail", session.getMetadata().get("ordrrEmail"));
model.addAttribute("ordrrMbtlnb", session.getMetadata().get("ordrrMbtlnb"));
model.addAttribute("mbrId", session.getMetadata().get("mbrId"));
model.addAttribute("mbrInnb", session.getMetadata().get("mbrInnb"));
model.addAttribute("sesionId", session.getMetadata().get("sesionId"));
model.addAttribute("subsvcInnb", session.getMetadata().get("subsvcInnb"));
return "sopmal/ordr/PayStripeSucsC";
}
}

View File

@@ -371,7 +371,9 @@ public class MngrLoggingInterceptor implements HandlerInterceptor {
String cookieValue = agentId + ":" + md5(agentId + ":" + md5(System.currentTimeMillis() + ":" + random.nextInt())).substring(5, 10); String cookieValue = agentId + ":" + md5(agentId + ":" + md5(System.currentTimeMillis() + ":" + random.nextInt())).substring(5, 10);
Cookie agentIdCookie = new Cookie("agent_id", cookieValue); Cookie agentIdCookie = new Cookie("agent_id", cookieValue);
agentIdCookie.setMaxAge(86400 * 365 * 10); // 10년 agentIdCookie.setMaxAge(86400 * 365 * 10); // 10년
if (!request.getServerName().startsWith("loc.")) {
agentIdCookie.setDomain(domain); agentIdCookie.setDomain(domain);
}
// agentIdCookie.setHttpOnly(true); // agentIdCookie.setHttpOnly(true);
agentIdCookie.setPath("/mngr"); agentIdCookie.setPath("/mngr");
// agentIdCookie.setSecure(true); // agentIdCookie.setSecure(true);

View File

@@ -51,14 +51,17 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
String accessToken = extractToken(request); String accessToken = extractToken(request);
String sysDvCd = RealmContextHolder.getSysDvCdRealm();
String expireChk = request.getParameter("expire"); String expireChk = request.getParameter("expire");
String tokenExpireCookie = CookieUtils.getCookieValue("token_expire", request); String tokenExpireCookie = CookieUtils.getCookieValue("token_expire", request);
//사용자이면서 ACT가 없는데 tokenExpire는 있을 경우 //사용자이면서 ACT가 없는데 tokenExpire는 있을 경우
//로그인된 사용자지만 엑세스 토큰이 만료되어 다시 재발급 받아야 하는 대상 //로그인된 사용자지만 엑세스 토큰이 만료되어 다시 재발급 받아야 하는 대상
//expire값은 루프 요청 방지 //인증 진입점은 만료 쿠키가 남아 있어도 갱신 대상으로 보내지 않는다.
if("01".equals(sysDvCd) && !StringUtils.hasText(accessToken) && StringUtils.hasText(tokenExpireCookie) && !"p".equals(expireChk)){ //쿠키 삭제가 지연되거나 이전 경로의 쿠키가 남아도 로그인 화면까지는 항상 도달해야 한다.
if(!isAuthenticationEndpoint(requestUri, realm)
&& !StringUtils.hasText(accessToken)
&& StringUtils.hasText(tokenExpireCookie)
&& !"p".equals(expireChk)){
response.sendRedirect("/"+realm+"/tokens/refresh?redirect_uri=%s&expire=%s".formatted(URLEncoder.encode(UrlExtractor.getOriginalURL(request), StandardCharset.UTF_8), "p")); response.sendRedirect("/"+realm+"/tokens/refresh?redirect_uri=%s&expire=%s".formatted(URLEncoder.encode(UrlExtractor.getOriginalURL(request), StandardCharset.UTF_8), "p"));
return; return;
@@ -66,7 +69,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
// accessToken이 있고 refresh Token 요청이 아닌경우 // accessToken이 있고 refresh Token 요청이 아닌경우
if (StringUtils.hasText(accessToken) && !requestUri.contains("/tokens/refresh")) { if (StringUtils.hasText(accessToken) && !isAuthenticationEndpoint(requestUri, realm)) {
UserDetails userDetails = customUserDetailService.loadUserByUsername(accessToken); UserDetails userDetails = customUserDetailService.loadUserByUsername(accessToken);
if (userDetails != null) { if (userDetails != null) {
log.debug("user details: {}", userDetails); log.debug("user details: {}", userDetails);
@@ -92,6 +95,15 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
} }
private boolean isAuthenticationEndpoint(String requestUri, String realm) {
String realmPath = "/" + realm;
return requestUri.equals(realmPath)
|| requestUri.startsWith(realmPath + "/login")
|| requestUri.equals(realmPath + "/logout")
|| requestUri.startsWith(realmPath + "/tokens/refresh");
}
private String extractToken(HttpServletRequest request) { private String extractToken(HttpServletRequest request) {

View File

@@ -44,9 +44,12 @@ public abstract class CookieUtils {
Cookie cookie = new Cookie(name, null); Cookie cookie = new Cookie(name, null);
cookie.setMaxAge(0); cookie.setMaxAge(0);
cookie.setPath(path); cookie.setPath(path);
cookie.setDomain(originHost); setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(true); cookie.setHttpOnly(true);
response.addCookie(cookie); response.addCookie(cookie);
// loc 환경에서는 이전에 상위 도메인으로 저장된 쿠키도 함께 삭제한다.
deleteLegacyDomainCookie(name, path, request, response, originHost);
} }
public static void createCookie(String name, String value, String path, int maxAge, boolean httpOnly, HttpServletRequest request, HttpServletResponse response) { public static void createCookie(String name, String value, String path, int maxAge, boolean httpOnly, HttpServletRequest request, HttpServletResponse response) {
@@ -58,10 +61,12 @@ public abstract class CookieUtils {
String originHost = UrlExtractor.getOriginalHost(host); String originHost = UrlExtractor.getOriginalHost(host);
deleteLegacyDomainCookie(name, path, request, response, originHost);
Cookie cookie = new Cookie(name, value); Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(maxAge); cookie.setMaxAge(maxAge);
cookie.setPath(path); cookie.setPath(path);
cookie.setDomain(originHost); setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(httpOnly); cookie.setHttpOnly(httpOnly);
response.addCookie(cookie); response.addCookie(cookie);
} }
@@ -77,7 +82,7 @@ public abstract class CookieUtils {
Cookie cookie = new Cookie(name, value); Cookie cookie = new Cookie(name, value);
cookie.setPath(path); cookie.setPath(path);
cookie.setDomain(originHost); setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(httpOnly); cookie.setHttpOnly(httpOnly);
response.addCookie(cookie); response.addCookie(cookie);
} }
@@ -96,4 +101,30 @@ public abstract class CookieUtils {
return Map.of("ACTPath", ACTPath, "RFTPath", RFTPath); return Map.of("ACTPath", ACTPath, "RFTPath", RFTPath);
} }
private static void setCookieDomain(Cookie cookie, HttpServletRequest request, String domain) {
if (!request.getServerName().startsWith("loc.")) {
cookie.setDomain(domain);
}
}
private static void deleteLegacyDomainCookie(String name, String path, HttpServletRequest request, HttpServletResponse response, String domain) {
if (request.getServerName().startsWith("loc.")) {
addDomainDeleteCookie(name, path, domain, response);
int firstDot = domain.indexOf('.');
if (firstDot > 0) {
addDomainDeleteCookie(name, path, domain.substring(firstDot + 1), response);
}
}
}
private static void addDomainDeleteCookie(String name, String path, String domain, HttpServletResponse response) {
Cookie domainCookie = new Cookie(name, null);
domainCookie.setMaxAge(0);
domainCookie.setPath(path);
domainCookie.setDomain(domain);
domainCookie.setHttpOnly(true);
response.addCookie(domainCookie);
}
} }

View File

@@ -310,8 +310,13 @@ public class FileStorageService {
if(image != null) { if(image != null) {
thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH); thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);
} }
BufferedImage convertImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB); BufferedImage convertImage = new BufferedImage(destWidth, destHeight, getImageType(image, file.getOriginalFilename()));
convertImage.getGraphics().drawImage(thumbnail, posX, posY, null); Graphics graphics = convertImage.getGraphics();
try {
graphics.drawImage(thumbnail, posX, posY, null);
} finally {
graphics.dispose();
}
String ext = FilenameUtils.getExtension(file.getOriginalFilename()); String ext = FilenameUtils.getExtension(file.getOriginalFilename());
ImageIO.write(convertImage, ext, os); ImageIO.write(convertImage, ext, os);
@@ -376,8 +381,13 @@ public class FileStorageService {
if(image != null) { if(image != null) {
thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH); thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);
} }
BufferedImage convertImage = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB); BufferedImage convertImage = new BufferedImage(thumbnailWidth, thumbnailHeight, getImageType(image, file.getOriginalFilename()));
convertImage.getGraphics().drawImage(thumbnail, posX, posY, null); Graphics graphics = convertImage.getGraphics();
try {
graphics.drawImage(thumbnail, posX, posY, null);
} finally {
graphics.dispose();
}
ImageIO.write(convertImage, ext, os); ImageIO.write(convertImage, ext, os);
}catch (WnbtRestException wre){ }catch (WnbtRestException wre){
@@ -407,6 +417,14 @@ public class FileStorageService {
return thumbnail_file; return thumbnail_file;
} }
private int getImageType(BufferedImage image, String originalFileName) {
String ext = FilenameUtils.getExtension(originalFileName).toLowerCase(Locale.ROOT);
boolean supportsAlpha = "png".equals(ext) || "gif".equals(ext);
return image != null && image.getColorModel().hasAlpha() && supportsAlpha
? BufferedImage.TYPE_INT_ARGB
: BufferedImage.TYPE_INT_RGB;
}
/** /**
* combineFilePath 에 지정된 경로에 저장이 됨 * combineFilePath 에 지정된 경로에 저장이 됨

View File

@@ -359,12 +359,15 @@ mngrfo:
images: .gif,.jpg,.jpeg,.png images: .gif,.jpg,.jpeg,.png
cdnurl: https://19d28cf7178139ad.kinxzone.com cdnurl: https://19d28cf7178139ad.kinxzone.com
subsvc: subsvc:
dft-goods-optn-innb: 5 dft-goods-optn-innb: 1
secret: secret:
key: 1df5be2f7e90ae36 key: 1df5be2f7e90ae36
aciexpress:
apikey: DC94F29AFD5399F54AAE7FAA46045B65
host: host:
img: https://19d28cf7178139ad.kinxzone.com img: https://19d28cf7178139ad.kinxzone.com

View File

@@ -360,11 +360,14 @@ mngrfo:
cdnurl: https://19d28cf7178139ad.kinxzone.com cdnurl: https://19d28cf7178139ad.kinxzone.com
# upurl: https://www.soju1sake1.com # upurl: https://www.soju1sake1.com
subsvc: subsvc:
dft-goods-optn-innb: 5 dft-goods-optn-innb: 1
secret: secret:
key: 1df5be2f7e90ae36 key: 1df5be2f7e90ae36
aciexpress:
apikey: DC94F29AFD5399F54AAE7FAA46045B65
host: host:
img: https://19d28cf7178139ad.kinxzone.com img: https://19d28cf7178139ad.kinxzone.com

View File

@@ -365,6 +365,9 @@ mngrfo:
secret: secret:
key: 1df5be2f7e90ae36 key: 1df5be2f7e90ae36
aciexpress:
apikey: DC94F29AFD5399F54AAE7FAA46045B65
host: host:
img: https://19b0bde6dcdc15ad.kinxzone.com/ img: https://19b0bde6dcdc15ad.kinxzone.com/
@@ -437,11 +440,11 @@ ordr:
# 서치어드바이저 소유권 코드 # 서치어드바이저 소유권 코드
meta-content: meta-content:
google: google:
LR: "" SK: "6RUF9UIWIu1nl1WlceNKH25YZG13jcEZHURfLrbSxQU"
naver: naver:
LR: "5fcdb284f18ca08cf86af214a01998990c008e84" SK: "213a2c785853cdd006af58d286ffec23342a0e8a"
facebook: facebook:
LR: "" SK: ""
# 결제 api 사용 암호 key # 결제 api 사용 암호 key
api: api:

View File

@@ -402,6 +402,9 @@
WHEN (IFNULL(GOODS.REST_INVNTRY_QY, 0) - IFNULL(GOODS.AVLINV_LMTT_QY, 0)) >= #{goodsTotalQy} THEN 0 WHEN (IFNULL(GOODS.REST_INVNTRY_QY, 0) - IFNULL(GOODS.AVLINV_LMTT_QY, 0)) >= #{goodsTotalQy} THEN 0
ELSE 1 END ELSE 1 END
END AS INVNTRY_POLICY -- 상품별 옵션 수량합산 재고유무 END AS INVNTRY_POLICY -- 상품별 옵션 수량합산 재고유무
, MAX(GOODS.GOODS_NM) AS STOCK_GOODS_NM
, MIN(GREATEST(0, IFNULL(OPTN.INVNTRY_QY, 0) - IFNULL(OPTN.USEFUL_INVNTRY_QY, 0))) AS OPTION_AVAILABLE_QY
, MIN(GREATEST(0, IFNULL(GOODS.REST_INVNTRY_QY, 0) - IFNULL(GOODS.AVLINV_LMTT_QY, 0))) AS GOODS_AVAILABLE_QY
, CASE WHEN IFNULL(OPTN.SLEPRIC, 0) = #{slepric} THEN 0 ELSE 1 END AS SELPRIC -- 판매가 변경여부 , CASE WHEN IFNULL(OPTN.SLEPRIC, 0) = #{slepric} THEN 0 ELSE 1 END AS SELPRIC -- 판매가 변경여부
, CASE , CASE
WHEN OPTN.COMPNB_DSCNT_AT = #{compnbDscntAt} AND OPTN.SCTN_DSCNT_AT = #{sctnDscntAt} THEN 0 WHEN OPTN.COMPNB_DSCNT_AT = #{compnbDscntAt} AND OPTN.SCTN_DSCNT_AT = #{sctnDscntAt} THEN 0
@@ -430,6 +433,7 @@
, IFNULL(EVT_DUPL_COUPON.DPLCT_LMTT_COUPON, 0) AS DPLCT_LMTT_COUPON -- 이벤트 중복제한 쿠폰 존재여부 , IFNULL(EVT_DUPL_COUPON.DPLCT_LMTT_COUPON, 0) AS DPLCT_LMTT_COUPON -- 이벤트 중복제한 쿠폰 존재여부
, CASE WHEN OPTN.OPTN_EXPSR_AT = 'Y' THEN 0 ELSE 1 END AS OPTN_EXPSR_AT , CASE WHEN OPTN.OPTN_EXPSR_AT = 'Y' THEN 0 ELSE 1 END AS OPTN_EXPSR_AT
FROM (SELECT GG.GOODS_INNB -- 상품 고유번호 FROM (SELECT GG.GOODS_INNB -- 상품 고유번호
, GG.GOODS_NM
, GG.SOPMAL_CD -- 쇼핑몰코드 , GG.SOPMAL_CD -- 쇼핑몰코드
, GG.DLVY_GROUP_INNB -- 배송그룹고유번호 , GG.DLVY_GROUP_INNB -- 배송그룹고유번호
, GG.GOODS_KND_CD -- 상품구분 01 상품 , GG.GOODS_KND_CD -- 상품구분 01 상품
@@ -801,6 +805,9 @@
ELSE 1 ELSE 1
END END
END AS INVNTRY_POLICY, -- 상품별 옵션 수량합산 재고유무 END AS INVNTRY_POLICY, -- 상품별 옵션 수량합산 재고유무
MAX(GOODS.GOODS_NM) AS STOCK_GOODS_NM,
MIN(GREATEST(0, GOODS.INVNTRY_QY - IFNULL(GOODS.USEFUL_INVNTRY_QY, 0))) AS OPTION_AVAILABLE_QY,
MIN(GREATEST(0, IFNULL(GOODS.REST_INVNTRY_QY, 0) - IFNULL(GOODS.AVLINV_LMTT_QY, 0))) AS GOODS_AVAILABLE_QY,
CASE CASE
WHEN IFNULL(GOODS.SUBSVC_CT, 0) = #{slepric} THEN 0 WHEN IFNULL(GOODS.SUBSVC_CT, 0) = #{slepric} THEN 0
ELSE 1 ELSE 1
@@ -817,6 +824,7 @@
FROM ( FROM (
SELECT SELECT
GS.SUBSVC_INNB, -- 구독서비스 고유번호 GS.SUBSVC_INNB, -- 구독서비스 고유번호
GG.GOODS_NM,
GG.GOODS_INNB, -- 상품 고유번호 GG.GOODS_INNB, -- 상품 고유번호
GS.SOPMAL_CD, -- 쇼핑몰코드 GS.SOPMAL_CD, -- 쇼핑몰코드
GS.SUBSVC_CT, -- 구독료 GS.SUBSVC_CT, -- 구독료

View File

@@ -338,6 +338,7 @@
,MEMOR_USE_AT ,MEMOR_USE_AT
,NPAY_USE_AT ,NPAY_USE_AT
,KPAY_USE_AT ,KPAY_USE_AT
,STRIPE_USE_AT
FROM GC_PAY_INFO FROM GC_PAY_INFO
WHERE SETLE_SETUP_INNB = #{setleSetupInnb} WHERE SETLE_SETUP_INNB = #{setleSetupInnb}
</select> </select>
@@ -947,6 +948,37 @@
SOPMAL_CD = #{sopmalCd} SOPMAL_CD = #{sopmalCd}
</update> </update>
<!-- 쇼핑몰 환율 설정 수정 -->
<update id="updateBOExchngrtSetup" parameterType="com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO" >
UPDATE
GC_SHOP
SET BUY_RATE = #{buyRate},
SELL_RATE = #{sellRate},
UPDUSR = #{updusr},
UPDT_DT = SYSDATE()
WHERE
1=1
AND
SOPMAL_CD = #{sopmalCd}
</update>
<!-- 쇼핑몰 안내문구 설정 수정 -->
<update id="updateBOGuidanceSetup" parameterType="com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO" >
UPDATE
GC_SHOP
SET JOIN_GUIDANCE_SJ = #{joinGuidanceSj},
JOIN_GUIDANCE_WORDS = #{joinGuidanceWords},
JOIN_BNEF = #{joinBnef},
JOIN_COMPT_WORDS = #{joinComptWords},
SUBSVC_GUIDANCE_WORDS = #{subsvcGuidanceWords},
UPDUSR = #{updusr},
UPDT_DT = SYSDATE()
WHERE
1=1
AND
SOPMAL_CD = #{sopmalCd}
</update>
<!-- 쇼핑몰 사업자 정보 삭제 --> <!-- 쇼핑몰 사업자 정보 삭제 -->
<delete id="deteteBOShopCompany" parameterType="com.wb.domainserver.domain.admin.sys.author.vo.BOMaAuthorVO"> <delete id="deteteBOShopCompany" parameterType="com.wb.domainserver.domain.admin.sys.author.vo.BOMaAuthorVO">
@@ -1250,6 +1282,7 @@
MEMOR_USE_AT = #{memorUseAt}, MEMOR_USE_AT = #{memorUseAt},
NPAY_USE_AT = #{npayUseAt}, NPAY_USE_AT = #{npayUseAt},
KPAY_USE_AT = #{kpayUseAt}, KPAY_USE_AT = #{kpayUseAt},
STRIPE_USE_AT = #{stripeUseAt},
UPDUSR = #{updusr}, UPDUSR = #{updusr},
UPDT_DT = NOW() UPDT_DT = NOW()
WHERE WHERE
@@ -1538,5 +1571,124 @@
AND GD.USE_AT = 'Y' AND GD.USE_AT = 'Y'
</select> </select>
<!-- 사이트맵 XML -->
<select id="selectSitemapXml"
parameterType="String"
resultType="dataMap">
WITH RECURSIVE CATEGORY_TREE AS (
SELECT
GC.CTGRY_ID
, GC.UPPER_CTGRY_ID
, GC.SOPMAL_CD
, GC.CTGRY_NM
, GC.CTGRY_DEPTH
, GC.SORT_ORDR
, GC.CTGRY_DV_CD
, GC.EXPSR_CD
, GC.URL_DV_CD
, CASE
WHEN GC.URL_DV_CD = '01' THEN ''
WHEN GC.URL_DV_CD = '02' THEN GC.URL
ELSE NULL
END URL
, GC.USE_AT
, GC.EXPSR_BGN_DT
, GC.EXPSR_END_DT
FROM GC_CATEGORY GC
WHERE GC.SOPMAL_CD = #{sopmalCd}
AND GC.UPPER_CTGRY_ID IS NULL
AND GC.USE_AT = 'Y'
AND (
GC.EXPSR_CD = '01'
OR (
GC.EXPSR_CD = '03'
AND SYSDATE() BETWEEN GC.EXPSR_BGN_DT AND GC.EXPSR_END_DT
)
)
UNION ALL
SELECT
CHILD.CTGRY_ID
, CHILD.UPPER_CTGRY_ID
, CHILD.SOPMAL_CD
, CHILD.CTGRY_NM
, CHILD.CTGRY_DEPTH
, CHILD.SORT_ORDR
, CHILD.CTGRY_DV_CD
, CHILD.EXPSR_CD
, CHILD.URL_DV_CD
, CASE
WHEN CHILD.URL_DV_CD = '01' THEN
CASE
WHEN CHILD.CTGRY_DV_CD = '01' THEN CONCAT('/sopmal/goods/selectGoodsListForm?ctgryId=', CHILD.CTGRY_ID)
ELSE NULL
END
WHEN CHILD.URL_DV_CD = '02' THEN CHILD.URL
ELSE NULL
END URL
, CHILD.USE_AT
, CHILD.EXPSR_BGN_DT
, CHILD.EXPSR_END_DT
FROM GC_CATEGORY CHILD
INNER JOIN CATEGORY_TREE PARENT
ON CHILD.SOPMAL_CD = PARENT.SOPMAL_CD
AND CHILD.UPPER_CTGRY_ID = PARENT.CTGRY_ID
WHERE CHILD.USE_AT = 'Y'
AND (
CHILD.EXPSR_CD = '01'
OR (
CHILD.EXPSR_CD = '03'
AND SYSDATE() BETWEEN CHILD.EXPSR_BGN_DT AND CHILD.EXPSR_END_DT
)
)
)
SELECT CONCAT(GS.PC_DOMN_ADRES, GC.URL) AS TARGET_URL
, DATE_FORMAT(SYSDATE(), '%Y-%m-%dT%H:%i:%s+09:00') AS LAST_MODIFIED
, ROUND(POWER(0.8, GC.CTGRY_DEPTH - 1), 4) AS PRIORITY
FROM CATEGORY_TREE GC
INNER JOIN GC_SHOP GS
ON GC.SOPMAL_CD = GS.SOPMAL_CD
WHERE GC.CTGRY_DV_CD != '02'
AND GC.CTGRY_DEPTH != 2
UNION
SELECT CONCAT(GS.PC_DOMN_ADRES, '/sopmal/goods/selectGoodsDtl?goodsInnb=', GG.GOODS_INNB) AS TARGET_URL
, DATE_FORMAT(GG.UPDT_DT, '%Y-%m-%dT%H:%i:%s+09:00') AS LAST_MODIFIED
, ROUND(POWER(0.8, 1), 4) AS PRIORITY
FROM GC_GOODS GG
INNER JOIN GC_SHOP GS
ON GG.SOPMAL_CD = GS.SOPMAL_CD
WHERE GG.USE_AT = 'Y'
AND GG.SOPMAL_CD = #{sopmalCd}
AND GG.GOODS_KND_CD = '01'
AND GG.EXPSR_DV_CD = '01'
AND GG.GOODS_STTUS_CD IN ('01', '02')
UNION
SELECT CONCAT(GS.PC_DOMN_ADRES, '/sopmal/csc/selectBbscttAuth?authDv=CM&amp;bbsTyCd=',
CASE
WHEN GB.BBS_ID = 'sake_column' THEN '01'
WHEN GB.BBS_ID = 'magazine' THEN '09'
ELSE NULL
END,
'&amp;bbscttInnb=', GB.BBSCTT_INNB,
'&amp;reqUrl=subPage&amp;bbsId=', GB.BBS_ID,
'&amp;cscAt='
) AS TARGET_URL
, DATE_FORMAT(GB.UPDT_DT, '%Y-%m-%dT%H:%i:%s+09:00') AS LAST_MODIFIED
, ROUND(POWER(0.8, 1), 4) AS PRIORITY
FROM GC_BOARDDATA GB
INNER JOIN GC_SHOP GS
ON GB.SOPMAL_CD = GS.SOPMAL_CD
WHERE GB.USE_AT = 'Y'
AND GB.EXPSR_AT = 'Y'
AND (
GB.NTCE_PD_SETUP_AT = 'N'
OR (
GB.NTCE_PD_SETUP_AT = 'Y'
AND DATE_FORMAT(SYSDATE(), '%Y-%m-%d') BETWEEN DATE_FORMAT(GB.NTCE_BGN_DE, '%Y-%m-%d') AND DATE_FORMAT(GB.NTCE_END_DE, '%Y-%m-%d')
)
)
AND GB.BBS_ID IN ('sake_column', 'magazine')
AND depth = 0
ORDER BY PRIORITY DESC
</select>
</mapper> </mapper>

View File

@@ -1767,6 +1767,7 @@
,CAST(AES_DECRYPT(UNHEX(FB.ANSW_MBTLNB) , #{secretKey}) AS CHAR(50)) AS ANSW_MBTLNB ,CAST(AES_DECRYPT(UNHEX(FB.ANSW_MBTLNB) , #{secretKey}) AS CHAR(50)) AS ANSW_MBTLNB
,FB.ANSW_SMS_RECPTN ,FB.ANSW_SMS_RECPTN
,FB.SJ ,FB.SJ
,FB.RELATE_GOODS_WORDS
,FB.SORT_ORDR ,FB.SORT_ORDR
,FB.USE_AT ,FB.USE_AT
,IFNULL(FBM.MNGR_NM, '관리자') AS MNGR_NM ,IFNULL(FBM.MNGR_NM, '관리자') AS MNGR_NM
@@ -1927,6 +1928,7 @@
,CAST(AES_DECRYPT(UNHEX(FB.ANSW_MBTLNB) , #{secretKey}) AS CHAR(50)) AS ANSW_MBTLNB ,CAST(AES_DECRYPT(UNHEX(FB.ANSW_MBTLNB) , #{secretKey}) AS CHAR(50)) AS ANSW_MBTLNB
,FB.ANSW_SMS_RECPTN ,FB.ANSW_SMS_RECPTN
,FB.SJ ,FB.SJ
,FB.RELATE_GOODS_WORDS
,FB.SORT_ORDR ,FB.SORT_ORDR
,FB.USE_AT ,FB.USE_AT
,FB.CN_SCRIPT ,FB.CN_SCRIPT
@@ -2039,6 +2041,9 @@
PASSWORD, PASSWORD,
SJ, SJ,
CN, CN,
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
RELATE_GOODS_WORDS,
</if>
INQIRE_CNT, INQIRE_CNT,
CM_USE_AT, CM_USE_AT,
RECOMEND_CNT, RECOMEND_CNT,
@@ -2087,6 +2092,9 @@
MD5(#{password}), MD5(#{password}),
#{sj}, #{sj},
#{cn}, #{cn},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
#{relateGoodsWords},
</if>
0, 0,
IFNULL(#{cmUseAt},'N'), IFNULL(#{cmUseAt},'N'),
0, 0,
@@ -2133,6 +2141,9 @@
SET SET
SJ = #{sj}, SJ = #{sj},
CN = #{cn}, CN = #{cn},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
RELATE_GOODS_WORDS = #{relateGoodsWords},
</if>
CM_USE_AT =IFNULL(#{cmUseAt},'N'), CM_USE_AT =IFNULL(#{cmUseAt},'N'),
SORT_ORDR = #{sortOrdr}, SORT_ORDR = #{sortOrdr},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(represntFileInfo)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(represntFileInfo)">
@@ -2656,19 +2667,43 @@
WHERE 1=1 WHERE 1=1
AND FGI.GOODS_INNB = FBG.GOODS_INNB AND FGI.GOODS_INNB = FBG.GOODS_INNB
AND FGI.SOPMAL_CD = FBG.SOPMAL_CD AND FGI.SOPMAL_CD = FBG.SOPMAL_CD
AND FGI.IMG_KND = '03' AND FGI.IMG_KND = '02'
AND FGI.CUT_NB = 1 AND FGI.CUT_NB = 1
LIMIT 1 LIMIT 1
)IMG ) AS IMG
,FG.GOODS_NM ,FG.GOODS_NM
,FGO.CNSMRPRIC ,FG.GOODS_ICON_CD AS ICON_CD_NM_LIST
,FGO.SLEPRIC ,FG.SRT_DC AS REPRSNT_DC
,FGO.STDR_DV_AT ,FG.GOODS_STTUS_CD
,FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD) AS GOODS_STTUS_NM ,FEGI.GOODS_NM_EXPSR_AT
,FN_GET_COMMCODE_NAME('EXPSR', FG.EXPSR_DV_CD) AS EXPSR_NM ,FEGI.GOODS_NM_EXPSR_ORDR
,FBG.ORDR_GOODS_OPTN_INNB ,FEGI.REPRSNT_DC_EXPSR_AT
,FBG.SOPMAL_CD ,FEGI.REPRSNT_DC_EXPSR_ORDR
,FBG.RE_ORDER_AT ,FEGI.PRIC_EXPSR_AT
,FEGI.PRIC_EXPSR_ORDR
,FEGI.RVW_EVL_SCRE_EXPSR_AT
,FEGI.RVW_EVL_SCRE_EXPSR_ORDR
,FEGI.ICON_EXPSR_AT
,FEGI.ICON_EXPSR_ORDR
,IFNULL(ROUND(FGO.CNSMRPRIC, 0), 0) AS CNSMRPRIC
,IFNULL(ROUND(FGO.SLEPRIC, 0), 0) AS SLEPRIC
,IFNULL(ROUND(((FGO.CNSMRPRIC - FGO.SLEPRIC) / NULLIF(FGO.CNSMRPRIC, 0)) * 100, 0), 0) AS SLE_PERCENT
,IFNULL((SELECT ROUND(AVG(FBA.EVL_SCORE), 1)
FROM GC_BOARDDATA_GOODS RBG
INNER JOIN GC_BOARDDATA RB ON RB.BBSCTT_INNB = RBG.BBSCTT_INNB AND RB.SOPMAL_CD = RBG.SOPMAL_CD
INNER JOIN GC_BOARDMANAGER RBM ON RBM.BBS_ID = RB.BBS_ID AND RBM.SOPMAL_CD = RB.SOPMAL_CD
LEFT JOIN GC_BOARDFORM RBF ON RBF.BBS_ID = RBM.BBS_ID AND RBF.SOPMAL_CD = RBM.SOPMAL_CD AND RBF.USE_AT = 'Y' AND RBF.ADIT_ITM_DV_CD = '04'
LEFT JOIN GC_BOARD_ADDITM FBA ON FBA.BBSCTT_INNB = RB.BBSCTT_INNB AND FBA.SOPMAL_CD = RB.SOPMAL_CD AND FBA.QESITM_INNB = RBF.QESITM_INNB
WHERE RBG.SOPMAL_CD = FG.SOPMAL_CD
AND RBG.GOODS_INNB IN (SELECT CAST(RVW_GROUP_NB AS DECIMAL(10)) FROM GC_GOODS_RVW_V WHERE SOPMAL_CD = FG.SOPMAL_CD AND GOODS_INNB = FG.GOODS_INNB)
AND RB.USE_AT = 'Y' AND RB.DEPTH = 0 AND RBM.BBS_TY_CD IN ('06', '07')), 0) AS AVG_EVL_SCORE
,IFNULL((SELECT COUNT(RB.BBSCTT_INNB)
FROM GC_BOARDDATA_GOODS RBG
INNER JOIN GC_BOARDDATA RB ON RB.BBSCTT_INNB = RBG.BBSCTT_INNB AND RB.SOPMAL_CD = RBG.SOPMAL_CD
INNER JOIN GC_BOARDMANAGER RBM ON RBM.BBS_ID = RB.BBS_ID AND RBM.SOPMAL_CD = RB.SOPMAL_CD
WHERE RBG.SOPMAL_CD = FG.SOPMAL_CD
AND RBG.GOODS_INNB IN (SELECT CAST(RVW_GROUP_NB AS DECIMAL(10)) FROM GC_GOODS_RVW_V WHERE SOPMAL_CD = FG.SOPMAL_CD AND GOODS_INNB = FG.GOODS_INNB)
AND RB.USE_AT = 'Y' AND RB.DEPTH = 0 AND RBM.BBS_TY_CD IN ('06', '07')), 0) AS CNT_EVL_SCOR
FROM GC_BOARDDATA_GOODS FBG FROM GC_BOARDDATA_GOODS FBG
INNER JOIN GC_GOODS FG ON INNER JOIN GC_GOODS FG ON
FG.GOODS_INNB = FBG.GOODS_INNB FG.GOODS_INNB = FBG.GOODS_INNB
@@ -2676,6 +2711,9 @@
INNER JOIN GC_GOODS_OPTION FGO ON INNER JOIN GC_GOODS_OPTION FGO ON
FG.GOODS_INNB = FGO.GOODS_INNB FG.GOODS_INNB = FGO.GOODS_INNB
AND FG.SOPMAL_CD = FGO.SOPMAL_CD AND FG.SOPMAL_CD = FGO.SOPMAL_CD
LEFT JOIN GC_GOODS_EXPSR_INFO FEGI ON
FG.SOPMAL_CD = FEGI.SOPMAL_CD
AND FEGI.USE_AT = 'Y'
WHERE 1 = 1 WHERE 1 = 1
AND FG.SOPMAL_CD =#{sopmalCd} AND FG.SOPMAL_CD =#{sopmalCd}
AND FBG.BBSCTT_INNB = AND FBG.BBSCTT_INNB =
@@ -2688,6 +2726,16 @@
</otherwise> </otherwise>
</choose> </choose>
AND FGO.STDR_DV_AT = 'Y' AND FGO.STDR_DV_AT = 'Y'
<if test="serverDv == 'sopmal'">
AND FGO.OPTN_EXPSR_AT = 'Y'
AND FGO.USE_AT = 'Y'
AND FG.USE_AT = 'Y'
AND FG.GOODS_KND_CD = '01'
AND FG.GOODS_STTUS_CD IN ('01', '02')
AND (FG.EXPSR_DV_CD = '01' OR (FG.EXPSR_DV_CD = '03' AND SYSDATE() BETWEEN FG.EXPSR_BGN_DT AND FG.EXPSR_END_DT))
ORDER BY CASE FG.GOODS_STTUS_CD WHEN '02' THEN 1 ELSE 0 END ASC, FBG.REGIST_DT ASC, FBG.GOODS_INNB ASC
LIMIT 12
</if>
</select> </select>
<!-- 게시글 연관상품 삭제 (게시글 수정시)--> <!-- 게시글 연관상품 삭제 (게시글 수정시)-->

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wb.domainserver.domain.gcone.goods.badge.mapper.BOGoodsBadgeMapper">
<select id="selectBOGoodsBadgeList" parameterType="com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO" resultType="dataMap">
SELECT BADGE_CD, BADGE_NM, FONT_COLOR, BG_COLOR, BORDER_COLOR, SORT_ORDR, USE_AT
FROM GC_GOODS_BADGE
WHERE SOPMAL_CD = #{sopmalCd}
ORDER BY SORT_ORDR ASC, BADGE_CD ASC
</select>
<select id="selectBOGoodsBadgeCount" parameterType="com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO" resultType="int">
SELECT COUNT(1) FROM GC_GOODS_BADGE WHERE SOPMAL_CD = #{sopmalCd} AND BADGE_CD = #{badgeCd}
</select>
<insert id="insertBOGoodsBadge" parameterType="com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO">
INSERT INTO GC_GOODS_BADGE (
SOPMAL_CD, BADGE_CD, BADGE_NM, FONT_COLOR, BG_COLOR, BORDER_COLOR, SORT_ORDR, USE_AT, REGUSR, REGIST_DT, UPDUSR, UPDT_DT
) VALUES (
#{sopmalCd}, #{badgeCd}, #{badgeNm}, #{fontColor}, #{bgColor}, #{borderColor}, #{sortOrdr}, #{useAt}, #{regusr}, SYSDATE(), #{updusr}, SYSDATE()
)
</insert>
<update id="updateBOGoodsBadge" parameterType="com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO">
UPDATE GC_GOODS_BADGE
SET BADGE_NM = #{badgeNm}, FONT_COLOR = #{fontColor}, BG_COLOR = #{bgColor}, BORDER_COLOR = #{borderColor},
SORT_ORDR = #{sortOrdr}, USE_AT = #{useAt}, UPDUSR = #{updusr}, UPDT_DT = SYSDATE()
WHERE SOPMAL_CD = #{sopmalCd} AND BADGE_CD = #{badgeCd}
</update>
</mapper>

View File

@@ -5,6 +5,20 @@
상품/사은품 START 상품/사은품 START
############################--> ############################-->
<!-- 관리자 상품 배지 목록 -->
<select id="selectBOGoodsBadgeList" parameterType="com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO" resultType="dataMap">
SELECT BADGE_CD AS cd
, BADGE_NM AS cdNm
, FONT_COLOR AS fontColor
, BG_COLOR AS bgColor
, BORDER_COLOR AS borderColor
, SORT_ORDR AS sortOrdr
FROM GC_GOODS_BADGE
WHERE SOPMAL_CD = #{sopmalCd}
AND USE_AT = 'Y'
ORDER BY SORT_ORDR ASC, BADGE_CD ASC
</select>
<sql id="goodsWhere"> <sql id="goodsWhere">
<!-- 검색조건 별 검색 --> <!-- 검색조건 별 검색 -->
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(srchStr)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(srchStr)">
@@ -223,72 +237,86 @@
<choose> <choose>
<when test="sortDv == 'goodsNmAsc'"> <when test="sortDv == 'goodsNmAsc'">
<![CDATA[ <![CDATA[
ORDER BY FG.GOODS_NM ASC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, FG.GOODS_NM ASC
]]> ]]>
</when> </when>
<when test="sortDv == 'goodsNmDesc'"> <when test="sortDv == 'goodsNmDesc'">
<![CDATA[ <![CDATA[
ORDER BY FG.GOODS_NM DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, FG.GOODS_NM DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'slepricAsc'"> <when test="sortDv == 'slepricAsc'">
<![CDATA[ <![CDATA[
ORDER BY SLEPRIC ASC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, SLEPRIC ASC
]]> ]]>
</when> </when>
<when test="sortDv == 'slepricDesc'"> <when test="sortDv == 'slepricDesc'">
<![CDATA[ <![CDATA[
ORDER BY SLEPRIC DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, SLEPRIC DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'cnsmrpricAsc'"> <when test="sortDv == 'cnsmrpricAsc'">
<![CDATA[ <![CDATA[
ORDER BY CNSMRPRIC ASC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, CNSMRPRIC ASC
]]> ]]>
</when> </when>
<when test="sortDv == 'cnsmrpricDesc'"> <when test="sortDv == 'cnsmrpricDesc'">
<![CDATA[ <![CDATA[
ORDER BY CNSMRPRIC DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, CNSMRPRIC DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'invntryQyAsc'"> <when test="sortDv == 'invntryQyAsc'">
<![CDATA[ <![CDATA[
ORDER BY INVNTRY_QY ASC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, INVNTRY_QY ASC
]]> ]]>
</when> </when>
<when test="sortDv == 'invntryQyDesc'"> <when test="sortDv == 'invntryQyDesc'">
<![CDATA[ <![CDATA[
ORDER BY INVNTRY_QY DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, INVNTRY_QY DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'registDtAsc'"> <when test="sortDv == 'registDtAsc'">
<![CDATA[ <![CDATA[
ORDER BY REGIST_DT ASC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, REGIST_DT ASC
]]> ]]>
</when> </when>
<when test="sortDv == 'registDtDesc'"> <when test="sortDv == 'registDtDesc'">
<![CDATA[ <![CDATA[
ORDER BY REGIST_DT DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, REGIST_DT DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'avgEvlScore'"> <when test="sortDv == 'avgEvlScore'">
<![CDATA[ <![CDATA[
ORDER BY GCL.GOODS_ORDR, AVG_EVL_SCORE DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, GCL.GOODS_ORDR, AVG_EVL_SCORE DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'cntEvlScor'"> <when test="sortDv == 'cntEvlScor'">
<![CDATA[ <![CDATA[
ORDER BY CNT_EVL_SCOR DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, CNT_EVL_SCOR DESC
]]> ]]>
</when> </when>
<when test="sortDv == 'goodsInnbDesc'"> <when test="sortDv == 'goodsInnbDesc'">
<![CDATA[ <![CDATA[
ORDER BY GOODS.GOODS_INNB DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, GOODS.GOODS_INNB DESC
]]> ]]>
</when> </when>
<otherwise> <otherwise>
<![CDATA[ <![CDATA[
ORDER BY GCL.GOODS_ORDR, AVG_EVL_SCORE DESC ORDER BY CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, GCL.GOODS_ORDR, AVG_EVL_SCORE DESC
]]> ]]>
</otherwise> </otherwise>
</choose> </choose>
@@ -503,6 +531,7 @@
FG.REPRSNT_GOODS_CD, FG.REPRSNT_GOODS_CD,
FG.BRAND_CD, FG.BRAND_CD,
FG.GOODS_NM, FG.GOODS_NM,
FG.GOODS_NM_EN,
FG.TAX_AT, FG.TAX_AT,
FG.GOODS_STTUS_CD, FG.GOODS_STTUS_CD,
FG.SEL_STPGE_CUSTOM_WORDS_AT, FG.SEL_STPGE_CUSTOM_WORDS_AT,
@@ -1944,6 +1973,8 @@
,GROUP_CONCAT(CASE WHEN IFNULL(FGO.OPTN_CD_4, '') = '' THEN ' ' ELSE FGO.OPTN_CD_4 END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS OPTN_CD_4 -- 옵션코드 1 ,GROUP_CONCAT(CASE WHEN IFNULL(FGO.OPTN_CD_4, '') = '' THEN ' ' ELSE FGO.OPTN_CD_4 END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS OPTN_CD_4 -- 옵션코드 1
,GROUP_CONCAT( CASE WHEN IFNULL(FGO.OPTN_INFO, '') = '' THEN ' ' ELSE FGO.OPTN_INFO END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS OPTN_INFO -- 옵션정보 ,GROUP_CONCAT( CASE WHEN IFNULL(FGO.OPTN_INFO, '') = '' THEN ' ' ELSE FGO.OPTN_INFO END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS OPTN_INFO -- 옵션정보
,GROUP_CONCAT(FGO.MLG_POLICY_CD ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS MLG_POLICY_CD -- 마일리지정책코드 ,GROUP_CONCAT(FGO.MLG_POLICY_CD ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS MLG_POLICY_CD -- 마일리지정책코드
,GROUP_CONCAT(FGO.HSCODE ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS HSCODE -- HS Code
,GROUP_CONCAT(FGO.REAL_WT ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS REAL_WT -- 실무게(KG)
,GROUP_CONCAT(FGO.INVNTRY_QY ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS INVNTRY_QY -- 재고수량 ,GROUP_CONCAT(FGO.INVNTRY_QY ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS INVNTRY_QY -- 재고수량
,GROUP_CONCAT(CASE WHEN FG.INVNTRY_POLICY_CD = '01' THEN FGO.INVNTRY_QY - IFNULL(FGO.USEFUL_INVNTRY_QY, 0) ELSE FGO.INVNTRY_QY END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS USEFUL_INVNTRY -- 가용재고수량 ,GROUP_CONCAT(CASE WHEN FG.INVNTRY_POLICY_CD = '01' THEN FGO.INVNTRY_QY - IFNULL(FGO.USEFUL_INVNTRY_QY, 0) ELSE FGO.INVNTRY_QY END ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS USEFUL_INVNTRY -- 가용재고수량
,GROUP_CONCAT(ROUND(IFNULL(FGO.USEFUL_INVNTRY_QY, 0), 0) ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS USEFUL_INVNTRY_QY -- 판매재고수량 ,GROUP_CONCAT(ROUND(IFNULL(FGO.USEFUL_INVNTRY_QY, 0), 0) ORDER BY FGO.OPTN_ORDR ASC SEPARATOR '|') AS USEFUL_INVNTRY_QY -- 판매재고수량
@@ -2011,6 +2042,7 @@
GOODS_CD, GOODS_CD,
REPRSNT_GOODS_CD, REPRSNT_GOODS_CD,
GOODS_NM, GOODS_NM,
GOODS_NM_EN,
TAX_AT, TAX_AT,
GOODS_STTUS_CD, GOODS_STTUS_CD,
SEL_STPGE_CUSTOM_WORDS_AT, SEL_STPGE_CUSTOM_WORDS_AT,
@@ -2079,6 +2111,7 @@
#{goodsCd}, #{goodsCd},
#{reprsntGoodsCd}, #{reprsntGoodsCd},
#{goodsNm}, #{goodsNm},
#{goodsNmEn},
#{taxAt}, #{taxAt},
#{goodsSttusCd}, #{goodsSttusCd},
#{selStpgeCustomWordsAt}, #{selStpgeCustomWordsAt},
@@ -2188,6 +2221,7 @@
GC_GOODS FG GC_GOODS FG
set set
GOODS_NM = #{goodsNm} -- 상품명 GOODS_NM = #{goodsNm} -- 상품명
, GOODS_NM_EN = #{goodsNmEn} -- 상품명(영문)
, SRT_DC = #{srtDc} -- 간략설명 , SRT_DC = #{srtDc} -- 간략설명
, REPRSNT_DC = #{reprsntDc} -- 대표설명 , REPRSNT_DC = #{reprsntDc} -- 대표설명
, BRAND_CD = #{brandCd} -- 브랜드 , BRAND_CD = #{brandCd} -- 브랜드
@@ -2534,6 +2568,8 @@
OPTN_CD_3, OPTN_CD_3,
OPTN_CD_4, OPTN_CD_4,
OPTN_INFO, OPTN_INFO,
HSCODE,
REAL_WT,
INVNTRY_QY, INVNTRY_QY,
USEFUL_INVNTRY_QY, USEFUL_INVNTRY_QY,
CNSMRPRIC, CNSMRPRIC,
@@ -2572,6 +2608,8 @@
#{optnCd3}, #{optnCd3},
#{optnCd4}, #{optnCd4},
#{optnInfo}, #{optnInfo},
#{hscode},
#{realWt},
#{invntryQy}, #{invntryQy},
#{usefulInvntryQy}, #{usefulInvntryQy},
#{cnsmrpric}, #{cnsmrpric},
@@ -2686,6 +2724,8 @@
OPTN_CD_3 = #{optnCd3}, OPTN_CD_3 = #{optnCd3},
OPTN_CD_4 = #{optnCd4}, OPTN_CD_4 = #{optnCd4},
OPTN_INFO = #{optnInfo}, OPTN_INFO = #{optnInfo},
HSCODE = #{hscode},
REAL_WT = #{realWt},
INVNTRY_QY = #{invntryQy}, INVNTRY_QY = #{invntryQy},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(usefulInvntryQy)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(usefulInvntryQy)">
USEFUL_INVNTRY_QY = #{usefulInvntryQy}, USEFUL_INVNTRY_QY = #{usefulInvntryQy},
@@ -3597,6 +3637,23 @@
]]> ]]>
</select> </select>
<!-- 검색어 로그 저장 -->
<insert id="insertBOSrchwrdLog" parameterType="com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO" >
INSERT INTO GC_SRCHWRD_LOG (
SRCHWRD,
MBR_INNB,
CONECT_DOMN,
CONECT_URL,
SRCH_DT
) VALUES (
#{srchStr},
#{mbrInnb},
#{conectDomn},
#{conectUrl},
SYSDATE()
)
</insert>
<!-- 사용자 - 검색 - 상품명 검색어 조회--> <!-- 사용자 - 검색 - 상품명 검색어 조회-->
<select id="selectBOSrchGoodsNm" parameterType="com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO" resultType="dataMap"> <select id="selectBOSrchGoodsNm" parameterType="com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO" resultType="dataMap">
SELECT SELECT

View File

@@ -202,6 +202,7 @@
, GOODS_INNB , GOODS_INNB
, GOODS_IMG_COURS , GOODS_IMG_COURS
, GOODS_NM , GOODS_NM
, GOODS_NM_EN
, SUBSCRPT_WTHDRAW_POSBL_AT , SUBSCRPT_WTHDRAW_POSBL_AT
, INDVDLZ_CANCL_POSBL_AT , INDVDLZ_CANCL_POSBL_AT
, INDVDLZ_DLIVY_POSBL_AT , INDVDLZ_DLIVY_POSBL_AT
@@ -216,6 +217,7 @@
, #{goodsInnb} , #{goodsInnb}
, #{goodsImgCours} , #{goodsImgCours}
, #{goodsNm} , #{goodsNm}
, #{goodsNmEn}
, #{subscrptWthdrawPosblAt} , #{subscrptWthdrawPosblAt}
, #{indvdlzCanclPosblAt} , #{indvdlzCanclPosblAt}
, #{indvdlzDlivyPosblAt} , #{indvdlzDlivyPosblAt}
@@ -305,6 +307,10 @@
, STEP85 , STEP85
, COMPNB_DSCNT_AT , COMPNB_DSCNT_AT
, SCTN_DSCNT_AT , SCTN_DSCNT_AT
, HSCODE
, REAL_WT
, VOL_WT
, PACKAGE_CNT
, PURCHS_DCSN_AT , PURCHS_DCSN_AT
, PURCHS_DCSN_QY , PURCHS_DCSN_QY
, RETURN_DLVY_APPLC_AT , RETURN_DLVY_APPLC_AT
@@ -334,8 +340,8 @@
, #{relateOrdrGoodsOptnInnb} , #{relateOrdrGoodsOptnInnb}
, #{ordrQy} , #{ordrQy}
, #{mlgAccmlCn} , #{mlgAccmlCn}
,SP.MLG_VALID_PD , SP.MLG_VALID_PD
,SP.MLG_VALID_PD_AT , SP.MLG_VALID_PD_AT
, #{npayGoodsOrdrnb} , #{npayGoodsOrdrnb}
, #{npayBundleDlvyNb} , #{npayBundleDlvyNb}
, #{posGoodsCd} , #{posGoodsCd}
@@ -368,8 +374,12 @@
, #{step65} , #{step65}
, #{step75} , #{step75}
, #{step85} , #{step85}
,GI.COMPNB_DSCNT_AT , GI.COMPNB_DSCNT_AT
,GI.SCTN_DSCNT_AT , GI.SCTN_DSCNT_AT
, #{hscode}
, #{realWt}
, #{volWt}
, #{packageCnt}
, 'N' , 'N'
, 0 , 0
, SG.RETURN_DLVY_APPLC_AT , SG.RETURN_DLVY_APPLC_AT
@@ -1499,6 +1509,7 @@ FROM (
SELECT FG.SOPMAL_CD SELECT FG.SOPMAL_CD
, FG.GOODS_INNB , FG.GOODS_INNB
, FG.GOODS_NM , FG.GOODS_NM
, FG.GOODS_NM_EN
, FG.GOODS_KND_CD , FG.GOODS_KND_CD
, FG.GOODS_STTUS_CD , FG.GOODS_STTUS_CD
, FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD) AS GOODS_STTUS_NM , FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD) AS GOODS_STTUS_NM
@@ -1511,7 +1522,7 @@ FROM (
, CONCAT(OPTN1, IF(FGO.OPTN2 IS NULL , '', CONCAT('/', OPTN2)) , CONCAT(OPTN1, IF(FGO.OPTN2 IS NULL , '', CONCAT('/', OPTN2))
, IF(FGO.OPTN3 IS NULL , '', CONCAT('/', OPTN3)) , IF(FGO.OPTN3 IS NULL , '', CONCAT('/', OPTN3))
, IF(FGO.OPTN4 IS NULL , '', CONCAT('/', OPTN4))) AS OPTN , IF(FGO.OPTN4 IS NULL , '', CONCAT('/', OPTN4))) AS OPTN
,IMG.IMG AS GOODS_IMG_COURS , IMG.IMG AS GOODS_IMG_COURS
, ( , (
SELECT FGI.IMG AS GOODS_IMG SELECT FGI.IMG AS GOODS_IMG
FROM GC_GOODS_IMAGE FGI FROM GC_GOODS_IMAGE FGI
@@ -1939,6 +1950,10 @@ FROM (
, FGO.OPTN_CD_2 , FGO.OPTN_CD_2
, FGO.OPTN_CD_3 , FGO.OPTN_CD_3
, FGO.OPTN_CD_4 , FGO.OPTN_CD_4
, FGO.HSCODE
, FGO.REAL_WT
, FGO.VOL_WT
, FGO.PACKAGE_CNT
, FGO.OPTN_INFO , FGO.OPTN_INFO
, FGO.OPTN_RELATE_NB , FGO.OPTN_RELATE_NB
FROM ( FROM (
@@ -1974,6 +1989,10 @@ FROM (
, FGO.OPTN_CD_2 , FGO.OPTN_CD_2
, FGO.OPTN_CD_3 , FGO.OPTN_CD_3
, FGO.OPTN_CD_4 , FGO.OPTN_CD_4
, FGO.HSCODE
, FGO.REAL_WT
, FGO.VOL_WT
, FGO.PACKAGE_CNT
, FGO.OPTN_INFO , FGO.OPTN_INFO
, FGO.OPTN_RELATE_NB , FGO.OPTN_RELATE_NB
FROM GC_GOODS_OPTION FGO FROM GC_GOODS_OPTION FGO
@@ -2000,11 +2019,16 @@ FROM (
ELSE FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD) ELSE FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD)
END AS GOODS_STTUS_NM END AS GOODS_STTUS_NM
, FG.GOODS_NM , FG.GOODS_NM
, FG.GOODS_NM_EN
, FGO.GOODS_OPTN_INNB , FGO.GOODS_OPTN_INNB
, FGO.OPTN_TY , FGO.OPTN_TY
, FGO.OPTN_RELATE_NB , FGO.OPTN_RELATE_NB
, FGO.COMPNB_DSCNT_AT , FGO.COMPNB_DSCNT_AT
, FGO.SCTN_DSCNT_AT , FGO.SCTN_DSCNT_AT
, FGO.HSCODE
, FGO.REAL_WT
, FGO.VOL_WT
, FGO.PACKAGE_CNT
, NULLIF(FGO.OPTN_ESSNTL_AT, '') AS OPTN_ESSNTL_AT , NULLIF(FGO.OPTN_ESSNTL_AT, '') AS OPTN_ESSNTL_AT
, FORMAT(IFNULL(FGO.CNSMRPRIC, 0) * #{qy}, 0) AS SUB_CNSMRPRIC_BY_FORMAT , FORMAT(IFNULL(FGO.CNSMRPRIC, 0) * #{qy}, 0) AS SUB_CNSMRPRIC_BY_FORMAT
, IFNULL(FGO.CNSMRPRIC, 0) * #{qy} AS SUB_CNSMRPRIC , IFNULL(FGO.CNSMRPRIC, 0) * #{qy} AS SUB_CNSMRPRIC
@@ -2065,6 +2089,10 @@ FROM (
, FGO.OPTN_RELATE_NB , FGO.OPTN_RELATE_NB
, FGO.COMPNB_DSCNT_AT , FGO.COMPNB_DSCNT_AT
, FGO.SCTN_DSCNT_AT , FGO.SCTN_DSCNT_AT
, HSCODE
, REAL_WT
, VOL_WT
, PACKAGE_CNT
FROM GC_GOODS_OPTION FGO FROM GC_GOODS_OPTION FGO
WHERE FGO.GOODS_OPTN_INNB = #{goodsOptnInnb} WHERE FGO.GOODS_OPTN_INNB = #{goodsOptnInnb}
) FGO ON FGO.GOODS_INNB = FG.GOODS_INNB ) FGO ON FGO.GOODS_INNB = FG.GOODS_INNB
@@ -2626,6 +2654,7 @@ FROM (
, FPI.TPAY_USE_AT , FPI.TPAY_USE_AT
, FPI.NPAY_USE_AT , FPI.NPAY_USE_AT
, FPI.KPAY_USE_AT , FPI.KPAY_USE_AT
, FPI.STRIPE_USE_AT
, FPI.MEMOR_USE_AT , FPI.MEMOR_USE_AT
, FPL.KCP_MID , FPL.KCP_MID
, FPL.KCP_CLNT_KEY , FPL.KCP_CLNT_KEY
@@ -2655,6 +2684,9 @@ FROM (
, FPL.OLD_TOSS_CLNT_KEY , FPL.OLD_TOSS_CLNT_KEY
, FPL.OLD_TOSS_SECRET_KEY , FPL.OLD_TOSS_SECRET_KEY
, FPL.OLD_TOSS_PUBLIC_KEY , FPL.OLD_TOSS_PUBLIC_KEY
, FPL.STRIPE_CLNT_KEY
, FPL.STRIPE_SECRET_KEY
, FPL.STRIPE_WEBHOOK_KEY
, FPL.DUE_DT , FPL.DUE_DT
FROM GC_PAY_LINK FPL FROM GC_PAY_LINK FPL
INNER JOIN GC_PAY_INFO FPI ON FPI.SETLE_SETUP_INNB = FPL.SETLE_SETUP_INNB INNER JOIN GC_PAY_INFO FPI ON FPI.SETLE_SETUP_INNB = FPL.SETLE_SETUP_INNB

View File

@@ -172,6 +172,7 @@
<update id="deleteBOMngrSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO"> <update id="deleteBOMngrSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
UPDATE GC_SUBSVC UPDATE GC_SUBSVC
SET USE_AT = 'N' SET USE_AT = 'N'
,SUBSVC_NM = CONCAT('*', SUBSVC_NM)
,UPDUSR = #{updusr} ,UPDUSR = #{updusr}
,UPDT_DT = NOW() ,UPDT_DT = NOW()
WHERE SOPMAL_CD = #{sopmalCd} WHERE SOPMAL_CD = #{sopmalCd}

View File

@@ -3691,9 +3691,11 @@
AND GMP.SOPMAL_CD = #{sopmalCd} AND GMP.SOPMAL_CD = #{sopmalCd}
LEFT JOIN GC_MEMBER_GRAD MG ON GMP.MBR_GRAD_INNB = MG.MBR_GRAD_INNB LEFT JOIN GC_MEMBER_GRAD MG ON GMP.MBR_GRAD_INNB = MG.MBR_GRAD_INNB
AND GMP.SOPMAL_CD = MG.SOPMAL_CD AND GMP.SOPMAL_CD = MG.SOPMAL_CD
AND MG.USE_AT = 'Y'
LEFT JOIN GC_MEMBER_GRAD MG_NEXT LEFT JOIN GC_MEMBER_GRAD MG_NEXT
ON MG.MBR_GRAD_ORDR + 1 = MG_NEXT.MBR_GRAD_ORDR ON MG.MBR_GRAD_ORDR + 1 = MG_NEXT.MBR_GRAD_ORDR
AND MG.SOPMAL_CD = MG_NEXT.SOPMAL_CD AND MG.SOPMAL_CD = MG_NEXT.SOPMAL_CD
AND MG_NEXT.USE_AT = 'Y'
LEFT JOIN GC_ORDER O ON MBR.MBR_DV_CD = O.MBR_DV_CD LEFT JOIN GC_ORDER O ON MBR.MBR_DV_CD = O.MBR_DV_CD
AND MBR.MBR_INNB = O.MBR_INNB AND MBR.MBR_INNB = O.MBR_INNB
AND O.USE_AT = 'Y' AND O.USE_AT = 'Y'

View File

@@ -1332,6 +1332,20 @@
</select> </select>
<!-- 주문 배송 추적 조회 : 송장번호 조회 -->
<select id = "selectBOOrdrInvcnb"
parameterType="com.wb.domainserver.domain.gcone.ordr.dlivy.vo.BODlivyVO"
resultType = "String">
<![CDATA[
SELECT
GGE.INVCNB
FROM GC_GOODS_EXPORT GGE
WHERE GGE.SOPMAL_CD = #{sopmalCd}
AND GGE.ORDR_DLVY_INNB = #{ordrDlvyInnb}
]]>
</select>
<!-- 주문 배송 추적 받는사람, 보내는사람 조회 --> <!-- 주문 배송 추적 받는사람, 보내는사람 조회 -->
<select id = "selectBOOrdrDlvyDtlInqire" <select id = "selectBOOrdrDlvyDtlInqire"
parameterType="com.wb.domainserver.domain.gcone.ordr.dlivy.vo.BODlivyVO" parameterType="com.wb.domainserver.domain.gcone.ordr.dlivy.vo.BODlivyVO"

View File

@@ -1076,6 +1076,10 @@
WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM, ' ', FOI.OPTN_NM) WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM, ' ', FOI.OPTN_NM)
ELSE FOI.GOODS_NM ELSE FOI.GOODS_NM
END AS goods_nm END AS goods_nm
, CASE
WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM_EN, ' ', FOI.OPTN_NM)
ELSE FOI.GOODS_NM_EN
END AS goods_nm_en
, FOI.INVNTRY_QY AS invntry_qy , FOI.INVNTRY_QY AS invntry_qy
, 0 AS prchspric , 0 AS prchspric
, FOI.SLEPRIC AS cnsmrpric , FOI.SLEPRIC AS cnsmrpric
@@ -1106,6 +1110,10 @@
, '선불' AS dlvy_amt_setle_mth_nm , '선불' AS dlvy_amt_setle_mth_nm
, FN_GET_COMMCODE_NAME('ORDR_TY', FO.ORDR_TY_CD) AS ordr_ty_nm , FN_GET_COMMCODE_NAME('ORDR_TY', FO.ORDR_TY_CD) AS ordr_ty_nm
, FOI.optn_cd_1 , FOI.optn_cd_1
, FOI.hscode
, FOI.real_wt
, FOI.VOL_TW
, FOI.package_cnt
, FOSH.dlvy_mssage_cn , FOSH.dlvy_mssage_cn
, FN_GET_COMMCODE_NAME('ORDR_STTUS', FOSH.ORDR_STTUS_CD) AS shipping_sttus_nm , FN_GET_COMMCODE_NAME('ORDR_STTUS', FOSH.ORDR_STTUS_CD) AS shipping_sttus_nm
, CASE WHEN FO.SUBSVC_AT = 'Y' , CASE WHEN FO.SUBSVC_AT = 'Y'
@@ -1120,11 +1128,16 @@
, GOI.ORDR_GOODS_INNB , GOI.ORDR_GOODS_INNB
, GOI.ORDR_GOODS_OPTN_INNB , GOI.ORDR_GOODS_OPTN_INNB
, GOI.OPTN_CD_1 , GOI.OPTN_CD_1
, GOI.HSCODE
, GOI.REAL_WT
, GOI.VOL_TW
, GOI.PACKAGE_CNT
, GOI.ORDR_STTUS_CD , GOI.ORDR_STTUS_CD
, LAG(GOI.ORDR_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_INNB , LAG(GOI.ORDR_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_INNB
, LAG(GOI.ORDR_DLVY_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_DLVY_INNB , LAG(GOI.ORDR_DLVY_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_DLVY_INNB
, MAX(FN_GET_GOODS_IMAGE(GOI.SOPMAL_CD, GOI.GOODS_INNB, '03')) AS GOODS_IMG_COURS , MAX(FN_GET_GOODS_IMAGE(GOI.SOPMAL_CD, GOI.GOODS_INNB, '03')) AS GOODS_IMG_COURS
, MAX(GOI.GOODS_NM) AS GOODS_NM , MAX(GOI.GOODS_NM) AS GOODS_NM
, MAX(GOI.GOODS_NM_EN) AS GOODS_NM_EN
, MAX(FN_GET_ORDER_GOODS_OPTN_NAME(GOI.SOPMAL_CD, GOI.ORDR_INNB, GOI.ORDR_GOODS_OPTN_INNB)) AS OPTN_NM , MAX(FN_GET_ORDER_GOODS_OPTN_NAME(GOI.SOPMAL_CD, GOI.ORDR_INNB, GOI.ORDR_GOODS_OPTN_INNB)) AS OPTN_NM
, SUM(GOI.ORDR_QY) AS ORDR_QY , SUM(GOI.ORDR_QY) AS ORDR_QY
, SUM(GOI.SLEPRIC) AS SLEPRIC , SUM(GOI.SLEPRIC) AS SLEPRIC
@@ -1154,6 +1167,10 @@
, GOI.ORDR_GOODS_INNB , GOI.ORDR_GOODS_INNB
, GOI.ORDR_GOODS_OPTN_INNB , GOI.ORDR_GOODS_OPTN_INNB
, GOI.OPTN_CD_1 , GOI.OPTN_CD_1
, GOI.HSCODE
, GOI.REAL_WT
, GOI.VOL_TW
, GOI.PACKAGE_CNT
, GOI.ORDR_STTUS_CD , GOI.ORDR_STTUS_CD
) FOI ) FOI
ON FOI.SOPMAL_CD = FO.SOPMAL_CD ON FOI.SOPMAL_CD = FO.SOPMAL_CD
@@ -1220,6 +1237,7 @@
, GROUP_CONCAT(A.ORDR_GOODS_INNB ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS ORDR_GOODS_INNB , GROUP_CONCAT(A.ORDR_GOODS_INNB ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS ORDR_GOODS_INNB
, GROUP_CONCAT(A.NPAY_GOODS_ORDRNB ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS NPAY_GOODS_ORDRNB , GROUP_CONCAT(A.NPAY_GOODS_ORDRNB ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS NPAY_GOODS_ORDRNB
, GROUP_CONCAT(A.GOODS_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS GOODS_NM , GROUP_CONCAT(A.GOODS_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS GOODS_NM
, GROUP_CONCAT(A.GOODS_NM_EN ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS GOODS_NM_EN
, GROUP_CONCAT(A.INVNTRY_QY ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS INVNTRY_QY , GROUP_CONCAT(A.INVNTRY_QY ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS INVNTRY_QY
, GROUP_CONCAT(A.PRCHSPRIC ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS PRCHSPRIC , GROUP_CONCAT(A.PRCHSPRIC ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS PRCHSPRIC
, GROUP_CONCAT(A.CNSMRPRIC ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS CNSMRPRIC , GROUP_CONCAT(A.CNSMRPRIC ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS CNSMRPRIC
@@ -1247,6 +1265,10 @@
, GROUP_CONCAT(A.DLVY_AMT_SETLE_MTH_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS DLVY_AMT_SETLE_MTH_NM , GROUP_CONCAT(A.DLVY_AMT_SETLE_MTH_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS DLVY_AMT_SETLE_MTH_NM
, GROUP_CONCAT(A.ORDR_TY_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS ORDR_TY_NM , GROUP_CONCAT(A.ORDR_TY_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS ORDR_TY_NM
, GROUP_CONCAT(A.OPTN_CD_1 ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS OPTN_CD_1 , GROUP_CONCAT(A.OPTN_CD_1 ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS OPTN_CD_1
, GROUP_CONCAT(A.HSCODE ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS HSCODE
, GROUP_CONCAT(A.REAL_WT ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS REAL_WT
, GROUP_CONCAT(A.VOL_TW ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS VOL_TW
, GROUP_CONCAT(A.PACKAGE_CNT ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS PACKAGE_CNT
, GROUP_CONCAT(A.DLVY_MSSAGE_CN ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS DLVY_MSSAGE_CN , GROUP_CONCAT(A.DLVY_MSSAGE_CN ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS DLVY_MSSAGE_CN
, GROUP_CONCAT(A.SHIPPING_STTUS_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS SHIPPING_STTUS_NM , GROUP_CONCAT(A.SHIPPING_STTUS_NM ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS SHIPPING_STTUS_NM
, GROUP_CONCAT(A.SUBSVC_AT ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS SUBSVC_AT , GROUP_CONCAT(A.SUBSVC_AT ORDER BY A.ORDR_GOODS_INNB ASC SEPARATOR '\n') AS SUBSVC_AT
@@ -1285,6 +1307,10 @@
WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM, ' ', FOI.OPTN_NM) WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM, ' ', FOI.OPTN_NM)
ELSE FOI.GOODS_NM ELSE FOI.GOODS_NM
END AS GOODS_NM END AS GOODS_NM
, CASE
WHEN FOI.OPTN_NM IS NOT NULL THEN CONCAT(FOI.GOODS_NM_EN, ' ', FOI.OPTN_NM)
ELSE FOI.GOODS_NM_EN
END AS GOODS_NM_EN
, FOI.INVNTRY_QY , FOI.INVNTRY_QY
, 0 AS PRCHSPRIC , 0 AS PRCHSPRIC
, FOI.SLEPRIC AS CNSMRPRIC , FOI.SLEPRIC AS CNSMRPRIC
@@ -1315,6 +1341,10 @@
, '선불' AS DLVY_AMT_SETLE_MTH_NM , '선불' AS DLVY_AMT_SETLE_MTH_NM
, FN_GET_COMMCODE_NAME('ORDR_TY', FO.ORDR_TY_CD) AS ORDR_TY_NM , FN_GET_COMMCODE_NAME('ORDR_TY', FO.ORDR_TY_CD) AS ORDR_TY_NM
, FOI.OPTN_CD_1 , FOI.OPTN_CD_1
, FOI.HSCODE
, FOI.REAL_WT
, FOI.VOL_TW
, FOI.PACKAGE_CNT
, FOSH.DLVY_MSSAGE_CN , FOSH.DLVY_MSSAGE_CN
, FN_GET_COMMCODE_NAME('ORDR_STTUS', FOSH.ORDR_STTUS_CD) AS SHIPPING_STTUS_NM , FN_GET_COMMCODE_NAME('ORDR_STTUS', FOSH.ORDR_STTUS_CD) AS SHIPPING_STTUS_NM
, CASE WHEN FO.SUBSVC_AT = 'Y' , CASE WHEN FO.SUBSVC_AT = 'Y'
@@ -1329,11 +1359,16 @@
, GOI.ORDR_GOODS_INNB , GOI.ORDR_GOODS_INNB
, GOI.ORDR_GOODS_OPTN_INNB , GOI.ORDR_GOODS_OPTN_INNB
, GOI.OPTN_CD_1 , GOI.OPTN_CD_1
, GOI.HSCODE
, GOI.REAL_WT
, GOI.VOL_TW
, GOI.PACKAGE_CNT
, GOI.ORDR_STTUS_CD , GOI.ORDR_STTUS_CD
, LAG(GOI.ORDR_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_INNB , LAG(GOI.ORDR_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_INNB
, LAG(GOI.ORDR_DLVY_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_DLVY_INNB , LAG(GOI.ORDR_DLVY_INNB) OVER(ORDER BY GOI.ORDR_INNB) AS REV_ORDR_DLVY_INNB
, MAX(FN_GET_GOODS_IMAGE(GOI.SOPMAL_CD, GOI.GOODS_INNB, '03')) AS GOODS_IMG_COURS , MAX(FN_GET_GOODS_IMAGE(GOI.SOPMAL_CD, GOI.GOODS_INNB, '03')) AS GOODS_IMG_COURS
, MAX(GOI.GOODS_NM) AS GOODS_NM , MAX(GOI.GOODS_NM) AS GOODS_NM
, MAX(GOI.GOODS_NM_EN) AS GOODS_NM_EN
, MAX(FN_GET_ORDER_GOODS_OPTN_NAME(GOI.SOPMAL_CD, GOI.ORDR_INNB, GOI.ORDR_GOODS_OPTN_INNB)) AS OPTN_NM , MAX(FN_GET_ORDER_GOODS_OPTN_NAME(GOI.SOPMAL_CD, GOI.ORDR_INNB, GOI.ORDR_GOODS_OPTN_INNB)) AS OPTN_NM
, SUM(GOI.ORDR_QY) AS ORDR_QY , SUM(GOI.ORDR_QY) AS ORDR_QY
, SUM(GOI.SLEPRIC) AS SLEPRIC , SUM(GOI.SLEPRIC) AS SLEPRIC
@@ -1363,6 +1398,10 @@
, GOI.ORDR_GOODS_INNB , GOI.ORDR_GOODS_INNB
, GOI.ORDR_GOODS_OPTN_INNB , GOI.ORDR_GOODS_OPTN_INNB
, GOI.OPTN_CD_1 , GOI.OPTN_CD_1
, GOI.HSCODE
, GOI.REAL_WT
, GOI.VOL_TW
, GOI.PACKAGE_CNT
, GOI.ORDR_STTUS_CD , GOI.ORDR_STTUS_CD
) FOI ) FOI
ON FOI.SOPMAL_CD = FO.SOPMAL_CD ON FOI.SOPMAL_CD = FO.SOPMAL_CD
@@ -1973,6 +2012,7 @@
SELECT FOS.SOPMAL_CD SELECT FOS.SOPMAL_CD
, FOS.ORDR_INNB , FOS.ORDR_INNB
, FOS.ORDR_DLVY_INNB , FOS.ORDR_DLVY_INNB
, FOS.DLVYLC_AREA_CD
, FOS.RECPNT_NM , FOS.RECPNT_NM
, CASE , CASE
WHEN LENGTH(CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_TELNB), '1df5be2f7e90ae36') AS CHAR(50))) = 11 THEN WHEN LENGTH(CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_TELNB), '1df5be2f7e90ae36') AS CHAR(50))) = 11 THEN
@@ -2002,6 +2042,7 @@
ELSE ELSE
CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_MBTLNB), '1df5be2f7e90ae36') AS CHAR(50)) CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_MBTLNB), '1df5be2f7e90ae36') AS CHAR(50))
END AS RECPNT_MBTLNB END AS RECPNT_MBTLNB
, FOS.CSTMCLER_CD
, FOS.DLVYLC_ZIP , FOS.DLVYLC_ZIP
, FOS.DLVYLC_ADRES_DV_CD , FOS.DLVYLC_ADRES_DV_CD
, CASE WHEN FOS.DLVYLC_ADRES_DV_CD = '01' , CASE WHEN FOS.DLVYLC_ADRES_DV_CD = '01'
@@ -2351,6 +2392,9 @@
SET FOS.RECPNT_NM = #{recpntNm} SET FOS.RECPNT_NM = #{recpntNm}
, FOS.RECPNT_TELNB = HEX(AES_ENCRYPT(REPLACE(#{recpntTelnb}, '-', ''), '1df5be2f7e90ae36')) , FOS.RECPNT_TELNB = HEX(AES_ENCRYPT(REPLACE(#{recpntTelnb}, '-', ''), '1df5be2f7e90ae36'))
, FOS.RECPNT_MBTLNB = HEX(AES_ENCRYPT(REPLACE(#{recpntMbtlnb}, '-', ''), '1df5be2f7e90ae36')) , FOS.RECPNT_MBTLNB = HEX(AES_ENCRYPT(REPLACE(#{recpntMbtlnb}, '-', ''), '1df5be2f7e90ae36'))
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(cstmclerCd)">
, FOS.CSTMCLER_CD = #{cstmclerCd}
</if>
, FOS.DLVYLC_ZIP = #{dlvylcZip} , FOS.DLVYLC_ZIP = #{dlvylcZip}
, FOS.DLVYLC_ADRES_DV_CD = #{dlvylcAdresDvCd} , FOS.DLVYLC_ADRES_DV_CD = #{dlvylcAdresDvCd}
, FOS.DLVYLC_LNB_ADRES = #{dlvylcLnbAdres} , FOS.DLVYLC_LNB_ADRES = #{dlvylcLnbAdres}
@@ -2610,7 +2654,13 @@
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(procsDtlsDvCd)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(procsDtlsDvCd)">
AND FOL.ADIT_INFO_CN = #{procsDtlsDvCd} AND FOL.ADIT_INFO_CN = #{procsDtlsDvCd}
</if> </if>
ORDER BY FOL.PROCS_DT ASC ORDER BY
FOL.PROCS_DT ASC,
CASE
WHEN FOL.LOG_SJ LIKE '%결제취소 신청%' THEN 1
WHEN FOL.LOG_SJ LIKE '%결제취소 완료%' THEN 2
ELSE 3
END ASC
) DTLS ) DTLS
</select> </select>
@@ -2878,6 +2928,281 @@
#################################### ####################################
--> -->
<!--
####################################
관리자 > 주문 > 주문관리 > 발주서 관리 시작
####################################
-->
<!-- 발주서 목록 건수 -->
<select id="selectExcelListPurchOrderTotCnt" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrSrchVO" resultType="Integer">
SELECT COUNT(1)
FROM GC_ORDER GO
INNER JOIN GC_ORDER_ITEM GOI
ON GOI.ORDR_INNB = GO.ORDR_INNB
AND GOI.SOPMAL_CD = GO.SOPMAL_CD
INNER JOIN GC_ORDER_ITEM_OPTION GOIO
ON GOIO.ORDR_GOODS_INNB = GOI.ORDR_GOODS_INNB
AND GOIO.SOPMAL_CD = GOI.SOPMAL_CD
INNER JOIN GC_ORDER_SHIPPING GOS
ON GOS.ORDR_DLVY_INNB = GOIO.ORDR_DLVY_INNB
AND GOS.SOPMAL_CD = GOIO.SOPMAL_CD
INNER JOIN GC_GOODS_OPTION GGO
ON GGO.GOODS_OPTN_INNB = GOIO.GOODS_OPTN_INNB
AND GGO.GOODS_INNB = GOI.GOODS_INNB
AND GGO.SOPMAL_CD = GO.SOPMAL_CD
LEFT JOIN GC_GOODS_COST GGC
ON GGC.STDR_DE = (
SELECT MAX(GGC.STDR_DE)
FROM GC_GOODS_COST GGC
WHERE GGC.STDR_DE <![CDATA[<=]]> GO.ORDR_RCEPT_DT
)
WHERE 1 = 1
AND GOIO.ORDR_STTUS_CD = #{srchOrdrSttusCd}
AND GO.SOPMAL_CD = #{sopmalCd}
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(dlvylcAreaCds)">
AND GOS.DLVYLC_AREA_CD IN
<foreach collection="dlvylcAreaCds" item="dlvylcAreaCd" open="(" separator="," close=")">
#{dlvylcAreaCd}
</foreach>
</if>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isEquals(excelInclude, 'N')">
AND GOS.EXCEL_DOWN_DT IS NULL
</if>
</select>
<!-- 발주서 목록 조회 -->
<select id="selectExcelListPurchOrder" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrSrchVO" resultType="dataMap">
SELECT *
FROM (
SELECT CAST(@ROWNUM:=@ROWNUM+1 AS UNSIGNED) AS RNUM,
TB.*
FROM (
SELECT
GO.ORDR_RCEPT_DT,
'UNIHAN' AS ENTRPS_CD,
'UNIHAN CO.,LTD.' AS ENTRPS_NM,
'03-5990-2880' AS ENTRPS_TEL,
'RM.302,YOTSUYA-AKEBONOBASHI BLDG.,2-14, SUMIYOSHI-CHO, SHINJUKU-KU, TOKYO, 162-0065, JAPAN' AS ENTRPS_ADRES,
NULL AS SPCL_CSTMCLER_ENTRPS,
NULL AS SPCL_CSTMCLER_CD,
GO.ORDR_INNB,
1 AS PURPS_DV,
GOS.RECPNT_NM,
CAST(AES_DECRYPT(UNHEX(GOS.RECPNT_MBTLNB) , #{secretKey}) AS CHAR(50)) AS RECPNT_MBTLNB,
NULL AS RECPNT_HP,
GOS.CSTMCLER_CD,
GOS.DLVYLC_ZIP,
CASE
WHEN GOS.DLVYLC_ADRES_DV_CD = '01'
THEN GOS.DLVYLC_RNM_ADRES
ELSE GOS.DLVYLC_LNB_ADRES
END DLVYLC_RNM_LNB_ADRES,
GOS.DLVYLC_ADRES_DTL,
GOS.DLVY_MSSAGE_CN,
'www.sake1jan.com' AS CSTMR_PURCHS_SITE,
GOIO.REAL_WT,
GOIO.PACKAGE_CNT,
GOIO.HSCODE,
'A' AS CMMRC_TY,
CONCAT(GOI.GOODS_NM_EN, ' ', GOIO.OPTN_NM_1, '-', GOIO.OPTN_VAL_1) AS CN,
/*원가 관리 시작*/
GOIO.SLEPRIC,
GOS.DFT_DLVY_AMT,
GGC.CSTMS_FEE,
(
(GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
* GGC.PLTFOM_FEE
* GGC.EXPCT_TAX
) AS EXPCT_TAX_AMT,
GGC.EXPCT_TAX,
GGC.KR_DLVY_CT,
GGC.PLTFOM_FEE,
GGC.USD_RATE,
GGO.TAXABLE_USD AS UNIT_VALUE,
/*원가 관리 종료*/
GOIO.ORDR_QY,
GGO.TAXABLE_USD * GOIO.ORDR_QY AS VALUE,
NULL AS BRAND,
NULL AS PRE_FOOD_DCL,
NULL AS PROVD_NATION,
NULL AS PROVD_CMPNY_NM,
NULL AS CHNLNG_GOODS_NM,
NULL AS SHIPPER_PURCHS_SITE,
NULL AS SLE_AGNT_ENTRPS_NM,
NULL AS SLE_AGNT_ENTRPS_REGIST_CD,
NULL AS PURCHS_DLVY_AGENCY_NM,
NULL AS PURCHS_DLVY_AGENCY_REGIST_CD,
NULL AS OVSEA_SELER_NM,
GOS.ORDR_DLVY_INNB AS OVSEA_SELER_REGIST_CD,
CONCAT(GO.SUBSVC_AT, GOS.DLVYLC_AREA_CD, GOS.ORDR_DLVY_INNB) AS SITE_ORDR_INNB,
GOS.EXCEL_DOWN_DT,
/*아래부터는 발주서에 포함되지 않음*/
GO.ORDR_STTUS_CD,
GOI.ORDR_GOODS_INNB,
GOI.GOODS_INNB,
GOI.GOODS_NM,
GOIO.ORDR_GOODS_OPTN_INNB,
GOIO.GOODS_OPTN_INNB,
GOS.DLVYLC_AREA_CD,
GGC.STDR_DE
FROM GC_ORDER GO
INNER JOIN GC_ORDER_ITEM GOI
ON GOI.ORDR_INNB = GO.ORDR_INNB
AND GOI.SOPMAL_CD = GO.SOPMAL_CD
INNER JOIN GC_ORDER_ITEM_OPTION GOIO
ON GOIO.ORDR_GOODS_INNB = GOI.ORDR_GOODS_INNB
AND GOIO.SOPMAL_CD = GOI.SOPMAL_CD
INNER JOIN GC_ORDER_SHIPPING GOS
ON GOS.ORDR_DLVY_INNB = GOIO.ORDR_DLVY_INNB
AND GOS.SOPMAL_CD = GOIO.SOPMAL_CD
INNER JOIN GC_GOODS_OPTION GGO
ON GGO.GOODS_OPTN_INNB = GOIO.GOODS_OPTN_INNB
AND GGO.GOODS_INNB = GOI.GOODS_INNB
AND GGO.SOPMAL_CD = GO.SOPMAL_CD
LEFT JOIN GC_GOODS_COST GGC
ON GGC.STDR_DE = (
SELECT MAX(GGC.STDR_DE)
FROM GC_GOODS_COST GGC
WHERE GGC.STDR_DE <![CDATA[<=]]> GO.ORDR_RCEPT_DT
)
WHERE 1 = 1
AND GOIO.ORDR_STTUS_CD = #{srchOrdrSttusCd}
AND GO.SOPMAL_CD = #{sopmalCd}
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(dlvylcAreaCds)">
AND GOS.DLVYLC_AREA_CD IN
<foreach collection="dlvylcAreaCds" item="dlvylcAreaCd" open="(" separator="," close=")">
#{dlvylcAreaCd}
</foreach>
</if>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isEquals(excelInclude, 'N')">
AND GOS.EXCEL_DOWN_DT IS NULL
</if>
ORDER BY GOS.CSTMCLER_CD ASC
) TB
WHERE (@rownum:=0)=0
) PV
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<!-- 발주서 엑셀다운로드 -->
<select id="selectExcelPoListDwld" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrSrchVO" resultType="dataMap">
SELECT
SYSDATE() AS ORDR_RCEPT_DT,
'UNIHAN' AS ENTRPS_CD,
'UNIHAN CO.,LTD.' AS ENTRPS_NM,
'03-5990-2880' AS ENTRPS_TEL,
'RM.302,YOTSUYA-AKEBONOBASHI BLDG.,2-14, SUMIYOSHI-CHO, SHINJUKU-KU, TOKYO, 162-0065, JAPAN' AS ENTRPS_ADRES,
NULL AS SPCL_CSTMCLER_ENTRPS,
NULL AS SPCL_CSTMCLER_CD,
CONCAT(GO.ORDR_INNB, 'A', GOS.ORDR_DLVY_INNB) AS ORDR_INNB,
1 AS PURPS_DV,
GOS.RECPNT_NM,
CAST(AES_DECRYPT(UNHEX(GOS.RECPNT_MBTLNB) , #{secretKey}) AS CHAR(50)) AS RECPNT_MBTLNB,
NULL AS RECPNT_HP,
GOS.CSTMCLER_CD,
GOS.DLVYLC_ZIP,
CASE
WHEN GOS.DLVYLC_ADRES_DV_CD = '01'
THEN GOS.DLVYLC_RNM_ADRES
ELSE GOS.DLVYLC_LNB_ADRES
END DLVYLC_RNM_LNB_ADRES,
GOS.DLVYLC_ADRES_DTL,
GOS.DLVY_MSSAGE_CN,
'www.sake1jan.com' AS CSTMR_PURCHS_SITE,
GOIO.REAL_WT,
GOIO.PACKAGE_CNT,
GOIO.HSCODE,
'A' AS CMMRC_TY,
CONCAT(GOI.GOODS_NM_EN, ' ', GOIO.OPTN_NM_1, '-', GOIO.OPTN_VAL_1) AS CN,
/*원가 관리 시작*/
GOIO.SLEPRIC,
GOS.DFT_DLVY_AMT,
GGC.CSTMS_FEE,
(
(GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
* GGC.PLTFOM_FEE
* GGC.EXPCT_TAX
) AS EXPCT_TAX_AMT,
GGC.EXPCT_TAX,
GGC.KR_DLVY_CT,
GGC.PLTFOM_FEE,
GGC.USD_RATE,
GGO.TAXABLE_USD AS UNIT_VALUE,
/*원가 관리 종료*/
GOIO.ORDR_QY,
GGO.TAXABLE_USD * GOIO.ORDR_QY AS VALUE,
NULL AS BRAND,
NULL AS PRE_FOOD_DCL,
NULL AS PROVD_NATION,
NULL AS PROVD_CMPNY_NM,
NULL AS CHNLNG_GOODS_NM,
NULL AS SHIPPER_PURCHS_SITE,
NULL AS SLE_AGNT_ENTRPS_NM,
NULL AS SLE_AGNT_ENTRPS_REGIST_CD,
NULL AS PURCHS_DLVY_AGENCY_NM,
NULL AS PURCHS_DLVY_AGENCY_REGIST_CD,
NULL AS OVSEA_SELER_NM,
GOS.ORDR_DLVY_INNB AS OVSEA_SELER_REGIST_CD,
CONCAT(GO.SUBSVC_AT, GOS.DLVYLC_AREA_CD, GOS.ORDR_DLVY_INNB) AS SITE_ORDR_INNB,
GOS.EXCEL_DOWN_DT,
/*아래부터는 발주서에 포함되지 않음*/
GO.ORDR_STTUS_CD,
GOI.ORDR_GOODS_INNB,
GOI.GOODS_INNB,
GOI.GOODS_NM,
GOIO.ORDR_GOODS_OPTN_INNB,
GOIO.GOODS_OPTN_INNB,
GOS.DLVYLC_AREA_CD,
GGC.STDR_DE
FROM GC_ORDER GO
INNER JOIN GC_ORDER_ITEM GOI
ON GOI.ORDR_INNB = GO.ORDR_INNB
AND GOI.SOPMAL_CD = GO.SOPMAL_CD
INNER JOIN GC_ORDER_ITEM_OPTION GOIO
ON GOIO.ORDR_GOODS_INNB = GOI.ORDR_GOODS_INNB
AND GOIO.SOPMAL_CD = GOI.SOPMAL_CD
INNER JOIN GC_ORDER_SHIPPING GOS
ON GOS.ORDR_DLVY_INNB = GOIO.ORDR_DLVY_INNB
AND GOS.SOPMAL_CD = GOIO.SOPMAL_CD
INNER JOIN GC_GOODS_OPTION GGO
ON GGO.GOODS_OPTN_INNB = GOIO.GOODS_OPTN_INNB
AND GGO.GOODS_INNB = GOI.GOODS_INNB
AND GGO.SOPMAL_CD = GO.SOPMAL_CD
LEFT JOIN GC_GOODS_COST GGC
ON GGC.STDR_DE = (
SELECT MAX(GGC.STDR_DE)
FROM GC_GOODS_COST GGC
WHERE GGC.STDR_DE <![CDATA[<=]]> GO.ORDR_RCEPT_DT
)
WHERE 1 = 1
AND GOIO.ORDR_STTUS_CD = #{srchOrdrSttusCd}
AND GO.SOPMAL_CD = #{sopmalCd}
AND <foreach collection="srchInnbPairs" item="pair" index="index" open="(" separator=" OR " close=")">
(
GOS.ORDR_INNB = #{pair.srchOrdrInnb}
AND GOS.ORDR_DLVY_INNB = #{pair.srchOrdrDlvyInnb}
)
</foreach>
ORDER BY GOS.CSTMCLER_CD ASC
</select>
<!-- 엑셀 다운로드 일시 업데이트 -->
<update id="updateExcelDownDt" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrSrchVO">
UPDATE GC_ORDER_SHIPPING GOS
SET GOS.EXCEL_DOWN_DT = SYSDATE()
WHERE <foreach collection="srchInnbPairs" item="pair" index="index" open="(" separator=" OR " close=")">
(
GOS.ORDR_INNB = #{pair.srchOrdrInnb}
AND GOS.ORDR_DLVY_INNB = #{pair.srchOrdrDlvyInnb}
)
</foreach>
</update>
<!--
####################################
관리자 > 주문 > 주문관리 > 발주서 관리 종료
####################################
-->
<!-- <!--
#################################### ####################################
관리자 > 주문 > 개인결제관리 시작 관리자 > 주문 > 개인결제관리 시작
@@ -5734,7 +6059,7 @@
ON GGO.SOPMAL_CD = GG.SOPMAL_CD ON GGO.SOPMAL_CD = GG.SOPMAL_CD
AND GGO.GOODS_INNB = GG.GOODS_INNB AND GGO.GOODS_INNB = GG.GOODS_INNB
JOIN seq JOIN seq
ON seq.n <![CDATA[<=]]> GS.SUB_PD ON seq.n <![CDATA[<=]]> GS.DLVY_CNT
LEFT JOIN GC_GOODS_IMAGE GGI ON GG.SOPMAL_CD = GGI.SOPMAL_CD LEFT JOIN GC_GOODS_IMAGE GGI ON GG.SOPMAL_CD = GGI.SOPMAL_CD
AND GG.GOODS_INNB = GGI.GOODS_INNB AND GG.GOODS_INNB = GGI.GOODS_INNB
AND GGI.IMG_KND = '03' AND GGI.IMG_KND = '03'

View File

@@ -413,16 +413,14 @@
REGIST_DT, REGIST_DT,
UPDUSR, UPDUSR,
UPDT_DT UPDT_DT
) SELECT ) VALUES (
#{seq}, #{seq},
#{sopmalCd}, #{sopmalCd},
#{evtInnb}, #{evtInnb},
]]> ]]>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(bgnCnt)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(bgnCnt)">REPLACE(#{bgnCnt}, ',', ''),
REPLACE(#{bgnCnt}, ',', ''),
</if> </if>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(endCnt)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(endCnt)">REPLACE(#{endCnt}, ',', ''),
REPLACE(#{endCnt}, ',', ''),
</if> </if>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(bgnAmt)"> <if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(bgnAmt)">
REPLACE(#{bgnAmt}, ',', ''), REPLACE(#{bgnAmt}, ',', ''),
@@ -457,8 +455,7 @@
SYSDATE(), SYSDATE(),
#{updusr}, #{updusr},
SYSDATE() SYSDATE()
FROM )
GC_EVENT_BENEFITS
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
BGN_CNT = VALUES(BGN_CNT), BGN_CNT = VALUES(BGN_CNT),
END_CNT = VALUES(END_CNT), END_CNT = VALUES(END_CNT),

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wb.domainserver.domain.gcone.setup.cost.mapper.BOCostMapper">
<!--원가 설정 목록 조회-->
<select id="selectBOCostPriceList"
parameterType="com.wb.domainserver.domain.gcone.setup.cost.vo.BOCostVO"
resultType="dataMap">
SELECT CT_INNB
, STDR_DE
, USD_RATE
, JP_DLVY_CT
, INTL_DLVY_AMT
, PLTFOM_FEE
, EXPCT_TAX
, CSTMS_FEE
, KR_DLVY_CT
FROM GC_GOODS_COST
</select>
<!-- 원가 설정 삭제 -->
<delete id="deleteBOCostPrice"
parameterType="com.wb.domainserver.domain.gcone.setup.cost.vo.BOCostVO" >
DELETE FROM
GC_GOODS_COST
WHERE 1=1
</delete>
<!-- 원가 설정 등록 -->
<insert id="insertBOCostPrice"
parameterType="DataMap" >
<selectKey order="BEFORE" keyProperty="ctInnb" resultType="integer">
SELECT IFNULL(MAX(CT_INNB), 0) + 1
FROM GC_GOODS_COST
</selectKey>
INSERT INTO GC_GOODS_COST (
CT_INNB,
STDR_DE,
USD_RATE,
JP_DLVY_CT,
INTL_DLVY_AMT,
PLTFOM_FEE,
EXPCT_TAX,
CSTMS_FEE,
KR_DLVY_CT
) VALUES (
#{ctInnb},
#{stdrDe},
#{usdRate},
#{jpDlvyCt},
#{intlDlvyAmt},
#{pltfomFee},
#{expctTax},
#{cstmsFee},
#{krDlvyCt}
)
</insert>
</mapper>

View File

@@ -42,7 +42,12 @@
<!--주문 설정 수정--> <!--주문 설정 수정-->
<update id="updateBOOrdrSetup"> <update id="updateBOOrdrSetup">
UPDATE GC_SHOP UPDATE GC_SHOP
SET MLG_PYMNT_AT = #{mlgPymntAt}, SET CASH_AT = IFNULL(#{cashAt},'N'),
MULTI_DLVY_AT = IFNULL(#{multiDlvyAt},'N'),
FDRM_DLVY_AT = IFNULL(#{fdrmDlvyAt},'N'),
GIFT_DLVY_AT = IFNULL(#{giftDlvyAt},'N'),
GIFT_DLVY_ATMC_CANCL_PD = #{giftDlvyAtmcCanclPd},
MLG_PYMNT_AT = #{mlgPymntAt},
MLG_PYMNT_DV_CD = #{mlgPymntDvCd}, MLG_PYMNT_DV_CD = #{mlgPymntDvCd},
MLG_PYMNT_RT = REPLACE(#{mlgPymntRt},',',''), MLG_PYMNT_RT = REPLACE(#{mlgPymntRt},',',''),
MLG_MXMM_PYMNT_AMT = REPLACE(#{mlgMxmmPymntAmt},',',''), MLG_MXMM_PYMNT_AMT = REPLACE(#{mlgMxmmPymntAmt},',',''),
@@ -63,11 +68,13 @@
MLG_VALID_PD_AT = 'Y', MLG_VALID_PD_AT = 'Y',
</otherwise> </otherwise>
</choose> </choose>
CASH_AT = IFNULL(#{cashAt},'N'), MLG_HOLD_USE_AMT = #{mlgHoldUseAmt},
MULTI_DLVY_AT = IFNULL(#{multiDlvyAt},'N'), MLG_SETLE_AMT_USE_AMT = #{mlgSetleAmtUseAmt},
FDRM_DLVY_AT = IFNULL(#{fdrmDlvyAt},'N'), MLG_MUMM_USE_AMT = #{mlgMummUseAmt},
GIFT_DLVY_AT = IFNULL(#{giftDlvyAt},'N'), MLG_MXMM_USE_DV = #{mlgMxmmUseDv},
GIFT_DLVY_ATMC_CANCL_PD = #{giftDlvyAtmcCanclPd} MLG_MXMM_USE_AMT = #{mlgMxmmUseAmt},
UPDUSR = #{updusr},
UPDT_DT = SYSDATE()
WHERE SOPMAL_CD = #{sopmalCd} WHERE SOPMAL_CD = #{sopmalCd}
</update> </update>

View File

@@ -3003,7 +3003,11 @@ FROM (
) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD ) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD
AND GOODS.GOODS_INNB = CPN.GOODS_INNB AND GOODS.GOODS_INNB = CPN.GOODS_INNB
WHERE 1 = 1 WHERE 1 = 1
ORDER BY GOODS.RELM_DV_CD , GOODS.S_ORDR, GOODS.I_ORDR, GOODS.EXPSR_ORDR ORDER BY GOODS.RELM_DV_CD
, GOODS.S_ORDR
, GOODS.I_ORDR
, CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, GOODS.EXPSR_ORDR
]]> ]]>
@@ -3905,7 +3909,11 @@ FROM (
) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD ) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD
AND GOODS.GOODS_INNB = CPN.GOODS_INNB AND GOODS.GOODS_INNB = CPN.GOODS_INNB
WHERE 1 = 1 WHERE 1 = 1
ORDER BY GOODS.RELM_DV_CD , GOODS.S_ORDR, GOODS.I_ORDR, GOODS.GOODS_ORDR ORDER BY GOODS.RELM_DV_CD
, GOODS.S_ORDR
, GOODS.I_ORDR
, CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END
, GOODS.GOODS_ORDR
]]> ]]>
@@ -4954,7 +4962,10 @@ FROM (
) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD ) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD
AND GOODS.GOODS_INNB = CPN.GOODS_INNB AND GOODS.GOODS_INNB = CPN.GOODS_INNB
WHERE 1 = 1 WHERE 1 = 1
ORDER BY GOODS.RELM_DV_CD , GOODS.S_ORDR, GOODS.I_ORDR ORDER BY GOODS.RELM_DV_CD
, GOODS.S_ORDR
, GOODS.I_ORDR
, CASE GOODS.GOODS_STTUS_CD WHEN '01' THEN 0 WHEN '02' THEN 1 WHEN '03' THEN 2 ELSE 3 END

View File

@@ -0,0 +1,46 @@
/* 결제취소 화면 조회 전용. 실제 취소/환불 요청은 처리하지 않는다. */
async function fn_load_refund_popup(url, data, onReady) {
const requestUrl = new URL(url, window.location.href);
Object.entries(data).forEach(([key, value]) => requestUrl.searchParams.set(key, value));
const loginRequired = function () {
window.alert('로그인 시간이 만료되었습니다. 다시 로그인해 주세요.');
const loginUrl = new URL('/sopmal/login', window.location.href);
// 로그인 후 AJAX 팝업 주소가 아닌 원래 주문 상세로 돌아온다.
loginUrl.searchParams.set('redirect_uri', window.location.href);
window.location.assign(loginUrl.href);
};
try {
// 갱신 후 리다이렉트에서도 주문 조회 조건이 유지되도록 GET으로 요청한다.
const response = await fetch(requestUrl.href, {
method: 'GET',
credentials: 'same-origin',
cache: 'no-store',
headers: {'X-Requested-With': 'XMLHttpRequest'}
});
const finalUrl = new URL(response.url || requestUrl.href, window.location.href);
if (response.status === 401 || (response.redirected &&
/^\/sopmal\/(login(?:\/|$)|logout(?:\/|$)|main(?:\/|$))/.test(finalUrl.pathname))) {
loginRequired();
return;
}
if (!response.ok || finalUrl.origin !== requestUrl.origin || finalUrl.pathname !== requestUrl.pathname) {
throw new Error('Unexpected refund popup response');
}
// 로그인 HTML이나 빈 응답은 화면에 넣지 않는다. 반환된 스크립트도 실행하지 않는다.
const html = await response.text();
const parsed = new DOMParser().parseFromString(html, 'text/html');
const popup = parsed.querySelector('#refund-pop');
if (!popup) {
throw new Error('Missing refund popup');
}
popup.querySelectorAll('script').forEach(script => script.remove());
$('#refund-pop').remove();
$('#refundPopupDiv').empty().append(popup);
onReady($(popup));
} catch (error) {
window.alert('결제취소 화면을 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.');
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -923,3 +923,10 @@ $(".comma").each(function () {
var text = $(this).text(); var text = $(this).text();
$(this).text(text.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, "$1,")); $(this).text(text.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, "$1,"));
}); });
//해당 클래스를 가진 요소 .trim()
function trimInputValue() {
$('input.input-trim').each(function () {
$(this).val($(this).val().trim());
});
}

View File

@@ -4269,6 +4269,9 @@ body {
.header--sub:has(.headerTab) ~ .content-wrap { .header--sub:has(.headerTab) ~ .content-wrap {
padding-top: 96px; padding-top: 96px;
} }
.header--sub:has(.mobile-about-menu) ~ .content-wrap {
padding-top: 96px;
}
.header--sub::before { .header--sub::before {
content: ""; content: "";
position: absolute; position: absolute;
@@ -5706,6 +5709,17 @@ body {
color: #16191d; color: #16191d;
font-weight: 400; font-weight: 400;
} }
.mainNotice__customerContact-alwaysonbottom {
position: fixed;
left: 10px;
bottom: 60px;
z-index: 10;
}
.icon_kakao-customer-service {
width: 72px;
height: 72px;
background-image: url(../images/icon_kakao_customer.png);
}
.notice__title { .notice__title {
display: inline-block; display: inline-block;

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -5560,20 +5560,36 @@ main {
} }
.quick-menu__customer-service { .quick-menu__customer-service {
position: relative; position: relative;
cursor: pointer;
} }
.quick-menu__customer-service__num { .quick-menu__customer-service__num {
position: absolute; position: absolute;
bottom: 24px; top: 80%;
left: 50%; left: 50%;
transform: translateX(-50%); width: 100%;
font-size: 24px; transform: translate(-50%, -50%);
font-size: 14px;
line-height: 1; line-height: 1;
font-weight: 700; font-weight: 700;
color: #212529; color: #212529;
text-align: center;
}
.quick-menu__customer-service-alwaysonbottom {
position: fixed;
left: 20px;
bottom: 20px;
z-index: 10;
} }
.quick-menu > * + * { .quick-menu > * + * {
margin-top: 16px; margin-top: 16px;
} }
.icon_kakao-customer-service {
width: 108px;
height: 108px;
background-image: url(../images/icon_kakao_customer.png);
/* 이미지 그림자 */
filter: drop-shadow(0px 3px 4px rgba(0, 0, 0, 0.15));
}
.recentProductSlick { .recentProductSlick {
width: 100%; width: 100%;
@@ -9579,7 +9595,6 @@ main {
.cartOrderBox__total { .cartOrderBox__total {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px;
} }
.cartOrderBox__totalTh { .cartOrderBox__totalTh {
font-size: 16px; font-size: 16px;
@@ -9603,6 +9618,7 @@ main {
} }
.cartOrderBox__buyBtn { .cartOrderBox__buyBtn {
width: 100%; width: 100%;
margin-top: 20px;
margin-bottom: 16px; margin-bottom: 16px;
} }
.cartOrderBox .product-btn-container { .cartOrderBox .product-btn-container {

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1497,6 +1497,11 @@
<span class="check"></span> <span class="check"></span>
<span class="control-label">카카오페이</span> <span class="control-label">카카오페이</span>
</label> </label>
<label class="b-checkbox checkbox">
<input type="checkbox" name="pc-setle-type" value="stripe" ${f:setChecked(fn:contains(payInfoList.stripeUseAt, 'Y'), true)} class="stripe">
<span class="check"></span>
<span class="control-label">Stripe</span>
</label>
</c:if> </c:if>
</c:forEach> </c:forEach>
</c:if> </c:if>
@@ -1573,6 +1578,11 @@
<span class="check"></span> <span class="check"></span>
<span class="control-label">카카오페이</span> <span class="control-label">카카오페이</span>
</label> </label>
<label class="b-checkbox checkbox">
<input type="checkbox" name="mobile-setle-type" value="stripe" ${f:setChecked(fn:contains(payInfoList.stripeUseAt, 'Y'), true)} class="stripe">
<span class="check"></span>
<span class="control-label">Stripe</span>
</label>
</c:if> </c:if>
</c:forEach> </c:forEach>
</c:if> </c:if>
@@ -1649,6 +1659,11 @@
<span class="check"></span> <span class="check"></span>
<span class="control-label">카카오페이</span> <span class="control-label">카카오페이</span>
</label> </label>
<label class="b-checkbox checkbox">
<input type="checkbox" name="pc-subsvc-setle-type" value="stripe" ${f:setChecked(fn:contains(payInfoList.stripeUseAt, 'Y'), true)} class="stripe">
<span class="check"></span>
<span class="control-label">Stripe</span>
</label>
</c:if> </c:if>
</c:forEach> </c:forEach>
</c:if> </c:if>
@@ -1725,6 +1740,11 @@
<span class="check"></span> <span class="check"></span>
<span class="control-label">카카오페이</span> <span class="control-label">카카오페이</span>
</label> </label>
<label class="b-checkbox checkbox">
<input type="checkbox" name="mobile-subsvc-setle-type" value="stripe" ${f:setChecked(fn:contains(payInfoList.stripeUseAt, 'Y'), true)} class="stripe">
<span class="check"></span>
<span class="control-label">Stripe</span>
</label>
</c:if> </c:if>
</c:forEach> </c:forEach>
</c:if> </c:if>

View File

@@ -1286,6 +1286,13 @@
searches.shift(); // 6개를 초과하면 가장 오래된 검색어를 제거 searches.shift(); // 6개를 초과하면 가장 오래된 검색어를 제거
} }
localStorage.setItem('recentSearches', JSON.stringify(searches)); localStorage.setItem('recentSearches', JSON.stringify(searches));
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/goods/insertSrchwrdLog"/>',
data: { srchStr : param},
success: function () {}
});
} }
} }

View File

@@ -53,6 +53,42 @@
<!-- 스크립트 --> <!-- 스크립트 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script> <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="<c:url value='/js/sopmal/common.js'/>"></script> <script src="<c:url value='/js/sopmal/common.js'/>"></script>
<script>
(function () {
var badgeMap = {};
function applyBadge(element) {
var badge = badgeMap[element.dataset.badgeCd.toLowerCase()];
if (!badge) { return; }
element.textContent = badge.cdNm || element.textContent;
if (badge.fontColor) { element.style.setProperty('color', badge.fontColor, 'important'); }
if (badge.bgColor) { element.style.setProperty('background-color', badge.bgColor, 'important'); }
if (badge.borderColor) { element.style.setProperty('border-color', badge.borderColor, 'important'); }
}
function applyBadges(root) {
if (root.nodeType === Node.ELEMENT_NODE && root.matches('.product-badge[data-badge-cd]')) {
applyBadge(root);
}
if (root.querySelectorAll) {
root.querySelectorAll('.product-badge[data-badge-cd]').forEach(applyBadge);
}
}
function initialize() {
fetch('/sopmal/goods/selectGoodsBadgeList')
.then(function (response) { return response.ok ? response.json() : []; })
.then(function (badgeList) {
badgeList.forEach(function (badge) { badgeMap[badge.cd.toLowerCase()] = badge; });
applyBadges(document);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) { mutation.addedNodes.forEach(applyBadges); });
}).observe(document.documentElement, { childList: true, subtree: true });
});
}
document.addEventListener('DOMContentLoaded', initialize);
}());
</script>
<script src="<c:url value='/pc/js/script.js'/>" defer></script> <script src="<c:url value='/pc/js/script.js'/>" defer></script>
<script src="<c:url value='/js/sopmal/gcone.js'/>"></script> <script src="<c:url value='/js/sopmal/gcone.js'/>"></script>
@@ -372,9 +408,8 @@
fn_reflesh_cart_cnt() fn_reflesh_cart_cnt()
/*비밀번호 변경 알림 여부 확인*/
$(document).ready(function () { $(document).ready(function () {
/*비밀번호 변경 알림 여부 확인*/
const url = '<c:url value="/sopmal/mbr/selectPasswordChng"/>'; const url = '<c:url value="/sopmal/mbr/selectPasswordChng"/>';
const originalUrl = window.location.href; const originalUrl = window.location.href;
let passwordAt = '<%=(String)session.getAttribute("passwordChngDeAt")%>' let passwordAt = '<%=(String)session.getAttribute("passwordChngDeAt")%>'
@@ -383,6 +418,15 @@
location.href = url + '?originalUrl=' + encodeURIComponent(originalUrl); location.href = url + '?originalUrl=' + encodeURIComponent(originalUrl);
} }
/*연령확인 여부 확인*/
let ageChked = getCookieValue("ageChk");
if(!ageChked) {
fn_open_modal(
'#ageChkPopupDiv',
'#ageChkPopup',
'/sopmal/main/selectAgeChkPopup'
);
}
}) })
@@ -398,6 +442,7 @@
}%> }%>
<input type="hidden" id="adscriptMbrId" value="${adscriptMbrId}"/> <input type="hidden" id="adscriptMbrId" value="${adscriptMbrId}"/>
<div id="mbrMarktClauseAgreeDiv"></div> <div id="mbrMarktClauseAgreeDiv"></div>
<div id="ageChkPopupDiv"></div>
<script> <script>
@@ -466,9 +511,24 @@
} }
//쿠키 값 가져오기
const getCookieValue = function(name) {
let matches = document.cookie.match(
new RegExp('(?:^|; )' + name + '=([^;]*)')
);
return matches ? matches[1] : null;
}
</script> </script>
<!--로딩영역--> <!--로딩영역-->
<div class="loadingImg" style="display:none; position: relative; z-index: 1010;"> <div class="loadingImg" style="display:none; position: relative; z-index: 1010;">
<div class="loding_popup_wrap"><img src="/mobile/images/loading.svg" alt="loading"></div> <div class="loding_popup_wrap"><img src="/mobile/images/loading.svg" alt="loading"></div>
</div> </div>
<!--고객센터 아이콘-->
<div class="quick-menu__customer-service-alwaysonbottom"
onclick="window.open('http://pf.kakao.com/_xjxjHxnX', '_blank');">
<i class="icon icon_kakao-customer-service"></i>
<span class="visually-hidden">고객센터</span>
<%-- <span class="quick-menu__customer-service__num">문의는 카톡으로 </span>--%>
</div>

View File

@@ -35,6 +35,28 @@
</div> </div>
</div> </div>
</div> </div>
<c:if test="${param.mobileAboutMenuAt eq 'Y' && not empty param.mobileParentCtgryId}">
<c:set var="mobileAboutCurrentCtgryId" value="${param.mobileCurrentCtgryId}"/>
<nav class="home-category mobile-about-menu" aria-label="하위 메뉴">
<div class="home-category__content">
<ul class="home-category__list">
<c:forEach var="topMenuList" items="${sopmallInfo.menuList}">
<c:if test="${topMenuList.ctgryDvCd eq '01' && topMenuList.rnum eq '3' && topMenuList.upperCtgryId eq param.mobileParentCtgryId && topMenuList.menuExpsrAt eq 'Y'}">
<c:if test="${empty mobileAboutCurrentCtgryId}">
<c:set var="mobileAboutCurrentCtgryId" value="${topMenuList.ctgryId}"/>
</c:if>
<li class="home-category__item<c:if test="${topMenuList.ctgryId eq mobileAboutCurrentCtgryId}"> active</c:if>">
<a href="<c:out value="${topMenuList.url}"/><c:choose><c:when test="${fn:contains(topMenuList.url, '?')}">&amp;</c:when><c:otherwise>?</c:otherwise></c:choose>mobileParentCtgryId=<c:out value="${param.mobileParentCtgryId}"/>&amp;mobileAboutMenuAt=Y&amp;mobileCurrentCtgryId=<c:out value="${topMenuList.ctgryId}"/>"
class="home-category__link">
<c:out value="${topMenuList.ctgryNm}"/>
</a>
</li>
</c:if>
</c:forEach>
</ul>
</div>
</nav>
</c:if>
</div> </div>
<script> <script>
//뒤로가기 이벤트 부여, 각 페이지 마다 이벤트 삭제 후 다른 이벤트 사용 가능 //뒤로가기 이벤트 부여, 각 페이지 마다 이벤트 삭제 후 다른 이벤트 사용 가능

View File

@@ -32,6 +32,42 @@
<!-- 스크립트 --> <!-- 스크립트 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script> <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="/mobile/js/script.js" defer=""></script> <script src="/mobile/js/script.js" defer=""></script>
<script>
(function () {
var badgeMap = {};
function applyBadge(element) {
var badge = badgeMap[element.dataset.badgeCd.toLowerCase()];
if (!badge) { return; }
element.textContent = badge.cdNm || element.textContent;
if (badge.fontColor) { element.style.setProperty('color', badge.fontColor, 'important'); }
if (badge.bgColor) { element.style.setProperty('background-color', badge.bgColor, 'important'); }
if (badge.borderColor) { element.style.setProperty('border-color', badge.borderColor, 'important'); }
}
function applyBadges(root) {
if (root.nodeType === Node.ELEMENT_NODE && root.matches('.product-badge[data-badge-cd]')) {
applyBadge(root);
}
if (root.querySelectorAll) {
root.querySelectorAll('.product-badge[data-badge-cd]').forEach(applyBadge);
}
}
function initialize() {
fetch('/sopmal/goods/selectGoodsBadgeList')
.then(function (response) { return response.ok ? response.json() : []; })
.then(function (badgeList) {
badgeList.forEach(function (badge) { badgeMap[badge.cd.toLowerCase()] = badge; });
applyBadges(document);
new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) { mutation.addedNodes.forEach(applyBadges); });
}).observe(document.documentElement, { childList: true, subtree: true });
});
}
document.addEventListener('DOMContentLoaded', initialize);
}());
</script>
<script src="<c:url value='/js/gcone.js'/>"></script> <script src="<c:url value='/js/gcone.js'/>"></script>
<script src="/mobile/js/bottom-sheet.js" defer=""></script> <script src="/mobile/js/bottom-sheet.js" defer=""></script>
@@ -90,6 +126,9 @@
<%--theme적용--%> <%--theme적용--%>
<link rel="stylesheet" type="text/css" href="<c:out value="${sopmallInfo.themaPath}"/>"> <link rel="stylesheet" type="text/css" href="<c:out value="${sopmallInfo.themaPath}"/>">
<%--font적용--%>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&family=Noto+Sans+JP&display=swap" rel="stylesheet">
<%--Web-App연동 스크립트--%> <%--Web-App연동 스크립트--%>
<script src="/mobile/js/bnft/common/Common_app.js" defer=""></script> <script src="/mobile/js/bnft/common/Common_app.js" defer=""></script>
@@ -362,6 +401,8 @@
passwordChngDeAt(); passwordChngDeAt();
ageChkAt();
fn_save_mbrdvc_info(${isAuthenticated}); fn_save_mbrdvc_info(${isAuthenticated});
}); });
@@ -470,6 +511,31 @@
} }
} }
/*연령확인 여부 확인 */
function ageChkAt() {
let ageChked = getCookieValue("ageChk");
if(!ageChked) {
openModal('confirm_ageChk_alert');
}
}
const fn_ageChk_yes = function() {
closeModal('confirm_ageChk_alert')
document.cookie = "ageChk=true; path=/; max-age=86400";
}
const fn_ageChk_no = function() {
window.location.href = "https://m.search.naver.com/search.naver?query=사케일잔";
}
//쿠키 값 가져오기
const getCookieValue = function(name) {
let matches = document.cookie.match(
new RegExp('(?:^|; )' + name + '=([^;]*)')
);
return matches ? matches[1] : null;
}
// 최근 검색어 저장 // 최근 검색어 저장
function saveSearch(param) { function saveSearch(param) {
let searches = JSON.parse(localStorage.getItem('recentSearches')) || []; let searches = JSON.parse(localStorage.getItem('recentSearches')) || [];
@@ -483,6 +549,13 @@
searches.shift(); // 6개를 초과하면 가장 오래된 검색어를 제거 searches.shift(); // 6개를 초과하면 가장 오래된 검색어를 제거
} }
localStorage.setItem('recentSearches', JSON.stringify(searches)); localStorage.setItem('recentSearches', JSON.stringify(searches));
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/goods/insertSrchwrdLog"/>',
data: { srchStr : param},
success: function () {}
});
} }
} }
@@ -755,6 +828,32 @@
</div> </div>
</div> </div>
<%--연령확인 모달--%>
<div class="microModal microAlert" id="confirm_ageChk_alert" aria-hidden="true" style="font-family: 'Noto Sans JP', 'Noto Sans KR', sans-serif;">
<div class="microModal__overlay" tabindex="-1">
<div class="microModal__container" role="dialog" aria-modal="true" style="width: 350px;">
<div class="microModal__body">
<div class="microModal__top">
<p class="alert-content__text" style="font-size: 20px;">
満20歳以上ですか?<br>
(만20세 이상입니까?)
</p>
<br>
<p class="alert-content__text--sm" style="font-size: 15px;">
20歳未満の飲酒は法律で禁止されています。<br>
(20세 미만의 음주는 법으로 금지되어 있습니다.)
</p>
<br>
</div>
</div>
<div class="microModal__btnContainer">
<button class="microModal__btn microModal__btn-primary" onclick="fn_ageChk_yes();">はい (예)</button>
<button class="microModal__btn" onclick="fn_ageChk_no()">いいえ (아니오)</button>
</div>
</div>
</div>
</div>
<%--cutom 확인 모달--%> <%--cutom 확인 모달--%>
<div class="microModal microAlert" id="custom_confirm_alert" aria-hidden="true" style="position: relative; z-index: 1010;"> <div class="microModal microAlert" id="custom_confirm_alert" aria-hidden="true" style="position: relative; z-index: 1010;">
<div class="microModal__overlay" tabindex="-1"> <div class="microModal__overlay" tabindex="-1">
@@ -870,6 +969,259 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 햄버거 메뉴 모달 -->
<div class="microModal microFullMenu" id="hamburger-menu" aria-hidden="true">
<div class="microModal__overlay" tabindex="-1">
<div class="microModal__container" role="dialog" aria-modal="true">
<div class="microModal__body" id = "hambergerModal">
<div class="microModal__top">
<h2 class="microModal__title">
전체메뉴
</h2>
<button type="button" class="microModal__close" onclick="closeModal('hamburger-menu');"></button>
</div>
<div class="microModal__content">
<div class="fullMenu">
<c:if test="${not isAuthenticated}">
<div class="sub-box">
<div class="fullMenu__top">
<button type="button" class="btn md outline" onclick="fn_move_login();">로그인</button>
<button type="button" class="btn md theme" onclick="location.href='/sopmal/mbr/selectJoinGuidance'; setTopMenuCode(); ">회원가입</button>
</div>
</div>
</c:if>
<div class="sub-box">
<div class="fullMenu__top">
<div class="member-rank-summary">
<div class="textBtns">
<a href="/index" class="textBtns__btn">홈으로</a>
<a href="/sopmal/ordr/selectSpbk" class="textBtns__btn">장바구니</a>
<c:choose>
<c:when test="${isAuthenticated}"><%--회원일시--%>
<a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="textBtns__btn">마이페이지</a>
<a href="/sopmal/logout" class="textBtns__btn">로그아웃</a>
</c:when>
<c:otherwise><%--비회원일시--%>
<a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="textBtns__btn">주문조회</a>
</c:otherwise>
</c:choose>
</div>
<c:if test = "${isAuthenticated}">
<div class="member-rank-summary__top">
<div class="member-rank-summary__icon" id = "hambergerGradImg"></div>
<a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="member-rank-summary__user">
<span class="member-rank-summary__rank" id = "hambergerGradNm"></span>
<span class="member-rank-summary__name" id = "hambergermbrNm"></span>
</a>
<a class="member-rank-summary__benefit-link" href="/sopmal/mpage/bnef/selectMbrGradInqire">등급별 혜택</a>
</div>
<div class="member-rank-summary__bottom">
<div class="member-rank-summary__summary">
<a href="/sopmal/mpage/bnef/selectMlgDtlsInqireForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-mileage.png"
alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">마일리지</span>
<p class="member-rank-summary__summary-numberContainer">
<span
class="member-rank-summary__summary-number comma"
id = "hambergerMbrMlgAmt"></span>
<span
class="member-rank-summary__summary-numberUnit">원</span>
</p>
</div>
</a>
<a href="/sopmal/mpage/bnef/selectCouponDtlsForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-coupon.png" alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">쿠폰</span>
<p class="member-rank-summary__summary-numberContainer">
<span class="member-rank-summary__summary-number comma" id = "hambergerCoupnCnt"></span>
<span
class="member-rank-summary__summary-numberUnit">장</span>
</p>
</div>
</a>
<a href="/sopmal/mpage/ordr/selectWslistInqireForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-wishlist.png" alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">위시리스트</span>
<p class="member-rank-summary__summary-numberContainer">
<span class="member-rank-summary__summary-number comma"
id = "hambergerWslistCnt"></span>
<span
class="member-rank-summary__summary-numberUnit">개</span>
</p>
</div>
</a>
</div>
</div>
</c:if>
</div>
</div>
</div>
<div class="sub-box">
<div class="menu_navigation_wrap">
<!-- 카테고리 -->
<ul class="side_menu accordion">
<c:if test="${!empty sopmallInfo}">
<c:forEach var="topMenuList" items="${sopmallInfo.menuList}" varStatus="status">
<c:if test="${topMenuList.ctgryDvCd eq '01'}">
<c:if test="${topMenuList.gnbExpsrAt eq 'Y'}">
<c:if test="${topMenuList.rnum eq '2'}">
<c:set var="mDpth3Chk" value="N"/>
<c:set var="mobileAboutParentAt" value="${topMenuList.ctgryNm eq 'ABOUT'}"/>
<li class="isSub list">
<div class="isSubDv">
<a href="<c:out value="${topMenuList.url}"/><c:choose><c:when test="${fn:contains(topMenuList.url, '?')}">&amp;</c:when><c:otherwise>?</c:otherwise></c:choose>mobileParentCtgryId=<c:out value="${topMenuList.ctgryId}"/><c:if test="${topMenuList.ctgryNm eq 'ABOUT'}">&amp;mobileAboutMenuAt=Y</c:if>" class="depth"><c:out value ="${topMenuList.ctgryNm}"/><em class="visually-hidden">상세내용닫기</em></a>
<a href="<c:out value="${topMenuList.url}"/><c:choose><c:when test="${fn:contains(topMenuList.url, '?')}">&amp;</c:when><c:otherwise>?</c:otherwise></c:choose>mobileParentCtgryId=<c:out value="${topMenuList.ctgryId}"/><c:if test="${topMenuList.ctgryNm eq 'ABOUT'}">&amp;mobileAboutMenuAt=Y</c:if>" class="moer"></a>
</div>
</c:if>
<c:if test="${topMenuList.rnum eq '3'}">
<!-- 메뉴 하위가 메뉴인 경우-->
<c:if test="${chkUpperMenuCd ne topMenuList.upperCtgryId}">
<c:set var="mDpth3Chk" value="Y"/>
<ul class="view">
</c:if>
<li><a href="<c:out value="${topMenuList.url}"/><c:choose><c:when test="${fn:contains(topMenuList.url, '?')}">&amp;</c:when><c:otherwise>?</c:otherwise></c:choose>mobileParentCtgryId=<c:out value="${topMenuList.upperCtgryId}"/>&amp;mobileCurrentCtgryId=<c:out value="${topMenuList.ctgryId}"/><c:if test="${mobileAboutParentAt}">&amp;mobileAboutMenuAt=Y</c:if>"><c:out value ="${topMenuList.ctgryNm}"/></a></li>
</c:if>
<c:if test="${topMenuList.rnum < 4}">
<c:set var="chkUpperMenuCd" value="${topMenuList.upperCtgryId}"/>
</c:if>
</c:if>
<c:if test="${topMenuList.nextDepth3 eq '0' && topMenuList.nextDepth2 eq '0'}">
<c:if test="${topMenuList.rnum eq '2'}">
</li>
</c:if>
<c:if test="${topMenuList.rnum eq '3'}">
<c:if test="${mDpth3Chk eq 'Y'}">
</ul>
</c:if>
</li>
</c:if>
</c:if>
</c:if>
</c:forEach>
</c:if>
</ul>
<!-- 최근 본 상품(SIDE) -->
<div class="recently_side" id = "recentlySite">
<%--<div class="swiper recentlySide-swiper">
<div class="swiper-wrapper" id="recentlySite">
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
</div>
<div class="swiper-pagination theme-pagination"></div>
</div>--%>
</div>
</div>
</div>
<div class="sub-box">
<div class="fullMenu__miscLinks">
<h5 class="fullMenu__miscLinks__title">서비스</h5>
<ul class="fullMenu__miscLinks__list">
<li>
<a href="/sopmal/csc/selectCscMainForm" class="fullMenu__miscLinks__link">고객센터</a>
</li>
<c:if test="${sopmallInfo.shopInfo.sopmalCd eq 'NC' && sopmallInfo.shopInfo.sopmalCd eq 'CH'}"><%--뉴트리코어,참다한만--%>
<li><a href="/sopmal/main/selectStrListForm" class="fullMenu__miscLinks__link">매장안내</a></li>
</c:if>
</ul>
</div>
</div>
<c:if test = "${sopmallInfo.shopInfo.cscTelnbOrdrPosblAt eq 'Y'}">
<div class="sub-box">
<div class="mainNotice__customerContact mainNotice__customerContact--moreInfo">
<i class="icon icon_notice03"></i>
<div class="mainNotice__customerContact__right">
<h4 class="notice__title customer-service">고객센터</h4>
<span class="notice__number"><c:out value="${sopmallInfo.shopInfo.cscTelnb}"/></span>
<p class="notice__paragraph">
<span class="notice__text01"><c:out value="${sopmallInfo.shopInfo.cscWkdayWorkTme}"/></span>
<span class="notice__text02">(<c:out value="${sopmallInfo.shopInfo.cscLunchTme}"/>)</span>
<br>
<span class="notice__text03"><c:out value="${sopmallInfo.shopInfo.cscRstde}"/></span>
</p>
</div>
</div>
</div>
</c:if>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
////햄버거 메뉴 관련 스크립트
// 좌측 메뉴 클릭시 해당 메뉴 보여주기
$('.fullMenu__menu__btn').on('click', function () {
$(this).addClass('current');
$(this).closest('li').siblings().find('.fullMenu__menu__btn').removeClass('current');
var index = $(this).closest('li').index() - 1; // 전체 메뉴 버튼을 뺀 나머지 버튼의 인덱스
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').eq(index).siblings().hide();
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').eq(index).show();
});
// 전체 메뉴 클릭시 전체 메뉴 보여주기
$('.fullMenuAll').on('click', function () {
$(this).addClass('current');
$(this).closest('li').siblings().find('.fullMenu__menu__btn').removeClass('current');
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').show();
});
//
$('.hamburgerTabBtn').on('click', function () {
$('.hamburgerTabBtn').removeClass('active');
$(this).addClass('active');
var index = $(this).closest('li').index();
$('.fullMenu__content').removeClass('active');
$('.fullMenu__content').eq(index).addClass('active');
});
$(document).ready(function(){
MicroModal.init({
disableScroll: true,
awaitCloseAnimation: true,
});
$(".menu_navigation_wrap .depth").on('click', function () {
/*하위레벨 없을 시 페이지 이동*/
if ($(this).closest(".isSub").find(".view").length === 0) {
const href = $(this).attr("href");
location.href = href;
}
});
});
</script>
<%--광고스크립트 정보--%> <%--광고스크립트 정보--%>
<input type="hidden" id="adScriptDeviceTy" value="${deviceType}"/> <input type="hidden" id="adScriptDeviceTy" value="${deviceType}"/>
<% String adscriptMbrId = ""; <% String adscriptMbrId = "";
@@ -882,6 +1234,12 @@
<div id="mbrMarktClauseAgreeDiv"></div> <div id="mbrMarktClauseAgreeDiv"></div>
<%--고객센터 아이콘--%>
<div class="mainNotice__customerContact-alwaysonbottom" style="display: none;"
onclick="window.open('http://pf.kakao.com/_xjxjHxnX', '_blank');">
<i class="icon icon_kakao-customer-service"></i>
</div>
<script> <script>
/*최초 로그인시 마케팅 수신동의를 받지 않았을 경우 마케팅 수신동의 팝업 띄우기*/ /*최초 로그인시 마케팅 수신동의를 받지 않았을 경우 마케팅 수신동의 팝업 띄우기*/
@@ -920,6 +1278,16 @@ $(document).ready(function() {
if(locationUrl.includes("selectMbrPurchsForm")){ if(locationUrl.includes("selectMbrPurchsForm")){
document.cookie = 'marktAgreeAt=P; path=/' document.cookie = 'marktAgreeAt=P; path=/'
} }
$(document).ready(function() {
var $notice = $('.mainNotice__customerContact-alwaysonbottom');
if ($('.tab-bar').length) {
$notice.fadeIn(500);
} else if ($('.productDetail').length) {
$notice.css('bottom', '70px').fadeIn(500);
}
});
}) })
//광고 수신동의여부 수정 //광고 수신동의여부 수정

View File

@@ -66,7 +66,7 @@
<c:if test="${topMenuList.ctgryDvCd eq '01' && topMenuList.menuExpsrAt eq 'Y'}"> <c:if test="${topMenuList.ctgryDvCd eq '01' && topMenuList.menuExpsrAt eq 'Y'}">
<c:if test="${topMenuList.rnum eq '2'}"> <c:if test="${topMenuList.rnum eq '2'}">
<li class="home-category__item"> <li class="home-category__item">
<a href="<c:out value="${topMenuList.url}"/>" onclick="setTopMenuCode()" <c:if test="${not empty topMenuList.menuChrColor}"> style="color:${topMenuList.menuChrColor};"</c:if>><c:out value ="${topMenuList.ctgryNm}"/></a> <a href="<c:out value="${topMenuList.url}"/><c:choose><c:when test="${fn:contains(topMenuList.url, '?')}">&amp;</c:when><c:otherwise>?</c:otherwise></c:choose>mobileParentCtgryId=<c:out value="${topMenuList.ctgryId}"/><c:if test="${topMenuList.ctgryNm eq 'ABOUT'}">&amp;mobileAboutMenuAt=Y</c:if>" onclick="setTopMenuCode()" <c:if test="${not empty topMenuList.menuChrColor}"> style="color:${topMenuList.menuChrColor};"</c:if>><c:out value ="${topMenuList.ctgryNm}"/></a>
</li> </li>
</c:if> </c:if>
</c:if> </c:if>

View File

@@ -32,255 +32,3 @@
<div class="tab-bar__bg-fraction"></div> <div class="tab-bar__bg-fraction"></div>
</div> </div>
</aside> </aside>
<!-- 햄버거 메뉴 모달 -->
<div class="microModal microFullMenu" id="hamburger-menu" aria-hidden="true">
<div class="microModal__overlay" tabindex="-1">
<div class="microModal__container" role="dialog" aria-modal="true">
<div class="microModal__body" id = "hambergerModal">
<div class="microModal__top">
<h2 class="microModal__title">
전체메뉴
</h2>
<button type="button" class="microModal__close" onclick="closeModal('hamburger-menu');"></button>
</div>
<div class="microModal__content">
<div class="fullMenu">
<c:if test="${not isAuthenticated}">
<div class="sub-box">
<div class="fullMenu__top">
<button type="button" class="btn md outline" onclick="fn_move_login();">로그인</button>
<button type="button" class="btn md theme" onclick="location.href='/sopmal/mbr/selectJoinGuidance'; setTopMenuCode(); ">회원가입</button>
</div>
</div>
</c:if>
<div class="sub-box">
<div class="fullMenu__top">
<div class="member-rank-summary">
<div class="textBtns">
<a href="/index" class="textBtns__btn">홈으로</a>
<a href="/sopmal/ordr/selectSpbk" class="textBtns__btn">장바구니</a>
<c:choose>
<c:when test="${isAuthenticated}"><%--회원일시--%>
<a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="textBtns__btn">마이페이지</a>
<a href="/sopmal/logout" class="textBtns__btn">로그아웃</a>
</c:when>
<c:otherwise><%--비회원일시--%>
<a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="textBtns__btn">주문조회</a>
</c:otherwise>
</c:choose>
</div>
<c:if test = "${isAuthenticated}">
<div class="member-rank-summary__top">
<div class="member-rank-summary__icon" id = "hambergerGradImg"></div>
<a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="member-rank-summary__user">
<span class="member-rank-summary__rank" id = "hambergerGradNm"></span>
<span class="member-rank-summary__name" id = "hambergermbrNm"></span>
</a>
<a class="member-rank-summary__benefit-link" href="/sopmal/mpage/bnef/selectMbrGradInqire">등급별 혜택</a>
</div>
<div class="member-rank-summary__bottom">
<div class="member-rank-summary__summary">
<a href="/sopmal/mpage/bnef/selectMlgDtlsInqireForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-mileage.png"
alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">마일리지</span>
<p class="member-rank-summary__summary-numberContainer">
<span
class="member-rank-summary__summary-number comma"
id = "hambergerMbrMlgAmt"></span>
<span
class="member-rank-summary__summary-numberUnit">원</span>
</p>
</div>
</a>
<a href="/sopmal/mpage/bnef/selectCouponDtlsForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-coupon.png" alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">쿠폰</span>
<p class="member-rank-summary__summary-numberContainer">
<span class="member-rank-summary__summary-number comma" id = "hambergerCoupnCnt"></span>
<span
class="member-rank-summary__summary-numberUnit">장</span>
</p>
</div>
</a>
<a href="/sopmal/mpage/ordr/selectWslistInqireForm" class="member-rank-summary__summary-item">
<img src="/mobile/images/icon_member-rank-wishlist.png" alt="">
<div class="member-rank-summary__summary-description">
<span class="member-rank-summary__summary-name">위시리스트</span>
<p class="member-rank-summary__summary-numberContainer">
<span class="member-rank-summary__summary-number comma"
id = "hambergerWslistCnt"></span>
<span
class="member-rank-summary__summary-numberUnit">개</span>
</p>
</div>
</a>
</div>
</div>
</c:if>
</div>
</div>
</div>
<div class="sub-box">
<div class="menu_navigation_wrap">
<!-- 카테고리 -->
<ul class="side_menu accordion">
<c:if test="${!empty sopmallInfo}">
<c:forEach var="topMenuList" items="${sopmallInfo.menuList}" varStatus="status">
<c:if test="${topMenuList.ctgryDvCd eq '01'}">
<c:if test="${topMenuList.gnbExpsrAt eq 'Y'}">
<c:if test="${topMenuList.rnum eq '2'}">
<c:set var="mDpth3Chk" value="N"/>
<li class="isSub list">
<div class="isSubDv">
<a href="<c:out value="${topMenuList.url}"/>" class="depth"><c:out value ="${topMenuList.ctgryNm}"/><em class="visually-hidden">상세내용닫기</em></a>
<a href="<c:out value="${topMenuList.url}"/>" class="moer"></a>
</div>
</c:if>
<c:if test="${topMenuList.rnum eq '3'}">
<!-- 메뉴 하위가 메뉴인 경우-->
<c:if test="${chkUpperMenuCd ne topMenuList.upperCtgryId}">
<c:set var="mDpth3Chk" value="Y"/>
<ul class="view">
</c:if>
<li><a href='<c:out value="${topMenuList.url}"/>'><c:out value ="${topMenuList.ctgryNm}"/></a></li>
</c:if>
<c:if test="${topMenuList.rnum < 4}">
<c:set var="chkUpperMenuCd" value="${topMenuList.upperCtgryId}"/>
</c:if>
</c:if>
<c:if test="${topMenuList.nextDepth3 eq '0' && topMenuList.nextDepth2 eq '0'}">
<c:if test="${topMenuList.rnum eq '2'}">
</li>
</c:if>
<c:if test="${topMenuList.rnum eq '3'}">
<c:if test="${mDpth3Chk eq 'Y'}">
</ul>
</c:if>
</li>
</c:if>
</c:if>
</c:if>
</c:forEach>
</c:if>
</ul>
<!-- 최근 본 상품(SIDE) -->
<div class="recently_side" id = "recentlySite">
<%--<div class="swiper recentlySide-swiper">
<div class="swiper-wrapper" id="recentlySite">
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
<div class="swiper-slide recentlySide__image">
<a href="">
<img src="/mobile/images/상품이미지01.png" alt="해당 이미지에 대한 설명">
</a>
</div>
</div>
<div class="swiper-pagination theme-pagination"></div>
</div>--%>
</div>
</div>
</div>
<div class="sub-box">
<div class="fullMenu__miscLinks">
<h5 class="fullMenu__miscLinks__title">서비스</h5>
<ul class="fullMenu__miscLinks__list">
<li>
<a href="/sopmal/csc/selectCscMainForm" class="fullMenu__miscLinks__link">고객센터</a>
</li>
<c:if test="${sopmallInfo.shopInfo.sopmalCd eq 'NC' && sopmallInfo.shopInfo.sopmalCd eq 'CH'}"><%--뉴트리코어,참다한만--%>
<li><a href="/sopmal/main/selectStrListForm" class="fullMenu__miscLinks__link">매장안내</a></li>
</c:if>
</ul>
</div>
</div>
<c:if test = "${sopmallInfo.shopInfo.cscTelnbOrdrPosblAt eq 'Y'}">
<div class="sub-box">
<div class="mainNotice__customerContact mainNotice__customerContact--moreInfo">
<i class="icon icon_notice03"></i>
<div class="mainNotice__customerContact__right">
<h4 class="notice__title customer-service">고객센터</h4>
<span class="notice__number"><c:out value="${sopmallInfo.shopInfo.cscTelnb}"/></span>
<p class="notice__paragraph">
<span class="notice__text01"><c:out value="${sopmallInfo.shopInfo.cscWkdayWorkTme}"/></span>
<span class="notice__text02">(<c:out value="${sopmallInfo.shopInfo.cscLunchTme}"/>)</span>
<br>
<span class="notice__text03"><c:out value="${sopmallInfo.shopInfo.cscRstde}"/></span>
</p>
</div>
</div>
</div>
</c:if>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
////햄버거 메뉴 관련 스크립트
// 좌측 메뉴 클릭시 해당 메뉴 보여주기
$('.fullMenu__menu__btn').on('click', function () {
$(this).addClass('current');
$(this).closest('li').siblings().find('.fullMenu__menu__btn').removeClass('current');
var index = $(this).closest('li').index() - 1; // 전체 메뉴 버튼을 뺀 나머지 버튼의 인덱스
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').eq(index).siblings().hide();
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').eq(index).show();
});
// 전체 메뉴 클릭시 전체 메뉴 보여주기
$('.fullMenuAll').on('click', function () {
$(this).addClass('current');
$(this).closest('li').siblings().find('.fullMenu__menu__btn').removeClass('current');
$(this).closest('.fullMenu__content').find('.fullMenu__itemSection').show();
});
//
$('.hamburgerTabBtn').on('click', function () {
$('.hamburgerTabBtn').removeClass('active');
$(this).addClass('active');
var index = $(this).closest('li').index();
$('.fullMenu__content').removeClass('active');
$('.fullMenu__content').eq(index).addClass('active');
});
$(document).ready(function(){
MicroModal.init({
disableScroll: true,
awaitCloseAnimation: true,
});
$(".menu_navigation_wrap .depth").on('click', function () {
/*하위레벨 없을 시 페이지 이동*/
if ($(this).closest(".isSub").find(".view").length === 0) {
const href = $(this).attr("href");
location.href = href;
}
});
});
</script>

View File

@@ -6,7 +6,7 @@
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%> <%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%> <%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/> <spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/> <spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko"> <html lang="ko">
<head> <head>
@@ -81,7 +81,7 @@
<c:choose> <c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}"> <c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case02.goodsSttusCd eq '03'}"> <c:when test="${case02.goodsSttusCd eq '03'}">
@@ -104,10 +104,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -122,10 +122,10 @@
<c:if test="${case02.pricExpsrAt eq 'Y'}"> <c:if test="${case02.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case02.pricExpsrOrdr-1}" style="order:${case02.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case02.pricExpsrOrdr-1}" style="order:${case02.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case02.cnsmrpric}" pattern="#,###"/>${curUnit} </span> <span class="product-unit-price__original <c:if test="${case02.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case02.cnsmrpric}" pattern="#,###"/>${curUnit} </span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case02.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case02.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case02.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent"><c:out value="${case02.slePercent}"/>%</span> <span class="percent"><c:out value="${case02.slePercent}"/>%</span>
</div> </div>
</div> </div>
@@ -167,6 +167,7 @@
<c:if test="${ relmList.relmDvCd eq '03'}"> <c:if test="${ relmList.relmDvCd eq '03'}">
<div class="main-section__container section-3"> <div class="main-section__container section-3">
<input type="hidden" name="section-ordr" value="${ relmList.ordr }" /> <input type="hidden" name="section-ordr" value="${ relmList.ordr }" />
<input type="hidden" name="section-mainSiteInnb" value="${ prevewVO.mainSiteInnb }"/>
<section class="main-section"> <section class="main-section">
<div class="main-section-header" style="margin-bottom: 48px;"> <div class="main-section-header" style="margin-bottom: 48px;">
<div class="main-section-title"> <div class="main-section-title">
@@ -180,7 +181,7 @@
<c:forEach items="${ resultMap.baseCase }" var="baseCase" varStatus="status"> <c:forEach items="${ resultMap.baseCase }" var="baseCase" varStatus="status">
<c:if test="${ baseCase.relmDvCd == '03' && relmList.ordr eq baseCase.sOrdr }"> <c:if test="${ baseCase.relmDvCd == '03' && relmList.ordr eq baseCase.sOrdr }">
<li> <li>
<button class="category-type-tab__btn category-type-tab__btn-${ relmList.ordr }" id="category-type-tab__btn-${ relmList.ordr }-${ baseCase.iOrdr }" onclick="fn_product_category_type('${ relmList.ordr }', '${ baseCase.iOrdr }'); return false;"> <button class="category-type-tab__btn category-type-tab__btn-${ relmList.ordr }" id="category-type-tab__btn-${ relmList.ordr }-${ baseCase.iOrdr }" onclick="fn_product_category_type('${ relmList.ordr }', '${ baseCase.iOrdr }', '${ prevewVO.mainSiteInnb }'); return false;">
<c:if test = "${not empty baseCase.filCours}"> <c:if test = "${not empty baseCase.filCours}">
<i class="icon icon_category-type-tab01" > <i class="icon icon_category-type-tab01" >
<img src="${cdnurl}${ baseCase.filCours }/${ baseCase.sysFilNm }" onerror="this.src='/pc/images/image_placeholder.png'"> <img src="${cdnurl}${ baseCase.filCours }/${ baseCase.sysFilNm }" onerror="this.src='/pc/images/image_placeholder.png'">
@@ -259,7 +260,7 @@
<c:choose> <c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}"> <c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case04.goodsSttusCd eq '03'}"> <c:when test="${case04.goodsSttusCd eq '03'}">
@@ -281,10 +282,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -299,10 +300,10 @@
<c:if test="${case04.pricExpsrAt eq 'Y'}"> <c:if test="${case04.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case04.pricExpsrOrdr-1}" style="order:${case04.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case04.pricExpsrOrdr-1}" style="order:${case04.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case04.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case04.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case04.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case04.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case04.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case04.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case04.slePercent }%</span> <span class="percent">${ case04.slePercent }%</span>
</div> </div>
</div> </div>
@@ -390,7 +391,7 @@
<c:choose> <c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}"> <c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case05.goodsSttusCd eq '03'}"> <c:when test="${case05.goodsSttusCd eq '03'}">
@@ -413,10 +414,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -431,10 +432,10 @@
<c:if test="${case05.pricExpsrAt eq 'Y'}"> <c:if test="${case05.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case05.pricExpsrOrdr-1}" style="order:${case05.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case05.pricExpsrOrdr-1}" style="order:${case05.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case05.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case05.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case05.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case05.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case05.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case05.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case05.slePercent }%</span> <span class="percent">${ case05.slePercent }%</span>
</div> </div>
</div> </div>
@@ -498,7 +499,7 @@
<c:choose> <c:choose>
<c:when test="${case06.goodsSttusCd eq '02'}"> <c:when test="${case06.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case06.goodsSttusCd eq '03'}"> <c:when test="${case06.goodsSttusCd eq '03'}">
@@ -520,10 +521,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -538,10 +539,10 @@
<c:if test="${case06.pricExpsrAt eq 'Y'}"> <c:if test="${case06.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case06.slePercent }%</span> <span class="percent">${ case06.slePercent }%</span>
</div> </div>
</div> </div>
@@ -613,10 +614,10 @@
<c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -631,10 +632,10 @@
<c:if test="${case06.pricExpsrAt eq 'Y'}"> <c:if test="${case06.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case06.slePercent }%</span> <span class="percent">${ case06.slePercent }%</span>
</div> </div>
</div> </div>
@@ -704,7 +705,7 @@
<c:choose> <c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}"> <c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case07.goodsSttusCd eq '03'}"> <c:when test="${case07.goodsSttusCd eq '03'}">
@@ -726,10 +727,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -744,10 +745,10 @@
<c:if test="${case07.pricExpsrAt eq 'Y'}"> <c:if test="${case07.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case07.pricExpsrOrdr-1}" style="order:${case07.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case07.pricExpsrOrdr-1}" style="order:${case07.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case07.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case07.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case07.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case07.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case07.slePercent }%</span> <span class="percent">${ case07.slePercent }%</span>
</div> </div>
</div> </div>
@@ -828,7 +829,7 @@
<c:choose> <c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}"> <c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case08.goodsSttusCd eq '03'}"> <c:when test="${case08.goodsSttusCd eq '03'}">
@@ -862,10 +863,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -880,10 +881,10 @@
<c:if test="${case08.pricExpsrAt eq 'Y'}"> <c:if test="${case08.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case08.pricExpsrOrdr-1}" style="order:${case08.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case08.pricExpsrOrdr-1}" style="order:${case08.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case08.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case08.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case08.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case08.slepric }" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case08.slepric }" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case08.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case08.slePercent }%</span> <span class="percent">${ case08.slePercent }%</span>
</div> </div>
</div> </div>
@@ -985,7 +986,7 @@
<span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span> <span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span>
</div> </div>
<div class="product-unit-price"> <div class="product-unit-price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case09.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case09.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case09.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case09.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case09.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
</div> </div>
@@ -1026,7 +1027,7 @@
<c:forEach items="${ resultMap.case10 }" var="case10" varStatus="status"> <c:forEach items="${ resultMap.case10 }" var="case10" varStatus="status">
<c:if test="${ relmList.ordr eq case10.sOrdr }"> <c:if test="${ relmList.ordr eq case10.sOrdr }">
<div> <div>
<a href="/sopmal/csc/selectBbscttAuth?bbsId=${ case10.bbsId }&bbscttInnb=${ case10.bbscttInnb }"> <a href="/sopmal/csc/selectBbscttAuth?authDv=REDNG&reqUrl=detail&bbsId=${ case10.bbsId }&bbscttInnb=${ case10.bbscttInnb }">
<img src="${cdnurl}${ case10.reprsntImgSysFilNm }" alt="해당 이미지에 대한 설명" onerror="this.src='/pc/images/image_placeholder.png'"> <img src="${cdnurl}${ case10.reprsntImgSysFilNm }" alt="해당 이미지에 대한 설명" onerror="this.src='/pc/images/image_placeholder.png'">
</a> </a>
</div> </div>
@@ -1271,13 +1272,14 @@
</div> </div>
</c:if> </c:if>
</div> </div>
<%-- <div class="quick-menu__customer-service">--%> <%--<div class="quick-menu__customer-service"
<%-- <i class="icon icon_quick-customer-service"></i>--%> onclick="window.open('http://pf.kakao.com/_xjxjHxnX', '_blank');">
<%-- <span class="visually-hidden">고객센터</span>--%> <i class="icon icon_kakao-customer-service"></i>
<%-- <span class="quick-menu__customer-service__num">--%> <span class="visually-hidden">고객센터</span>
<%-- ${ fn:replace(resultMap.operAt.cscTelnb, '-', '<br>') }--%> <span class="quick-menu__customer-service__num">
<%-- </span>--%> 문의는 카톡으로
<%-- </div>--%> </span>
</div>--%>
<div class="quick-menu__to-top"> <div class="quick-menu__to-top">
<button><i class="icon icon_quick-to-top"></i><span class="visually-hidden">위로 <button><i class="icon icon_quick-to-top"></i><span class="visually-hidden">위로
가기</span></button> 가기</span></button>
@@ -1508,7 +1510,7 @@
<c:choose> <c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}"> <c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case02.goodsSttusCd eq '03'}"> <c:when test="${case02.goodsSttusCd eq '03'}">
@@ -1531,10 +1533,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -1549,10 +1551,10 @@
<c:if test="${case02.pricExpsrAt eq 'Y'}"> <c:if test="${case02.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case02.pricExpsrOrdr-1}" style="order:${case02.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case02.pricExpsrOrdr-1}" style="order:${case02.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case02.cnsmrpric}" pattern="#,###"/>${curUnit} </span> <span class="product-unit-price__original <c:if test="${case02.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case02.cnsmrpric}" pattern="#,###"/>${curUnit} </span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case02.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case02.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case02.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent"><c:out value="${case02.slePercent}"/>%</span> <span class="percent"><c:out value="${case02.slePercent}"/>%</span>
</div> </div>
</div> </div>
@@ -1594,6 +1596,7 @@
<c:if test="${ relmList.relmDvCd eq '03'}"> <c:if test="${ relmList.relmDvCd eq '03'}">
<div class="main-section__container section-3"> <div class="main-section__container section-3">
<input type="hidden" name="section-ordr" value="${ relmList.ordr }" /> <input type="hidden" name="section-ordr" value="${ relmList.ordr }" />
<input type="hidden" name="section-mainSiteInnb" value="${ prevewVO.mainSiteInnb }"/>
<section class="main-section"> <section class="main-section">
<div class="main-section-header" style="margin-bottom: 48px;"> <div class="main-section-header" style="margin-bottom: 48px;">
<div class="main-section-title"> <div class="main-section-title">
@@ -1607,7 +1610,7 @@
<c:forEach items="${ resultMap.baseCase }" var="baseCase" varStatus="status"> <c:forEach items="${ resultMap.baseCase }" var="baseCase" varStatus="status">
<c:if test="${ baseCase.relmDvCd == '03' && relmList.ordr eq baseCase.sOrdr }"> <c:if test="${ baseCase.relmDvCd == '03' && relmList.ordr eq baseCase.sOrdr }">
<li> <li>
<button class="category-type-tab__btn category-type-tab__btn-${ relmList.ordr }" id="category-type-tab__btn-${ relmList.ordr }-${ baseCase.iOrdr }" onclick="fn_product_category_type('${ relmList.ordr }', '${ baseCase.iOrdr }'); return false;"> <button class="category-type-tab__btn category-type-tab__btn-${ relmList.ordr }" id="category-type-tab__btn-${ relmList.ordr }-${ baseCase.iOrdr }" onclick="fn_product_category_type('${ relmList.ordr }', '${ baseCase.iOrdr }', '${ prevewVO.mainSiteInnb }'); return false;">
<c:if test = "${not empty baseCase.filCours}"> <c:if test = "${not empty baseCase.filCours}">
<i class="icon icon_category-type-tab01" > <i class="icon icon_category-type-tab01" >
<img src="${cdnurl}${ baseCase.filCours }/${ baseCase.sysFilNm }" onerror="this.src='/pc/images/image_placeholder.png'"> <img src="${cdnurl}${ baseCase.filCours }/${ baseCase.sysFilNm }" onerror="this.src='/pc/images/image_placeholder.png'">
@@ -1686,7 +1689,7 @@
<c:choose> <c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}"> <c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case04.goodsSttusCd eq '03'}"> <c:when test="${case04.goodsSttusCd eq '03'}">
@@ -1708,10 +1711,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -1726,10 +1729,10 @@
<c:if test="${case04.pricExpsrAt eq 'Y'}"> <c:if test="${case04.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case04.pricExpsrOrdr-1}" style="order:${case04.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case04.pricExpsrOrdr-1}" style="order:${case04.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case04.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case04.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case04.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case04.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case04.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case04.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case04.slePercent }%</span> <span class="percent">${ case04.slePercent }%</span>
</div> </div>
</div> </div>
@@ -1817,7 +1820,7 @@
<c:choose> <c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}"> <c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case05.goodsSttusCd eq '03'}"> <c:when test="${case05.goodsSttusCd eq '03'}">
@@ -1840,10 +1843,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -1858,10 +1861,10 @@
<c:if test="${case05.pricExpsrAt eq 'Y'}"> <c:if test="${case05.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case05.pricExpsrOrdr-1}" style="order:${case05.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case05.pricExpsrOrdr-1}" style="order:${case05.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case05.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case05.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case05.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case05.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case05.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case05.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case05.slePercent }%</span> <span class="percent">${ case05.slePercent }%</span>
</div> </div>
</div> </div>
@@ -1925,7 +1928,7 @@
<c:choose> <c:choose>
<c:when test="${case06.goodsSttusCd eq '02'}"> <c:when test="${case06.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case06.goodsSttusCd eq '03'}"> <c:when test="${case06.goodsSttusCd eq '03'}">
@@ -1947,10 +1950,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -1965,10 +1968,10 @@
<c:if test="${case06.pricExpsrAt eq 'Y'}"> <c:if test="${case06.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case06.slePercent }%</span> <span class="percent">${ case06.slePercent }%</span>
</div> </div>
</div> </div>
@@ -2040,10 +2043,10 @@
<c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -2058,10 +2061,10 @@
<c:if test="${case06.pricExpsrAt eq 'Y'}"> <c:if test="${case06.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case06.pricExpsrOrdr-1}" style="order:${case06.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case06.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case06.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case06.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case06.slePercent }%</span> <span class="percent">${ case06.slePercent }%</span>
</div> </div>
</div> </div>
@@ -2131,7 +2134,7 @@
<c:choose> <c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}"> <c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case07.goodsSttusCd eq '03'}"> <c:when test="${case07.goodsSttusCd eq '03'}">
@@ -2153,10 +2156,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -2171,10 +2174,10 @@
<c:if test="${case07.pricExpsrAt eq 'Y'}"> <c:if test="${case07.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case07.pricExpsrOrdr-1}" style="order:${case07.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case07.pricExpsrOrdr-1}" style="order:${case07.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case07.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case07.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case07.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case07.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case07.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case07.slePercent }%</span> <span class="percent">${ case07.slePercent }%</span>
</div> </div>
</div> </div>
@@ -2255,7 +2258,7 @@
<c:choose> <c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}"> <c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out"> <div class="sold-out">
<span>SOLD OUT</span> <span>입고 대기중</span>
</div> </div>
</c:when> </c:when>
<c:when test="${case08.goodsSttusCd eq '03'}"> <c:when test="${case08.goodsSttusCd eq '03'}">
@@ -2289,10 +2292,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus"> <c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose> <c:choose>
<c:when test="${fn:contains(iconCdNm, '-')}"> <c:when test="${fn:contains(iconCdNm, '-')}">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span> <span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:toUpperCase(iconCdNm)}</span>
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
</c:forEach> </c:forEach>
@@ -2307,10 +2310,10 @@
<c:if test="${case08.pricExpsrAt eq 'Y'}"> <c:if test="${case08.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${case08.pricExpsrOrdr-1}" style="order:${case08.pricExpsrOrdr-1}"> <div class="product-unit-price col order-${case08.pricExpsrOrdr-1}" style="order:${case08.pricExpsrOrdr-1}">
<div class="product-unit-price__price"> <div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case08.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case08.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case08.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case08.slepric }" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case08.slepric }" pattern="#,###"/>${curUnit}</span>
</div> </div>
<div class="product-unit-price__sale"> <div class="product-unit-price__sale <c:if test="${case08.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent">${ case08.slePercent }%</span> <span class="percent">${ case08.slePercent }%</span>
</div> </div>
</div> </div>
@@ -2412,7 +2415,7 @@
<span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span> <span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span>
</div> </div>
<div class="product-unit-price"> <div class="product-unit-price">
<span class="product-unit-price__original"><fmt:formatNumber value="${case09.cnsmrpric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__original <c:if test="${case09.slePercent eq 0}">visually-hidden</c:if>"><fmt:formatNumber value="${case09.cnsmrpric}" pattern="#,###"/>${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${case09.slepric}" pattern="#,###"/>${curUnit}</span> <span class="product-unit-price__current"><fmt:formatNumber value="${case09.slepric}" pattern="#,###"/>${curUnit}</span>
</div> </div>
</div> </div>
@@ -2453,7 +2456,7 @@
<c:forEach items="${ resultMap.case10 }" var="case10" varStatus="status"> <c:forEach items="${ resultMap.case10 }" var="case10" varStatus="status">
<c:if test="${ relmList.ordr eq case10.sOrdr }"> <c:if test="${ relmList.ordr eq case10.sOrdr }">
<div> <div>
<a href="/sopmal/csc/selectBbscttAuth?bbsId=${ case10.bbsId }&bbscttInnb=${ case10.bbscttInnb }"> <a href="/sopmal/csc/selectBbscttAuth?authDv=REDNG&reqUrl=detail&bbsId=${ case10.bbsId }&bbscttInnb=${ case10.bbscttInnb }&mbrid=${ resultMap.loginFlag }">
<img src="${cdnurl}${ case10.reprsntImgSysFilNm }" alt="해당 이미지에 대한 설명" onerror="this.src='/pc/images/image_placeholder.png'"> <img src="${cdnurl}${ case10.reprsntImgSysFilNm }" alt="해당 이미지에 대한 설명" onerror="this.src='/pc/images/image_placeholder.png'">
</a> </a>
</div> </div>
@@ -2942,7 +2945,8 @@
// 상품 카테고리 탭 // 상품 카테고리 탭
$('.section-3').each(function () { $('.section-3').each(function () {
let ordr = $(this).find('input[name="section-ordr"]').val(); let ordr = $(this).find('input[name="section-ordr"]').val();
fn_product_category_type(ordr, "1"); let mainSiteInnb = $(this).find('input[name="section-mainSiteInnb"]').val();
fn_product_category_type(ordr, "1", mainSiteInnb);
}); });
@@ -2986,11 +2990,11 @@
} }
// 상품 카테고리 탭 클릭 시 // 상품 카테고리 탭 클릭 시
const fn_product_category_type = function (ordr, tabNo) { const fn_product_category_type = function (ordr, tabNo, mainSiteInnb) {
$('.category-type-tab__btn-' + ordr).removeClass('active'); $('.category-type-tab__btn-' + ordr).removeClass('active');
$('#category-type-tab__btn-' + ordr + '-' + tabNo).addClass('active'); $('#category-type-tab__btn-' + ordr + '-' + tabNo).addClass('active');
fn_select_product_category(ordr, tabNo); fn_select_product_category(ordr, tabNo, mainSiteInnb);
$('.product-list-type-category-' + ordr).hide(); $('.product-list-type-category-' + ordr).hide();
$('#product-list-type-category-' + ordr + '-' + tabNo).show(); $('#product-list-type-category-' + ordr + '-' + tabNo).show();
@@ -2998,13 +3002,14 @@
// 상품 카테고리 가져오기 // 상품 카테고리 가져오기
const fn_select_product_category = function (ordr, tabNo) { const fn_select_product_category = function (ordr, tabNo, mainSiteInnb) {
$.ajax({ $.ajax({
type: "post", type: "post",
url: "/sopmal/main/selectMainSiteDesignCtgryListInqire", url: "/sopmal/main/selectMainSiteDesignCtgryListInqire",
data: { data: {
ordr: ordr, ordr: ordr,
expsrOrdr: tabNo expsrOrdr: tabNo,
mainSiteInnb: mainSiteInnb
}, },
success: function (data) { success: function (data) {
let result = JSON.parse(data.resBody.result); let result = JSON.parse(data.resBody.result);
@@ -3025,7 +3030,7 @@
str += ' <div class="product-unit-image">'; str += ' <div class="product-unit-image">';
if (result.goodsSttusCd === '02') { if (result.goodsSttusCd === '02') {
str += '<div class="sold-out">'; str += '<div class="sold-out">';
str += ' <span>SOLD OUT</span>'; str += ' <span>입고 대기중</span>';
str += '</div>'; str += '</div>';
} else if (result.goodsSttusCd === '03') { } else if (result.goodsSttusCd === '03') {
str += '<div class="sold-out">'; str += '<div class="sold-out">';
@@ -3051,9 +3056,9 @@
if (iconCdNm.includes('-')) { if (iconCdNm.includes('-')) {
let temp = upper.replace(/-/g, ' '); let temp = upper.replace(/-/g, ' ');
str += '<span class="product-badge ' + lower + '">' + temp + '</span>'; str += '<span class="product-badge ' + lower + '" data-badge-cd="' + iconCdNm + '">' + temp + '</span>';
} else { } else {
str += '<span class="product-badge ' + lower + '">' + upper + '</span>'; str += '<span class="product-badge ' + lower + '" data-badge-cd="' + iconCdNm + '">' + upper + '</span>';
} }
}); });
} }
@@ -3070,10 +3075,10 @@
if (result.pricExpsrAt == 'Y') { if (result.pricExpsrAt == 'Y') {
str += '<div class="product-unit-price col order-' + (result.pricExpsrOrdr - 1) + '" style="order:' + (result.pricExpsrOrdr - 1) + '">'; str += '<div class="product-unit-price col order-' + (result.pricExpsrOrdr - 1) + '" style="order:' + (result.pricExpsrOrdr - 1) + '">';
str += ' <div class="product-unit-price__price">'; str += ' <div class="product-unit-price__price">';
str += ' <span class="product-unit-price__original">' + new Intl.NumberFormat('ko-KR').format(result.cnsmrpric) + curUnit + '</span>'; str += ' <span class="product-unit-price__original' + (result.slePercent == 0 ? ' visually-hidden' : '') + new Intl.NumberFormat('ko-KR').format(result.cnsmrpric) + curUnit + '</span>';
str += ' <span class="product-unit-price__current">' + new Intl.NumberFormat('ko-KR').format(result.slepric) + curUnit + '</span>'; str += ' <span class="product-unit-price__current">' + new Intl.NumberFormat('ko-KR').format(result.slepric) + curUnit + '</span>';
str += ' </div>'; str += ' </div>';
str += ' <div class="product-unit-price__sale">'; str += ' <div class="product-unit-price__sale' + (result.slePercent == 0 ? ' visually-hidden' : '') + '">';
str += ' <span class="percent">' + result.slePercent + '%</span>'; str += ' <span class="percent">' + result.slePercent + '%</span>';
str += ' </div>'; str += ' </div>';
str += '</div>'; str += '</div>';

View File

@@ -1553,6 +1553,29 @@
</td> </td>
</c:if> </c:if>
</tr> </tr>
<c:if test="${resultMap.bbsVo.bbsTyCd eq '01'}">
<tr>
<th>추천 상품 노출</th>
<td colspan="3">
<div class="td-inner">
<div class="custom-radio-container">
<div class="custom-radio">
<input type="radio" id="recomendGoodsExpsrAt-y"
name="recomendGoodsExpsrAt"
value="Y" ${f:setChecked(resultMap.bbsVo.recomendGoodsExpsrAt, 'Y') } />
<label for="recomendGoodsExpsrAt-y">사용</label>
</div>
<div class="custom-radio">
<input type="radio" id="recomendGoodsExpsrAt-n"
name="recomendGoodsExpsrAt"
value="N" ${f:setChecked(resultMap.bbsVo.recomendGoodsExpsrAt, 'N') } />
<label for="recomendGoodsExpsrAt-n">미사용</label>
</div>
</div>
</div>
</td>
</tr>
</c:if>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -948,7 +948,8 @@
<input type="radio" id="write${cgn024.cd }" <input type="radio" id="write${cgn024.cd }"
name="bbscttRegistAuthorDvCd" name="bbscttRegistAuthorDvCd"
value="${cgn024.cd }" ${attrCheck } value="${cgn024.cd }" ${attrCheck }
onclick="fn_click_check('bbscttRegistAuthorDvCd', 'all');"> onclick="fn_change_event('bbscttRegistAuthorDvCd');
fn_click_check('bbscttRegistAuthorDvCd', 'all');">
<label for="write${cgn024.cd }"><c:out <label for="write${cgn024.cd }"><c:out
value="${cgn024.cdNm }"/></label> value="${cgn024.cdNm }"/></label>
</div> </div>
@@ -2042,13 +2043,25 @@
url : url, url : url,
data : paramsArray, data : paramsArray,
success : function(data) { success : function(data) {
const result = JSON.parse(data.resBody.result);
const bbsId = result.bbsid;
if (result.message !== 'success' || !bbsId) {
alert('게시판 등록에 실패했습니다. 다시 시도해 주세요.');
return;
}
alert('<spring:message code="success.common.insert"/>'); alert('<spring:message code="success.common.insert"/>');
const bbsId = JSON.parse(data.resBody.result).bbsid;
<%-- fn_move_dtlupdt(bbsId); --%> <%-- fn_move_dtlupdt(bbsId); --%>
$('#backUpData').find('[name=bbsId]').val(JSON.parse(data.resBody.result).bbsid); $('#backUpData').find('[name=bbsId]').val(bbsId);
$('#backUpData').find('[name=pageDv]').val('I'); $('#backUpData').find('[name=pageDv]').val('I');
$('#backUpData').attr('action', '<c:url value="/mngr/bbs/bbsmngr/selectBbsDtlUpdtForm"/>'); $('#backUpData').attr('action', '<c:url value="/mngr/bbs/bbsmngr/selectBbsDtlUpdtForm"/>');
$('#backUpData').submit(); $('#backUpData').submit();
},
error : function(data) {
const message = data.responseJSON
&& data.responseJSON.resBody
&& data.responseJSON.resBody.result;
alert(message || '게시판 등록 중 오류가 발생했습니다.');
} }
}); });
} }

View File

@@ -6,7 +6,7 @@
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %> <%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %> <%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%@ page import="java.util.Date" %> <spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<%-- <%--
Class Name : GnrlBbscttDtlPopupR.jsp Class Name : GnrlBbscttDtlPopupR.jsp
Description : 일반 게시글 상세 조회 화면 Description : 일반 게시글 상세 조회 화면
@@ -21,36 +21,36 @@
$(document).ready(function () { $(document).ready(function () {
console.log('urlval 태그' + $('.urlVal').length); console.log('urlval 태그' + $('.urlVal').length);
const pcDomnAdres = document.querySelector('.header__logo').getAttribute('data-pcurl'); const popup = document.getElementById('board-list-detail');
let urlVal = ''; let urlVal = '';
const bbscttInnb = document.getElementsByName("script_bbscttInnb")[0]?.value || ""; const bbscttInnb = popup.querySelector('[name="script_bbscttInnb"]')?.value || "";
const bbsId = document.getElementsByName("bbsId")[0]?.value || ""; const bbsId = popup.querySelector('[name="bbsId"]')?.value || "";
const bbsTyCd = document.getElementsByName("bbsTyCd")[0]?.value || ""; const bbsTyCd = popup.querySelector('[name="bbsTyCd"]')?.value || "";
const sopmalCd = document.getElementsByName("sopmalCd")[0]?.value || ""; const sopmalCd = popup.querySelector('[name="sopmalCd"]')?.value || "";
const bbsUseAt = document.getElementsByName("bbsUseAt")[0]?.value || ""; const bbsUseAt = popup.querySelector('[name="bbsUseAt"]')?.value || "";
const npayBbscttSnb = document.getElementsByName("npayBbscttSnb")[0]?.value || ""; const npayBbscttSnb = popup.querySelector('[name="npayBbscttSnb"]')?.value || "";
console.log("bbscttInnb:", bbscttInnb); console.log("bbscttInnb:", bbscttInnb);
console.log("bbsId:", bbsId); console.log("bbsId:", bbsId);
console.log("bbsTyCd:", bbsTyCd); console.log("bbsTyCd:", bbsTyCd);
console.log("sopmalCd:", sopmalCd); console.log("sopmalCd:", sopmalCd);
if(bbsUseAt == 'Y' && (npayBbscttSnb === null || npayBbscttSnb === undefined || npayBbscttSnb === '')) { if (bbsUseAt === 'Y' && !npayBbscttSnb) {
if (bbsTyCd === '03' || bbsId == 'main_event' || bbsId == 'largeLMS_event') { if (bbsId === 'largeLMS_event') {
if (bbsTyCd === '03' || bbsId == 'main_event') { urlVal = '/' + sopmalCd + '/extra/bbs/selectSMSEventPage?bbscttInnb=' + bbscttInnb;
urlVal = pcDomnAdres + '/sopmal/csc/selectBbscttAuth?authDv=CM&bbsTyCd=03&reqUrl=subPage&bbsId=' + bbsId + '&bbscttInnb=' + bbscttInnb;
} else { } else {
urlVal = '/'+sopmalCd+'/extra/bbs/selectSMSEventPage?bbscttInnb=' + bbscttInnb; urlVal = '/sopmal/csc/selectBbscttAuth?authDv=CM&reqUrl=detail&bbsTyCd='
} + encodeURIComponent(bbsTyCd)
+ '&bbsId=' + encodeURIComponent(bbsId)
+ '&bbscttInnb=' + encodeURIComponent(bbscttInnb);
} }
} }
console.log(' urlVal 실행됨: ' + urlVal); console.log(' urlVal 실행됨: ' + urlVal);
console.log(' pcDomnAdres 실행됨: ' + pcDomnAdres);
$('.urlVal').val(urlVal); popup.querySelector('.urlVal').value = urlVal;
}); });
@@ -88,15 +88,18 @@
<input type="hidden" id="bbsId" name="bbsId" value="<c:out value='${bbsInfo.bbsId}' />" /> <input type="hidden" id="bbsId" name="bbsId" value="<c:out value='${bbsInfo.bbsId}' />" />
<div class="form-control-container mb-10"> <div class="form-control-container mb-10">
<div class="left"> <div class="left">
<c:if test="${bbscttInfo.useAt eq 'Y' && empty bbscttInfo.npayBbscttSnb}">
<div class="input-container inline-block mr-5">
<label class="visually-hidden" for="url">사용자 페이지 URL</label>
<input type="text" id="url" class="input-text urlVal" readonly style="width: 500px;"/>
</div>
<button type="button" class="btn xsm primary" onclick="fn_copy_url();">URL 복사</button>
</c:if>
</div> </div>
<div class="center"> <div class="center">
</div> </div>
<div class="right"> <div class="right">
<c:if test="${bbscttInfo.useAt eq 'Y' && empty bbscttInfo.npayBbscttSnb}"> <c:if test="${bbscttInfo.useAt eq 'Y' && empty bbscttInfo.npayBbscttSnb}">
<c:if test="${(bbsInfo.bbsTyCd eq '03') || (bbsInfo.bbsId eq 'main_event') || (bbsInfo.bbsId eq 'largeLMS_event')}">
<input type="text" id="url" class="urlVal" style="display: none;"/>
<button type="button" class="btn xsm primary" onclick="fn_copy_url();">url복사</button>
</c:if>
<button type="button" class="btn xsm primary outline" onclick="fn_select_bbsctt_update_pop('<c:out <button type="button" class="btn xsm primary outline" onclick="fn_select_bbsctt_update_pop('<c:out
value="${ bbscttInfo.bbscttInnb }"/>','dtlPop');"><spring:message value="${ bbscttInfo.bbscttInnb }"/>','dtlPop');"><spring:message
code="button.update"/></button> code="button.update"/></button>
@@ -140,7 +143,7 @@
<c:if test="${bbsInfo.goodsChoice eq 'Y' }"> <c:if test="${bbsInfo.goodsChoice eq 'Y' }">
<c:if test="${not empty goodsList}"> <c:if test="${not empty goodsList}">
<tr> <tr>
<th>상품정보</th> <th>상품 정보</th>
<td colspan="3"> <td colspan="3">
<div class="product-search-box__product parentGoodsContainer"> <div class="product-search-box__product parentGoodsContainer">
<c:forEach var="goods" items="${goodsList}"> <c:forEach var="goods" items="${goodsList}">
@@ -158,7 +161,7 @@
<div class="product-group__description"> <div class="product-group__description">
<p><c:out value="${goods.goodsNm}"/></p> <p><c:out value="${goods.goodsNm}"/></p>
<p class="product-group__description-price"><fmt:formatNumber <p class="product-group__description-price"><fmt:formatNumber
value="${goods.slepric}" pattern="#,###"/>원</p> value="${goods.slepric}" pattern="#,###"/>${curUnit}</p>
</div> </div>
<c:if test="${bbsInfo.bbsTyCd eq '05'}"> <c:if test="${bbsInfo.bbsTyCd eq '05'}">
<input hidden id="goodsInnb" value="${goods.goodsInnb}"/> <input hidden id="goodsInnb" value="${goods.goodsInnb}"/>
@@ -168,6 +171,14 @@
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<th>상품 정보 문구</th>
<td colspan="3">
<div class="td-inner" id="relateGoodsWords">
${bbscttInfo.relateGoodsWords}
</div>
</td>
</tr>
</c:if> </c:if>
</c:if> </c:if>
<tr> <tr>

View File

@@ -22,6 +22,7 @@
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %> <%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
<script src="<c:url value='/js/fileupload_comm.js'/>"></script> <script src="<c:url value='/js/fileupload_comm.js'/>"></script>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/> <spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<script> <script>
$(document).ready(function () { $(document).ready(function () {
/************************************************ /************************************************
@@ -1515,6 +1516,7 @@
selected.forEach((good, index) => { selected.forEach((good, index) => {
let goodsPrice = fn_format_comma(good.goodsPrice); let goodsPrice = fn_format_comma(good.goodsPrice);
let slepric = fn_format_comma(good.goodsPrice); let slepric = fn_format_comma(good.goodsPrice);
let curUnit = '${curUnit}';
var productHtml = ` var productHtml = `
<div class="product-group__item"> <div class="product-group__item">
<input type="hidden" id="relatedGoodsId" name="relatedGoodsId" value="\${good.goodsId}"> <input type="hidden" id="relatedGoodsId" name="relatedGoodsId" value="\${good.goodsId}">
@@ -1528,7 +1530,7 @@
</button> </button>
<div class="product-group__description"> <div class="product-group__description">
<p>\${good.goodsNm}</p> <p>\${good.goodsNm}</p>
<p class="product-group__description-price">\${goodsPrice}</p> <p class="product-group__description-price">\${goodsPrice}\${curUnit}</p>
</div> </div>
<%--게시글 연관 상품--%> <%--게시글 연관 상품--%>
<input type="hidden" name="goodsInnbArr[]" value="\${good.goodsId}"/> <input type="hidden" name="goodsInnbArr[]" value="\${good.goodsId}"/>

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