Compare commits

78 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
130 changed files with 5819 additions and 1385 deletions

View File

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

View File

@@ -282,6 +282,9 @@ public class BOMaMtngService {
int useMlgAmt = Integer.parseInt(goodsList.get(0).getUseMlgAmt());
int useCashMlgAmt = Integer.parseInt(goodsList.get(0).getUseCashMlgAmt());
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();
@@ -317,12 +320,14 @@ public class BOMaMtngService {
// 값이 1인 항목 == 변경항목
List<String> rs = resultValid.stream()
.flatMap(map -> map.entrySet().stream())
.filter(entry -> validationKeys.contains(entry.getKey()))
.filter(entry -> "1".equals(StringUtil.isNullToString(entry.getValue())))
.map(entry -> StringUtil.isNullToString(entry.getKey()))
.toList();
//구매정보 변경유형 저장
validKeys.addAll(rs);
inventoryMessage.add(goods, resultValid);
}
@@ -338,7 +343,9 @@ public class BOMaMtngService {
StringBuilder returnMsg = new StringBuilder();
//상품구매수량제한걸렸을 경우
if(validKeys.contains("purchsQyLmtt")){
if (inventoryMessage.hasShortages()) {
returnMsg.append(inventoryMessage.render());
}else if(validKeys.contains("purchsQyLmtt")){
returnMsg.append("구매수량 제한 상품입니다.");
returnMsg.append(System.lineSeparator()); //줄바꿈
@@ -519,6 +526,8 @@ public class BOMaMtngService {
BOPreOrderValidVO.builder()
.sopmalCd(StringUtil.isNullToString(goods.get("sopmalCd")))
.goodsInnb(StringUtil.isNullToString(goods.get("goodsInnb")))
.goodsNm(StringUtil.isNullToString(goods.get("goodsNm")))
.optionNm(StringUtil.isNullToString(goods.get("option")))
.goodsOptnInnb(StringUtil.isNullToString(goods.get("goodsOptnInnb")))
.subsvcInnb(StringUtil.isNullToString(goods.get("subsvcInnb")))
.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 goodsNm;
private String optionNm;
/*상품옵션고유번호*/
private String goodsOptnInnb;

View File

@@ -3,6 +3,7 @@ package com.wb.domainserver.domain.admin.store.sopmal.mapper;
import java.util.List;
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 org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@@ -202,4 +203,7 @@ public interface BOMaSopmalMapper {
/*전체 쇼핑몰 목록*/
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.vo.BOGoodsInfoVO;
import lombok.Data;
import org.apache.commons.text.StringEscapeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -842,6 +843,7 @@ public class BOMaSopmalService {
mapping.put("memor", "MEMOR_USE_AT");
mapping.put("npay", "NPAY_USE_AT");
mapping.put("kpay", "KPAY_USE_AT");
mapping.put("stripe", "STRIPE_USE_AT");
// 모든 매핑된 값의 기본값을 "N"으로 설정
for (String key : mapping.values()) {
@@ -984,4 +986,43 @@ public class BOMaSopmalService {
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())) {
vo.setBbscttRedngAuthorDvCd("[all]");
} else if (vo.getBbscttRedngAuthorDvCd() != null && "02".equals(vo.getBbscttRedngAuthorDvCd())) {
validateMemberGradeSelection(vo.getBbscttRedngAuthorDvCd_c(), "게시판 읽기");
StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getBbscttRedngAuthorDvCd_c()) {
@@ -431,6 +432,8 @@ public class BOBbsService {
if (vo.getBbscttRegistAuthorDvCd() != null && "01".equals(vo.getBbscttRegistAuthorDvCd())) {
vo.setBbscttRegistAuthorDvCd("[all]");
} else if (vo.getBbscttRegistAuthorDvCd() != null && "02".equals(vo.getBbscttRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getBbscttRegistAuthorDvCd_c(), "게시판 쓰기");
StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getBbscttRegistAuthorDvCd_c()) {
@@ -465,6 +468,8 @@ public class BOBbsService {
if (vo.getAnswRegistAuthorDvCd() != null && "01".equals(vo.getAnswRegistAuthorDvCd())) {
vo.setAnswRegistAuthorDvCd("[all]");
} else if (vo.getAnswRegistAuthorDvCd() != null && "02".equals(vo.getAnswRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getAnswRegistAuthorDvCd_c(), "답글 쓰기");
StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getAnswRegistAuthorDvCd_c()) {
@@ -499,6 +504,8 @@ public class BOBbsService {
if (vo.getCmRegistAuthorDvCd() != null && "01".equals(vo.getCmRegistAuthorDvCd())) {
vo.setCmRegistAuthorDvCd("[all]");
} else if (vo.getCmRegistAuthorDvCd() != null && "02".equals(vo.getCmRegistAuthorDvCd())) {
validateMemberGradeSelection(vo.getCmRegistAuthorDvCd_c(), "댓글 쓰기");
StringBuilder sb = new StringBuilder();
for (String mbrInnb : vo.getCmRegistAuthorDvCd_c()) {
@@ -685,15 +692,21 @@ public class BOBbsService {
msgMap.put("bbsid", bbsId);
} catch (WnbtRestException wre){
throw new WnbtRestException(wre.getMessage());
throw wre;
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException("게시판 등록 중 오류가 발생했습니다.", e);
}
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>();
// 게시글 연관상품 조회
List<DataMap> goodsList = new ArrayList<>();
DataMap result = new DataMap();
goodsList = mapper.selectBOBbscttDtlGoods(bbsctt);
/*게시판 설정 > 추천 상품 노출 선택 시 사용자 게시글 상세 상품 노출 */
if (!goodsList.isEmpty()) {
if ("sopmal".equals(bbsctt.getServerDv())) {
result = goodsService.selectBoGoodsRelateList(goodsList);
}
}
/*사용자 , 관리자 페이지 구분*/
if ("sopmal".equals(bbsctt.getServerDv())) {
map.put("goodsList", result);
map.put("goodsList", goodsList);
} else {
map.put("goodsList", goodsList);
}
@@ -920,6 +912,7 @@ public class BOGnrlbbscttService {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException("게시글 등록 중 오류가 발생했습니다.", e);
}
return message;
@@ -1106,7 +1099,7 @@ public class BOGnrlbbscttService {
}
}
/*1:1 문의 게시판이 아닌경우만 처리 */
if("12".equals(bbsctt.getBbsTyCd())){
if(!"12".equals(bbsctt.getBbsTyCd())){
//게시글 연관 상품 삭제
mapper.deleteBOBbscttGoods(bbsctt);
//게시글 연관 상품 등록(fm_boarddata_goods)
@@ -1137,6 +1130,7 @@ public class BOGnrlbbscttService {
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException("게시글 수정 중 오류가 발생했습니다.", e);
}
return message;

View File

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

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 List<DataMap> selectBOGoodsList(BOGoodsVO vo);
// 관리자 상품 배지 목록
public List<DataMap> selectBOGoodsBadgeList(BOGoodsVO vo);
// 카테고리별 상품 목록 수정
public void updateBOCtgryGoodsList(BOGoodsVO vo);
// 관리자 > 일반 상품 상세

View File

@@ -76,6 +76,15 @@ public class BOGoodsService {
return resultList;
}
/**
* 관리자 상품 배지 목록 조회
* @param vo
* @return
*/
public List<DataMap> selectBOGoodsBadgeList(BOGoodsVO vo) {
return mapper.selectBOGoodsBadgeList(vo);
}
/**
* 사용자 > 상품 목록 조회
* @param vo

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.goods.purchs.mapper.BOPurchsMapper;
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.vo.BOOrderRestAmtVO;
import com.wb.domainserver.exception.WnbtRestException;
@@ -51,6 +53,9 @@ public class BOOrderService {
@Autowired
private BOOrderNoService orderNoService;
@Autowired
private BOSubsvcService subsvcService;
/**
* 관리자 주문 > 주문 등록
* @param param
@@ -976,6 +981,10 @@ public class BOOrderService {
***************************************** */
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());
@@ -987,6 +996,13 @@ public class BOOrderService {
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
public void insertCnsltMemo(String sopmalCd, BigInteger ordrInnb, LinkedHashMap purchsr, LinkedHashMap enuri, AnonymousUser user) {
try{
@@ -1231,7 +1247,16 @@ public class BOOrderService {
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);
} else {
goodsNm = insertedGoodsList.get(0).getGoodsNm();

View File

@@ -500,7 +500,7 @@ public class BODlivyService {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(
"https://acieshop.com/api/kr/pod/v1.5/",
"https://acieshop.com/api/kr/token/",
HttpMethod.POST,
apiRequest,
String.class
@@ -543,14 +543,14 @@ public class BODlivyService {
headers.set("ACIKey", aciKey);
Map<String, Object> body = new HashMap<>();
body.put("BLNO", mapper.selectBOOrdrInvcnb(boDlivyVO));
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(
"ex",
"https://acieshop.com/api/kr/pod/v1.5/",
HttpMethod.POST,
apiRequest,
String.class

View File

@@ -238,13 +238,6 @@ public interface BOOrdrMapper {
* @return List<LinkedHashMap>
*/
public List<LinkedHashMap> selectExcelListByOrder(BOOrdrSrchVO ordrSrchVO);
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 엑셀다운로드 발주서
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelListPurchOrder(BOOrdrSrchVO ordrSrchVO);
/* ####################################
관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 종료
#################################### */
@@ -504,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쇼핑 > 개인결제 시작
#################################### */

View File

@@ -137,6 +137,9 @@ public class BOOrdrLogService {
} else if ("05".equals(setleTyCd)) { // 가상계좌(에스크로)
logDtlCn = mngrOrder + "이(가) 주문접수(가상계좌 에스크로) 하였습니다.";
mngrOrder += "주문접수(가상계좌 에스크로)";
}else if ("stripe".equals(setleTyCd)) { // Stripe(엔화결제)
logDtlCn = mngrOrder + "이(가) 주문접수(엔화결제) 하였습니다.";
mngrOrder += "주문접수(엔화결제)";
} else {
mngrOrder += resCd;
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.databind.ObjectMapper;
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.domain.admin.instcSle.mtng.mapper.BOMaMtngMapper;
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.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.service.BOOrderNoService;
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.BigInteger;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
@@ -682,15 +683,6 @@ public class BOOrdrService{
return mapper.selectExcelListByOrder(ordrSrchVO);
}
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 엑셀다운로드 발주서
* @param ordrSrchVO
* @return List<LinkedHashMap>
*/
public List<DataMap> selectExcelListPurchOrder(BOOrdrSrchVO ordrSrchVO) {
return mapper.selectExcelListPurchOrder(ordrSrchVO);
}
/**
* 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문 목록 조회 > 주문내역서 정보 조회
* @param ordrVO
@@ -1307,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);
}
/* ####################################
관리자 > 주문 > 주문관리 > 발주서 관리 종료
#################################### */
/* ####################################
관리자 > 주문 > 개인결제관리 시작
#################################### */
@@ -3769,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;
// 환율계산
setleAmtKr = setleAmt.multiply(buyRate);
setleAmtKr = setleAmtKr.setScale(0,RoundingMode.HALF_UP);
setleAmtKr = setleAmtKr.setScale(-1, RoundingMode.DOWN);
lmttUseMlg = goodsAmt.subtract(dscntAmt.add(cartCouponDscntAmt));
log.debug(" 결제 예정 금액 : {}", setleAmt);
@@ -5578,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;
}
/**
@@ -5756,6 +5908,16 @@ public class BOOrdrService{
}
/**
* Stripe 주문 상태 조회
* @param ordrVO
* @return Map<String, Object>
*/
public DataMap selectOrdrSttus(BOOrdrVO ordrVO) {
return mapper.selectOrdrDtl(ordrVO);
}
/**
* 사용자 > 상품 > 구매/결제 > 회원구매하기 > 주문완료 정보 조회
* @param ordrVO

View File

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

View File

@@ -4,6 +4,10 @@ import com.wb.domainserver.domain.comm.vo.AbstractVO;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = false)
public class BOOrdrSrchVO extends AbstractVO{
@@ -82,7 +86,15 @@ public class BOOrdrSrchVO extends AbstractVO{
private String[] srchOrdrInnbs; // 주문번호 배열
private String[] srchOrdrDlvyInnbs; // 배송번호 배열
private List<Map<String, String>> srchInnbPairs; // 발주서 주키 배열
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 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.ordr.ordr.service.BOOrdrLogService;
import com.wb.domainserver.exception.WnbtRestException;
@@ -1744,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;
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.purchs.mapper.BOPurchsMapper;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService;
@@ -1151,6 +1154,30 @@ public class BORtngudrefndService {
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

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

View File

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

View File

@@ -45,13 +45,12 @@ import org.springframework.validation.annotation.Validated;
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.RequestMethod;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
@@ -626,137 +625,7 @@ public class OrdrmngrController {
}
}
/**
* 발주서 엑셀다운로드
* @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);
//엑셀 항목별 제목에 출력될 내용 설정
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));
}
//엑셀 항목에 출력될 내용 설정
List<DataMap> resultList = service.selectExcelListPurchOrder(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 encodedFileName = URLEncoder.encode(excelFileName, StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
ExcelDownloadUtil.createExcel(encodedFileName, headerMap, excelList, response);
} catch (IOException ioe) {
log.error("엑셀다운로드 중 오류가 발생하였습니다.", ioe);
throw new WnbtRestException("엑셀다운로드 중 오류가 발생하였습니다.");
}
}
/**
* 주문내역서 팝업 화면 이동
@@ -1192,6 +1061,14 @@ public class OrdrmngrController {
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();
ordrShippingVO.setUpdusr(user.getUserInnb());
@@ -1818,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

@@ -1573,9 +1573,24 @@ public class CscController {
bbsVO.setBbsTyCd(bbsctt.getBbsTyCd());
DataMap bbsInfo = new DataMap();
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();
content.put("bbsInfo", bbsInfo);
content.put("registAuthResult", registAuth.get("resultAuth"));
content.put("bbsctt", bbsctt);
content.put("resultList", resultList);
content.put("paginationInfo", bbsctt.getPaginationInfo());

View File

@@ -190,6 +190,23 @@ public class GoodsController {
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
@@ -288,6 +305,14 @@ public class GoodsController {
public String selectGoodsListForm(HttpServletRequest request,
BOGoodsVO vo,
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();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
@@ -305,7 +330,7 @@ public class GoodsController {
//검색한 카테고리 정보로 vo 세팅
if(!CollectionUtils.isEmpty(goodsCategoryList)){
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{
vo.setUpperCtgryId("0");
vo.setCtgryId("0");
@@ -462,6 +487,7 @@ public class GoodsController {
// 상세 조회
DataMap goodsDtl = service.selectBOGoodsDtlInfo(vo);
List<DataMap> goodsBadgeList = service.selectBOGoodsBadgeList(vo);
//상품 옵션 조회
DataMap goodsOptList = service.selectBOGoodsOptionList(vo);
@@ -513,6 +539,7 @@ public class GoodsController {
//담기
Map<String, Object> content = new HashMap<>();
content.put("goodsDtl", goodsDtl);
content.put("goodsBadgeList", goodsBadgeList);
content.put("evtBannerList", evtBannerList);
content.put("goodsOptList", goodsOptList);
content.put("GoodsRelateInfo", goodsReleateInfo);

View File

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

View File

@@ -728,26 +728,22 @@ public class MyOrdrController {
* @return
*/
@Policy(AuthPolicy.PUBLIC)
// @RequestMapping(value="/selectDlvyInqire")
// public String selectDlvyInqire(BODlivyVO boDlivyVO, ModelMap model, HttpServletRequest request){
@RequestMapping(value="/selectDlvyInqire", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> selectDlvyInqire(BODlivyVO boDlivyVO){
@RequestMapping(value="/selectDlvyInqire")
public String selectDlvyInqire(BODlivyVO boDlivyVO, ModelMap model, HttpServletRequest request){
// 작성자 정보 할당
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
boDlivyVO.setSopmalCd(user.getSopmalCd()); // 쇼핑몰 코드
}
// model.addAttribute("resultMap", dlivyService.updateBOAciDelivery(boDlivyVO));
// return Util.getDeviceType(request) + "/mpage/ordr/DlvyInqireR";
BOOrdrDlvyVO ordrDlvyVO = new BOOrdrDlvyVO();
ordrDlvyVO.setSopmalCd(boDlivyVO.getSopmalCd());
ordrDlvyVO.setOrdrInnb(boDlivyVO.getOrdrInnb());
DataMap content = new DataMap();
content.put("invcnb", dlivyService.selectBOOrdrInvcnb(boDlivyVO));
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(content))
.build()
);
model.addAttribute("ordrInfo", boOrdrService.selectMbrOrdrDtlInqire(ordrDlvyVO));
model.addAttribute("resultMap", dlivyService.updateBOAciDelivery(boDlivyVO));
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.databind.ObjectMapper;
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.mvc.tags.ui.pagination.PaginationInfo;
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.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.logging.log4j.util.Base64Util;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
@@ -68,15 +70,11 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.*;
@@ -854,6 +852,8 @@ public class OrdrController {
url = "sopmal/ordr/OrdrReqstTossPayR";
} else if ("tosspay".equals(pgCmpnyNm)||"kakaopay".equals(pgCmpnyNm)) { //||"naverpay".equals(pgCmpnyNm) 키움으로 이동
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)) { // 무통장, 마일리지, 충전형마일리지
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

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);
Cookie agentIdCookie = new Cookie("agent_id", cookieValue);
agentIdCookie.setMaxAge(86400 * 365 * 10); // 10년
if (!request.getServerName().startsWith("loc.")) {
agentIdCookie.setDomain(domain);
}
// agentIdCookie.setHttpOnly(true);
agentIdCookie.setPath("/mngr");
// agentIdCookie.setSecure(true);

View File

@@ -51,14 +51,17 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
String accessToken = extractToken(request);
String sysDvCd = RealmContextHolder.getSysDvCdRealm();
String expireChk = request.getParameter("expire");
String tokenExpireCookie = CookieUtils.getCookieValue("token_expire", request);
//사용자이면서 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"));
return;
@@ -66,7 +69,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
// accessToken이 있고 refresh Token 요청이 아닌경우
if (StringUtils.hasText(accessToken) && !requestUri.contains("/tokens/refresh")) {
if (StringUtils.hasText(accessToken) && !isAuthenticationEndpoint(requestUri, realm)) {
UserDetails userDetails = customUserDetailService.loadUserByUsername(accessToken);
if (userDetails != null) {
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) {

View File

@@ -44,9 +44,12 @@ public abstract class CookieUtils {
Cookie cookie = new Cookie(name, null);
cookie.setMaxAge(0);
cookie.setPath(path);
cookie.setDomain(originHost);
setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(true);
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) {
@@ -58,10 +61,12 @@ public abstract class CookieUtils {
String originHost = UrlExtractor.getOriginalHost(host);
deleteLegacyDomainCookie(name, path, request, response, originHost);
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(maxAge);
cookie.setPath(path);
cookie.setDomain(originHost);
setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(httpOnly);
response.addCookie(cookie);
}
@@ -77,7 +82,7 @@ public abstract class CookieUtils {
Cookie cookie = new Cookie(name, value);
cookie.setPath(path);
cookie.setDomain(originHost);
setCookieDomain(cookie, request, originHost);
cookie.setHttpOnly(httpOnly);
response.addCookie(cookie);
}
@@ -96,4 +101,30 @@ public abstract class CookieUtils {
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) {
thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);
}
BufferedImage convertImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
convertImage.getGraphics().drawImage(thumbnail, posX, posY, null);
BufferedImage convertImage = new BufferedImage(destWidth, destHeight, getImageType(image, file.getOriginalFilename()));
Graphics graphics = convertImage.getGraphics();
try {
graphics.drawImage(thumbnail, posX, posY, null);
} finally {
graphics.dispose();
}
String ext = FilenameUtils.getExtension(file.getOriginalFilename());
ImageIO.write(convertImage, ext, os);
@@ -376,8 +381,13 @@ public class FileStorageService {
if(image != null) {
thumbnail = image.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);
}
BufferedImage convertImage = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
convertImage.getGraphics().drawImage(thumbnail, posX, posY, null);
BufferedImage convertImage = new BufferedImage(thumbnailWidth, thumbnailHeight, getImageType(image, file.getOriginalFilename()));
Graphics graphics = convertImage.getGraphics();
try {
graphics.drawImage(thumbnail, posX, posY, null);
} finally {
graphics.dispose();
}
ImageIO.write(convertImage, ext, os);
}catch (WnbtRestException wre){
@@ -407,6 +417,14 @@ public class FileStorageService {
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 에 지정된 경로에 저장이 됨

View File

@@ -359,7 +359,7 @@ mngrfo:
images: .gif,.jpg,.jpeg,.png
cdnurl: https://19d28cf7178139ad.kinxzone.com
subsvc:
dft-goods-optn-innb: 5
dft-goods-optn-innb: 1
secret:

View File

@@ -360,7 +360,7 @@ mngrfo:
cdnurl: https://19d28cf7178139ad.kinxzone.com
# upurl: https://www.soju1sake1.com
subsvc:
dft-goods-optn-innb: 5
dft-goods-optn-innb: 1
secret:
key: 1df5be2f7e90ae36

View File

@@ -440,11 +440,11 @@ ordr:
# 서치어드바이저 소유권 코드
meta-content:
google:
LR: ""
SK: "6RUF9UIWIu1nl1WlceNKH25YZG13jcEZHURfLrbSxQU"
naver:
LR: "5fcdb284f18ca08cf86af214a01998990c008e84"
SK: "213a2c785853cdd006af58d286ffec23342a0e8a"
facebook:
LR: ""
SK: ""
# 결제 api 사용 암호 key
api:

View File

@@ -402,6 +402,9 @@
WHEN (IFNULL(GOODS.REST_INVNTRY_QY, 0) - IFNULL(GOODS.AVLINV_LMTT_QY, 0)) >= #{goodsTotalQy} THEN 0
ELSE 1 END
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 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 -- 이벤트 중복제한 쿠폰 존재여부
, CASE WHEN OPTN.OPTN_EXPSR_AT = 'Y' THEN 0 ELSE 1 END AS OPTN_EXPSR_AT
FROM (SELECT GG.GOODS_INNB -- 상품 고유번호
, GG.GOODS_NM
, GG.SOPMAL_CD -- 쇼핑몰코드
, GG.DLVY_GROUP_INNB -- 배송그룹고유번호
, GG.GOODS_KND_CD -- 상품구분 01 상품
@@ -801,6 +805,9 @@
ELSE 1
END
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
WHEN IFNULL(GOODS.SUBSVC_CT, 0) = #{slepric} THEN 0
ELSE 1
@@ -817,6 +824,7 @@
FROM (
SELECT
GS.SUBSVC_INNB, -- 구독서비스 고유번호
GG.GOODS_NM,
GG.GOODS_INNB, -- 상품 고유번호
GS.SOPMAL_CD, -- 쇼핑몰코드
GS.SUBSVC_CT, -- 구독료

View File

@@ -338,6 +338,7 @@
,MEMOR_USE_AT
,NPAY_USE_AT
,KPAY_USE_AT
,STRIPE_USE_AT
FROM GC_PAY_INFO
WHERE SETLE_SETUP_INNB = #{setleSetupInnb}
</select>
@@ -1281,6 +1282,7 @@
MEMOR_USE_AT = #{memorUseAt},
NPAY_USE_AT = #{npayUseAt},
KPAY_USE_AT = #{kpayUseAt},
STRIPE_USE_AT = #{stripeUseAt},
UPDUSR = #{updusr},
UPDT_DT = NOW()
WHERE
@@ -1569,5 +1571,124 @@
AND GD.USE_AT = 'Y'
</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>

View File

@@ -1767,6 +1767,7 @@
,CAST(AES_DECRYPT(UNHEX(FB.ANSW_MBTLNB) , #{secretKey}) AS CHAR(50)) AS ANSW_MBTLNB
,FB.ANSW_SMS_RECPTN
,FB.SJ
,FB.RELATE_GOODS_WORDS
,FB.SORT_ORDR
,FB.USE_AT
,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
,FB.ANSW_SMS_RECPTN
,FB.SJ
,FB.RELATE_GOODS_WORDS
,FB.SORT_ORDR
,FB.USE_AT
,FB.CN_SCRIPT
@@ -2039,6 +2041,9 @@
PASSWORD,
SJ,
CN,
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
RELATE_GOODS_WORDS,
</if>
INQIRE_CNT,
CM_USE_AT,
RECOMEND_CNT,
@@ -2087,6 +2092,9 @@
MD5(#{password}),
#{sj},
#{cn},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
#{relateGoodsWords},
</if>
0,
IFNULL(#{cmUseAt},'N'),
0,
@@ -2133,6 +2141,9 @@
SET
SJ = #{sj},
CN = #{cn},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(relateGoodsWords)">
RELATE_GOODS_WORDS = #{relateGoodsWords},
</if>
CM_USE_AT =IFNULL(#{cmUseAt},'N'),
SORT_ORDR = #{sortOrdr},
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(represntFileInfo)">
@@ -2656,19 +2667,43 @@
WHERE 1=1
AND FGI.GOODS_INNB = FBG.GOODS_INNB
AND FGI.SOPMAL_CD = FBG.SOPMAL_CD
AND FGI.IMG_KND = '03'
AND FGI.IMG_KND = '02'
AND FGI.CUT_NB = 1
LIMIT 1
)IMG
) AS IMG
,FG.GOODS_NM
,FGO.CNSMRPRIC
,FGO.SLEPRIC
,FGO.STDR_DV_AT
,FN_GET_COMMCODE_NAME('GOODS_STTUS', FG.GOODS_STTUS_CD) AS GOODS_STTUS_NM
,FN_GET_COMMCODE_NAME('EXPSR', FG.EXPSR_DV_CD) AS EXPSR_NM
,FBG.ORDR_GOODS_OPTN_INNB
,FBG.SOPMAL_CD
,FBG.RE_ORDER_AT
,FG.GOODS_ICON_CD AS ICON_CD_NM_LIST
,FG.SRT_DC AS REPRSNT_DC
,FG.GOODS_STTUS_CD
,FEGI.GOODS_NM_EXPSR_AT
,FEGI.GOODS_NM_EXPSR_ORDR
,FEGI.REPRSNT_DC_EXPSR_AT
,FEGI.REPRSNT_DC_EXPSR_ORDR
,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
INNER JOIN GC_GOODS FG ON
FG.GOODS_INNB = FBG.GOODS_INNB
@@ -2676,6 +2711,9 @@
INNER JOIN GC_GOODS_OPTION FGO ON
FG.GOODS_INNB = FGO.GOODS_INNB
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
AND FG.SOPMAL_CD =#{sopmalCd}
AND FBG.BBSCTT_INNB =
@@ -2688,6 +2726,16 @@
</otherwise>
</choose>
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>
<!-- 게시글 연관상품 삭제 (게시글 수정시)-->

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
############################-->
<!-- 관리자 상품 배지 목록 -->
<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">
<!-- 검색조건 별 검색 -->
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(srchStr)">
@@ -223,72 +237,86 @@
<choose>
<when test="sortDv == 'goodsNmAsc'">
<![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 test="sortDv == 'goodsNmDesc'">
<![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 test="sortDv == 'slepricAsc'">
<![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 test="sortDv == 'slepricDesc'">
<![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 test="sortDv == 'cnsmrpricAsc'">
<![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 test="sortDv == 'cnsmrpricDesc'">
<![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 test="sortDv == 'invntryQyAsc'">
<![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 test="sortDv == 'invntryQyDesc'">
<![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 test="sortDv == 'registDtAsc'">
<![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 test="sortDv == 'registDtDesc'">
<![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 test="sortDv == 'avgEvlScore'">
<![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 test="sortDv == 'cntEvlScor'">
<![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 test="sortDv == 'goodsInnbDesc'">
<![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>
<otherwise>
<![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>
</choose>

View File

@@ -2654,6 +2654,7 @@ FROM (
, FPI.TPAY_USE_AT
, FPI.NPAY_USE_AT
, FPI.KPAY_USE_AT
, FPI.STRIPE_USE_AT
, FPI.MEMOR_USE_AT
, FPL.KCP_MID
, FPL.KCP_CLNT_KEY
@@ -2683,6 +2684,9 @@ FROM (
, FPL.OLD_TOSS_CLNT_KEY
, FPL.OLD_TOSS_SECRET_KEY
, FPL.OLD_TOSS_PUBLIC_KEY
, FPL.STRIPE_CLNT_KEY
, FPL.STRIPE_SECRET_KEY
, FPL.STRIPE_WEBHOOK_KEY
, FPL.DUE_DT
FROM GC_PAY_LINK FPL
INNER JOIN GC_PAY_INFO FPI ON FPI.SETLE_SETUP_INNB = FPL.SETLE_SETUP_INNB

View File

@@ -1440,125 +1440,6 @@
GROUP BY A.ORDR_INNB
) EXCEL
</select>
<!-- 전체 주문 조회 > 엑셀다운로드 발주서 -->
<select id="selectExcelListPurchOrder" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrSrchVO" resultType="dataMap">
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,
TRUNCATE(
(
(
(GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
- (
GGC.CSTMS_FEE
+ (GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
* GGC.PLTFOM_FEE
* GGC.EXPCT_TAX
+ GGC.KR_DLVY_CT
)
) * GGC.USD_RATE / 1000
), 2
) AS UNIT_VALUE,
/*원가 관리 종료*/
GOIO.ORDR_QY,
(
TRUNCATE(
(
(
(GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
- (
GGC.CSTMS_FEE
+ (GOIO.SLEPRIC + GOS.DFT_DLVY_AMT)
* GGC.PLTFOM_FEE
* GGC.EXPCT_TAX
+ GGC.KR_DLVY_CT
)
) * GGC.USD_RATE / 1000
), 2
) * 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,
/*아래부터는 발주서에 포함되지 않음*/
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
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 GO.ORDR_RCEPT_DT BETWEEN #{srchStartDate} AND #{srchEndDate} ' 23:59:59'
AND GOIO.ORDR_STTUS_CD = #{srchOrdrSttusCd}
AND GO.SOPMAL_CD = #{sopmalCd}
</select>
<!--
####################################
전체주문 조회 서비스 종료
@@ -2131,6 +2012,7 @@
SELECT FOS.SOPMAL_CD
, FOS.ORDR_INNB
, FOS.ORDR_DLVY_INNB
, FOS.DLVYLC_AREA_CD
, FOS.RECPNT_NM
, CASE
WHEN LENGTH(CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_TELNB), '1df5be2f7e90ae36') AS CHAR(50))) = 11 THEN
@@ -2160,6 +2042,7 @@
ELSE
CAST(AES_DECRYPT(UNHEX(FOS.RECPNT_MBTLNB), '1df5be2f7e90ae36') AS CHAR(50))
END AS RECPNT_MBTLNB
, FOS.CSTMCLER_CD
, FOS.DLVYLC_ZIP
, FOS.DLVYLC_ADRES_DV_CD
, CASE WHEN FOS.DLVYLC_ADRES_DV_CD = '01'
@@ -2509,6 +2392,9 @@
SET FOS.RECPNT_NM = #{recpntNm}
, FOS.RECPNT_TELNB = HEX(AES_ENCRYPT(REPLACE(#{recpntTelnb}, '-', ''), '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_ADRES_DV_CD = #{dlvylcAdresDvCd}
, FOS.DLVYLC_LNB_ADRES = #{dlvylcLnbAdres}
@@ -3042,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>
<!--
####################################
관리자 > 주문 > 주문관리 > 발주서 관리 종료
####################################
-->
<!--
####################################
관리자 > 주문 > 개인결제관리 시작
@@ -5898,7 +6059,7 @@
ON GGO.SOPMAL_CD = GG.SOPMAL_CD
AND GGO.GOODS_INNB = GG.GOODS_INNB
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
AND GG.GOODS_INNB = GGI.GOODS_INNB
AND GGI.IMG_KND = '03'

View File

@@ -3003,7 +3003,11 @@ FROM (
) CPN ON GOODS.SOPMAL_CD = CPN.SOPMAL_CD
AND GOODS.GOODS_INNB = CPN.GOODS_INNB
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
AND GOODS.GOODS_INNB = CPN.GOODS_INNB
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
AND GOODS.GOODS_INNB = CPN.GOODS_INNB
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('결제취소 화면을 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.');
}
}

View File

@@ -923,3 +923,10 @@ $(".comma").each(function () {
var text = $(this).text();
$(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 {
padding-top: 96px;
}
.header--sub:has(.mobile-about-menu) ~ .content-wrap {
padding-top: 96px;
}
.header--sub::before {
content: "";
position: absolute;
@@ -5706,6 +5709,17 @@ body {
color: #16191d;
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 {
display: inline-block;

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -5560,20 +5560,36 @@ main {
}
.quick-menu__customer-service {
position: relative;
cursor: pointer;
}
.quick-menu__customer-service__num {
position: absolute;
bottom: 24px;
top: 80%;
left: 50%;
transform: translateX(-50%);
font-size: 24px;
width: 100%;
transform: translate(-50%, -50%);
font-size: 14px;
line-height: 1;
font-weight: 700;
color: #212529;
text-align: center;
}
.quick-menu__customer-service-alwaysonbottom {
position: fixed;
left: 20px;
bottom: 20px;
z-index: 10;
}
.quick-menu > * + * {
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 {
width: 100%;
@@ -9579,7 +9595,6 @@ main {
.cartOrderBox__total {
display: flex;
align-items: center;
margin-bottom: 20px;
}
.cartOrderBox__totalTh {
font-size: 16px;
@@ -9603,6 +9618,7 @@ main {
}
.cartOrderBox__buyBtn {
width: 100%;
margin-top: 20px;
margin-bottom: 16px;
}
.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="control-label">카카오페이</span>
</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:forEach>
</c:if>
@@ -1573,6 +1578,11 @@
<span class="check"></span>
<span class="control-label">카카오페이</span>
</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:forEach>
</c:if>
@@ -1649,6 +1659,11 @@
<span class="check"></span>
<span class="control-label">카카오페이</span>
</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:forEach>
</c:if>
@@ -1725,6 +1740,11 @@
<span class="check"></span>
<span class="control-label">카카오페이</span>
</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:forEach>
</c:if>

View File

@@ -53,6 +53,42 @@
<!-- 스크립트 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.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='/js/sopmal/gcone.js'/>"></script>
@@ -489,3 +525,10 @@
<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>
<!--고객센터 아이콘-->
<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>
<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>
<script>
//뒤로가기 이벤트 부여, 각 페이지 마다 이벤트 삭제 후 다른 이벤트 사용 가능

View File

@@ -32,6 +32,42 @@
<!-- 스크립트 -->
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></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="/mobile/js/bottom-sheet.js" defer=""></script>
@@ -1034,10 +1070,11 @@
<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}"/>" class="depth"><c:out value ="${topMenuList.ctgryNm}"/><em class="visually-hidden">상세내용닫기</em></a>
<a href="<c:out value="${topMenuList.url}"/>" class="moer"></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="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'}">
@@ -1046,7 +1083,7 @@
<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>
<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}"/>
@@ -1197,6 +1234,12 @@
<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>
/*최초 로그인시 마케팅 수신동의를 받지 않았을 경우 마케팅 수신동의 팝업 띄우기*/
@@ -1235,6 +1278,16 @@ $(document).ready(function() {
if(locationUrl.includes("selectMbrPurchsForm")){
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.rnum eq '2'}">
<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>
</c:if>
</c:if>

View File

@@ -81,7 +81,7 @@
<c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case02.goodsSttusCd eq '03'}">
@@ -104,10 +104,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -122,10 +122,10 @@
<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__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>
</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>
</div>
</div>
@@ -260,7 +260,7 @@
<c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case04.goodsSttusCd eq '03'}">
@@ -282,10 +282,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -300,10 +300,10 @@
<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__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>
</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>
</div>
</div>
@@ -391,7 +391,7 @@
<c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case05.goodsSttusCd eq '03'}">
@@ -414,10 +414,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -432,10 +432,10 @@
<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__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>
</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>
</div>
</div>
@@ -499,7 +499,7 @@
<c:choose>
<c:when test="${case06.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case06.goodsSttusCd eq '03'}">
@@ -521,10 +521,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -539,10 +539,10 @@
<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__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>
</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>
</div>
</div>
@@ -614,10 +614,10 @@
<c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -632,10 +632,10 @@
<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__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>
</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>
</div>
</div>
@@ -705,7 +705,7 @@
<c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case07.goodsSttusCd eq '03'}">
@@ -727,10 +727,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -745,10 +745,10 @@
<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__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>
</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>
</div>
</div>
@@ -829,7 +829,7 @@
<c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case08.goodsSttusCd eq '03'}">
@@ -863,10 +863,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -881,10 +881,10 @@
<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__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>
</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>
</div>
</div>
@@ -986,7 +986,7 @@
<span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span>
</div>
<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>
</div>
</div>
@@ -1272,13 +1272,14 @@
</div>
</c:if>
</div>
<%-- <div class="quick-menu__customer-service">--%>
<%-- <i class="icon icon_quick-customer-service"></i>--%>
<%-- <span class="visually-hidden">고객센터</span>--%>
<%-- <span class="quick-menu__customer-service__num">--%>
<%-- ${ fn:replace(resultMap.operAt.cscTelnb, '-', '<br>') }--%>
<%-- </span>--%>
<%-- </div>--%>
<%--<div class="quick-menu__customer-service"
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>--%>
<div class="quick-menu__to-top">
<button><i class="icon icon_quick-to-top"></i><span class="visually-hidden">위로
가기</span></button>
@@ -1509,7 +1510,7 @@
<c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case02.goodsSttusCd eq '03'}">
@@ -1532,10 +1533,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1550,10 +1551,10 @@
<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__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>
</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>
</div>
</div>
@@ -1688,7 +1689,7 @@
<c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case04.goodsSttusCd eq '03'}">
@@ -1710,10 +1711,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1728,10 +1729,10 @@
<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__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>
</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>
</div>
</div>
@@ -1819,7 +1820,7 @@
<c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case05.goodsSttusCd eq '03'}">
@@ -1842,10 +1843,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1860,10 +1861,10 @@
<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__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>
</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>
</div>
</div>
@@ -1927,7 +1928,7 @@
<c:choose>
<c:when test="${case06.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case06.goodsSttusCd eq '03'}">
@@ -1949,10 +1950,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1967,10 +1968,10 @@
<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__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>
</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>
</div>
</div>
@@ -2042,10 +2043,10 @@
<c:forEach items="${fn:split(case06.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -2060,10 +2061,10 @@
<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__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>
</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>
</div>
</div>
@@ -2133,7 +2134,7 @@
<c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case07.goodsSttusCd eq '03'}">
@@ -2155,10 +2156,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -2173,10 +2174,10 @@
<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__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>
</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>
</div>
</div>
@@ -2257,7 +2258,7 @@
<c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case08.goodsSttusCd eq '03'}">
@@ -2291,10 +2292,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -2309,10 +2310,10 @@
<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__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>
</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>
</div>
</div>
@@ -2414,7 +2415,7 @@
<span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span>
</div>
<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>
</div>
</div>
@@ -3029,7 +3030,7 @@
str += ' <div class="product-unit-image">';
if (result.goodsSttusCd === '02') {
str += '<div class="sold-out">';
str += ' <span>SOLD OUT</span>';
str += ' <span>입고 대기중</span>';
str += '</div>';
} else if (result.goodsSttusCd === '03') {
str += '<div class="sold-out">';
@@ -3055,9 +3056,9 @@
if (iconCdNm.includes('-')) {
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 {
str += '<span class="product-badge ' + lower + '">' + upper + '</span>';
str += '<span class="product-badge ' + lower + '" data-badge-cd="' + iconCdNm + '">' + upper + '</span>';
}
});
}
@@ -3074,10 +3075,10 @@
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__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 += ' </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 += ' </div>';
str += '</div>';

View File

@@ -1553,6 +1553,29 @@
</td>
</c:if>
</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>
</table>
</div>

View File

@@ -948,7 +948,8 @@
<input type="radio" id="write${cgn024.cd }"
name="bbscttRegistAuthorDvCd"
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
value="${cgn024.cdNm }"/></label>
</div>
@@ -2042,13 +2043,25 @@
url : url,
data : paramsArray,
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"/>');
const bbsId = JSON.parse(data.resBody.result).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').attr('action', '<c:url value="/mngr/bbs/bbsmngr/selectBbsDtlUpdtForm"/>');
$('#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="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ 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
Description : 일반 게시글 상세 조회 화면
@@ -21,36 +21,36 @@
$(document).ready(function () {
console.log('urlval 태그' + $('.urlVal').length);
const pcDomnAdres = document.querySelector('.header__logo').getAttribute('data-pcurl');
const popup = document.getElementById('board-list-detail');
let urlVal = '';
const bbscttInnb = document.getElementsByName("script_bbscttInnb")[0]?.value || "";
const bbsId = document.getElementsByName("bbsId")[0]?.value || "";
const bbsTyCd = document.getElementsByName("bbsTyCd")[0]?.value || "";
const sopmalCd = document.getElementsByName("sopmalCd")[0]?.value || "";
const bbsUseAt = document.getElementsByName("bbsUseAt")[0]?.value || "";
const npayBbscttSnb = document.getElementsByName("npayBbscttSnb")[0]?.value || "";
const bbscttInnb = popup.querySelector('[name="script_bbscttInnb"]')?.value || "";
const bbsId = popup.querySelector('[name="bbsId"]')?.value || "";
const bbsTyCd = popup.querySelector('[name="bbsTyCd"]')?.value || "";
const sopmalCd = popup.querySelector('[name="sopmalCd"]')?.value || "";
const bbsUseAt = popup.querySelector('[name="bbsUseAt"]')?.value || "";
const npayBbscttSnb = popup.querySelector('[name="npayBbscttSnb"]')?.value || "";
console.log("bbscttInnb:", bbscttInnb);
console.log("bbsId:", bbsId);
console.log("bbsTyCd:", bbsTyCd);
console.log("sopmalCd:", sopmalCd);
if(bbsUseAt == 'Y' && (npayBbscttSnb === null || npayBbscttSnb === undefined || npayBbscttSnb === '')) {
if (bbsTyCd === '03' || bbsId == 'main_event' || bbsId == 'largeLMS_event') {
if (bbsTyCd === '03' || bbsId == 'main_event') {
urlVal = pcDomnAdres + '/sopmal/csc/selectBbscttAuth?authDv=CM&bbsTyCd=03&reqUrl=subPage&bbsId=' + bbsId + '&bbscttInnb=' + bbscttInnb;
} else {
if (bbsUseAt === 'Y' && !npayBbscttSnb) {
if (bbsId === 'largeLMS_event') {
urlVal = '/' + sopmalCd + '/extra/bbs/selectSMSEventPage?bbscttInnb=' + bbscttInnb;
}
} else {
urlVal = '/sopmal/csc/selectBbscttAuth?authDv=CM&reqUrl=detail&bbsTyCd='
+ encodeURIComponent(bbsTyCd)
+ '&bbsId=' + encodeURIComponent(bbsId)
+ '&bbscttInnb=' + encodeURIComponent(bbscttInnb);
}
}
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}' />" />
<div class="form-control-container mb-10">
<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 class="center">
</div>
<div class="right">
<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
value="${ bbscttInfo.bbscttInnb }"/>','dtlPop');"><spring:message
code="button.update"/></button>
@@ -158,7 +161,7 @@
<div class="product-group__description">
<p><c:out value="${goods.goodsNm}"/></p>
<p class="product-group__description-price"><fmt:formatNumber
value="${goods.slepric}" pattern="#,###"/>원</p>
value="${goods.slepric}" pattern="#,###"/>${curUnit}</p>
</div>
<c:if test="${bbsInfo.bbsTyCd eq '05'}">
<input hidden id="goodsInnb" value="${goods.goodsInnb}"/>
@@ -168,6 +171,14 @@
</div>
</td>
</tr>
<tr>
<th>상품 정보 문구</th>
<td colspan="3">
<div class="td-inner" id="relateGoodsWords">
${bbscttInfo.relateGoodsWords}
</div>
</td>
</tr>
</c:if>
</c:if>
<tr>

View File

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

View File

@@ -280,8 +280,8 @@
</td>
</c:if>
</tr>
<tr class="visibleAt">
<c:if test="${bbsInfo.goodsChoice eq 'Y'}">
<tr class="visibleAt">
<th>상품 정보
<button type="button" class="btn xsm primary ml-5"
onclick="fn_open_modal('#modalDiv',
@@ -298,8 +298,16 @@
</div>
</div>
</td>
</c:if>
</tr>
<tr class="visibleAt">
<th>상품 정보 문구</th>
<td colspan="3">
<div class="td-inner">
<input class="input-text full" type="text" title="해당 인풋에 대한 설명" placeholder="관련 상품 문구를 입력해 주세요." name="relateGoodsWords" maxlength="50" value="이 글과 관련된 사케">
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<tr>
<th>추가 입력 항목</th>

View File

@@ -6,6 +6,8 @@
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<%--
Class Name : GnrlBbscttUpdtPopupU.jsp
Description : 일반 게시글 등록 팝업
@@ -15,7 +17,6 @@
------- -------- ---------------------------
2024-01-08 김혜지 최초 생성
--%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div id="board-list-update" class="modal" style="max-width: 1400px;">
<div class="modal-header">
<h4>게시글 수정</h4>
@@ -474,8 +475,8 @@
</td>
</c:if>
</tr>
<tr class ="visibleAt">
<c:if test = "${bbsInfo.goodsChoice eq 'Y'}">
<tr class ="visibleAt">
<th>상품 정보
<c:choose>
<c:when test = "${not empty goods}">
@@ -486,7 +487,7 @@
</c:when>
<c:otherwise>
<button type="button" class="btn xsm primary ml-5"
onclick="fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;">
onclick="selected = []; fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;">
검색
</button>
</c:otherwise>
@@ -510,7 +511,7 @@
</button>
<div class="product-group__description">
<p><c:out value="${goods.goodsNm}"/></p>
<p class="product-group__description-price"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>원</p>
<p class="product-group__description-price"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit}</p>
</div>
<%--게시글 연관 상품--%>
<input type="hidden" name="goodsInnbArr[]" value="${goods.goodsInnb}"/>
@@ -520,8 +521,16 @@
</div>
</div>
</td>
</c:if>
</tr>
<tr class="visibleAt">
<th>상품 정보 문구</th>
<td colspan="3">
<div class="td-inner">
<input class="input-text full" type="text" title="해당 인풋에 대한 설명" placeholder="관련 상품 문구를 입력해 주세요." name="relateGoodsWords" maxlength="50" value = "${bbscttInfo.relateGoodsWords}">
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<tr>
<th>추가 입력 항목</th>

View File

@@ -0,0 +1,79 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
<style>
.badge-preview { display: inline-block; min-width: 70px; padding: 4px 8px; border: 1px solid; border-radius: 3px; text-align: center; }
.color-field { display: flex; align-items: center; gap: 6px; position: relative; }
.color-palette-toggle { width: 32px; min-width: 32px; height: 32px; padding: 3px; border: 1px solid #bbb; background: #fff; cursor: pointer; }
.color-swatch { display: block; width: 100%; height: 100%; border: 1px solid rgba(0, 0, 0, .15); }
.color-palette { display: none; position: absolute; z-index: 10; top: 36px; left: 0; width: 260px; padding: 8px; background: #fff; border: 1px solid #aaa; box-shadow: 0 3px 10px rgba(0, 0, 0, .18); grid-template-columns: repeat(12, 1fr); gap: 4px; }
.color-palette.is-open { display: grid; }
.color-choice { width: 16px; height: 16px; padding: 0; border: 1px solid rgba(0, 0, 0, .18); cursor: pointer; }
</style>
</head>
<body>
<%@include file ="/WEB-INF/views/comm/mngr/Header.jsp" %>
<main class="main">
<%@include file ="/WEB-INF/views/comm/mngr/Left.jsp" %>
<div class="content"><div class="content__inner">
<button class="side-nav__fold"><span class="visually-hidden">좌측메뉴 펼치기/닫기</span></button>
<div class="page-title">
<h2 class="page-title__title">상품배지설정관리</h2>
<div class="page-title__btn-container"><button type="button" class="btn primary" onclick="fn_save_badges()">저장하기</button></div>
</div>
<form id="badgeForm">
<section class="content-section">
<div class="form-control-container mb-8"><div class="left"><h3 class="content-section__inner-title">상품 배지</h3></div><div class="center"></div><div class="right"><button type="button" class="btn primary outline xsm" onclick="fn_add_badge()">추가</button><button type="button" class="btn dark xsm" onclick="fn_remove_badge()">선택 행 제거</button></div></div>
<div class="table-wrapper"><table class="table vertical"><caption>상품 배지 설정</caption><thead><tr><th><label class="b-checkbox checkbox is-medium check-all"><input type="checkbox" id="badgeAll"><span class="check"></span></label></th><th>배지코드</th><th>배지명</th><th>글자색</th><th>배경색</th><th>테두리색</th><th>노출순서</th><th>사용여부</th><th>미리보기</th></tr></thead>
<tbody id="badgeBody">
<c:forEach var="badge" items="${resultMap.badgeList}">
<tr data-new-at="N"><td><label class="b-checkbox checkbox is-medium"><input type="checkbox" name="badgeChk"><span class="check"></span></label></td><td><input type="text" class="input-text xl badge-cd" name="badgeCdArr" value="<c:out value='${badge.badgeCd}'/>" readonly><input type="hidden" name="originalBadgeCdArr" value="<c:out value='${badge.badgeCd}'/>"></td><td><input type="text" class="input-text xl badge-nm" name="badgeNmArr" value="<c:out value='${badge.badgeNm}'/>"></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="글자색 선택"><span class="color-swatch" style="background-color:<c:out value='${badge.fontColor}'/>"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="fontColorArr" maxlength="7" value="<c:out value='${badge.fontColor}'/>"></div></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="배경색 선택"><span class="color-swatch" style="background-color:<c:out value='${badge.bgColor}'/>"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="bgColorArr" maxlength="7" value="<c:out value='${badge.bgColor}'/>"></div></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="테두리색 선택"><span class="color-swatch" style="background-color:<c:out value='${badge.borderColor}'/>"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="borderColorArr" maxlength="7" value="<c:out value='${badge.borderColor}'/>"></div></td><td><input type="text" class="input-text xl sort-ordr" name="sortOrdrArr" value="<c:out value='${badge.sortOrdr}'/>"></td><td><select class="select" name="useAtArr"><option value="Y" ${badge.useAt eq 'Y' ? 'selected' : ''}>사용</option><option value="N" ${badge.useAt eq 'N' ? 'selected' : ''}>미사용</option></select><input type="hidden" name="newAtArr" value="N"></td><td><span class="badge-preview"></span></td></tr>
</c:forEach>
<tr id="noData" ${not empty resultMap.badgeList ? 'style="display:none"' : ''}><td class="row-no-data" colspan="9">등록된 배지가 없습니다.</td></tr>
</tbody></table></div>
</section>
</form>
</div></div>
</main>
<script>
function fn_add_badge() {
$('#noData').hide();
$('#badgeBody').append('<tr data-new-at="Y"><td><label class="b-checkbox checkbox is-medium"><input type="checkbox" name="badgeChk"><span class="check"></span></label></td><td><input type="text" class="input-text xl badge-cd" name="badgeCdArr" maxlength="30"><input type="hidden" name="originalBadgeCdArr" value=""></td><td><input type="text" class="input-text xl badge-nm" name="badgeNmArr" maxlength="100"></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="글자색 선택"><span class="color-swatch" style="background-color:#000000"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="fontColorArr" maxlength="7" value="#000000"></div></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="배경색 선택"><span class="color-swatch" style="background-color:#FFFFFF"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="bgColorArr" maxlength="7" value="#FFFFFF"></div></td><td><div class="color-field"><button type="button" class="color-palette-toggle" aria-label="테두리색 선택"><span class="color-swatch" style="background-color:#000000"></span></button><div class="color-palette"></div><input type="text" class="input-text xl color-input" name="borderColorArr" maxlength="7" value="#000000"></div></td><td><input type="text" class="input-text xl sort-ordr" name="sortOrdrArr" value="0" maxlength="5"></td><td><select class="select" name="useAtArr"><option value="Y">사용</option><option value="N">미사용</option></select><input type="hidden" name="newAtArr" value="Y"></td><td><span class="badge-preview"></span></td></tr>');
fn_init_color_palettes();
fn_render_preview();
}
function fn_remove_badge() {
const selected = $('[name=badgeChk]:checked');
if (!selected.length) { alert('항목을 선택해 주세요.'); return; }
selected.each(function () { const row = $(this).closest('tr'); if (row.data('new-at') === 'Y') { row.remove(); } else { alert('기존 배지는 삭제할 수 없습니다. 사용여부를 미사용으로 변경해 주세요.'); } });
$('#badgeAll').prop('checked', false);
if ($('#badgeBody tr:not(#noData)').length === 0) { $('#noData').show(); }
}
function fn_render_preview() {
$('#badgeBody tr:not(#noData)').each(function () { const row = $(this); row.find('.badge-preview').text(row.find('.badge-nm').val() || '배지명').css({color: row.find('[name=fontColorArr]').val(), backgroundColor: row.find('[name=bgColorArr]').val(), borderColor: row.find('[name=borderColorArr]').val()}); });
}
function fn_normalize_colors() {
$('#badgeBody tr:not(#noData)').each(function () { const row = $(this); row.find('.color-input').each(function () { const input = $(this); if (!/^#[0-9A-Fa-f]{6}$/.test(input.val().trim())) { input.val(input.attr('name') === 'borderColorArr' ? (row.find('[name=bgColorArr]').val() || '#000000') : '#000000'); } }); });
}
function fn_validate_badges() {
let valid = true; const colorPattern = /^#[0-9A-Fa-f]{6}$/; const codePattern = /^[A-Za-z0-9_-]+$/; const codes = {};
$('#badgeBody tr:not(#noData)').each(function () { const row = $(this); const code = row.find('.badge-cd').val().trim(); const isNew = row.data('new-at') === 'Y'; if ((!code || (isNew && !codePattern.test(code))) || !row.find('.badge-nm').val().trim() || !colorPattern.test(row.find('[name=fontColorArr]').val().trim()) || !colorPattern.test(row.find('[name=bgColorArr]').val().trim()) || !colorPattern.test(row.find('[name=borderColorArr]').val().trim()) || !/^\d+$/.test(row.find('.sort-ordr').val().trim())) { valid = false; return false; } if (isNew && codes[code]) { valid = false; return false; } if (isNew) { codes[code] = true; } });
if (!valid) { alert('배지코드, 배지명, 색상(#RRGGBB), 노출순서를 확인해 주세요.'); } return valid;
}
function fn_save_badges() { if (!fn_validate_badges() || !confirm('상품 배지 설정을 저장하시겠습니까?')) { return; } $.ajax({ type: 'post', url: '<c:url value="/mngr/goods/badge/updateGoodsBadgeSetup"/>', data: $('#badgeForm').serialize(), success: function () { alert('저장되었습니다.'); location.reload(); } }); }
function fn_hsl_to_hex(h, s, l) { s /= 100; l /= 100; const c = (1 - Math.abs(2 * l - 1)) * s; const x = c * (1 - Math.abs((h / 60) % 2 - 1)); const m = l - c / 2; let r = 0, g = 0, b = 0; if (h < 60) { r = c; g = x; } else if (h < 120) { r = x; g = c; } else if (h < 180) { g = c; b = x; } else if (h < 240) { g = x; b = c; } else if (h < 300) { r = x; b = c; } else { r = c; b = x; } return '#' + [r, g, b].map(function (v) { return Math.round((v + m) * 255).toString(16).padStart(2, '0'); }).join('').toUpperCase(); }
const paletteColors = (function () { const colors = ['#000000','#202020','#404040','#606060','#808080','#A0A0A0','#C0C0C0','#D9D9D9','#EFEFEF','#FFFFFF']; const lightnesses = [92, 82, 72, 62, 52, 42, 32, 22]; for (let lightnessIndex = 0; lightnessIndex < lightnesses.length; lightnessIndex++) { for (let hue = 0; hue < 360; hue += 30) { colors.push(fn_hsl_to_hex(hue, 78, lightnesses[lightnessIndex])); } } return colors; })();
function fn_init_color_palettes() { $('.color-palette').each(function () { const palette = $(this); if (palette.children().length) { return; } $.each(paletteColors, function (_, color) { palette.append('<button type="button" class="color-choice" data-color="' + color + '" title="' + color + '" style="background-color:' + color + '"></button>'); }); }); }
$(document).on('input change', '.badge-nm, .color-input', function () { const input = $(this); if (input.hasClass('color-input') && /^#[0-9A-Fa-f]{6}$/.test(input.val())) { input.siblings('.color-palette-toggle').find('.color-swatch').css('background-color', input.val()); } fn_render_preview(); });
$(document).on('click', '.color-palette-toggle', function (e) { e.stopPropagation(); $('.color-palette').not($(this).siblings('.color-palette')).removeClass('is-open'); $(this).siblings('.color-palette').toggleClass('is-open'); });
$(document).on('click', '.color-choice', function () { const field = $(this).closest('.color-field'); field.find('.color-input').val($(this).data('color')).trigger('change'); field.find('.color-palette').removeClass('is-open'); });
$(document).on('click', function () { $('.color-palette').removeClass('is-open'); });
$('#badgeAll').on('change', function () { $('[name=badgeChk]').prop('checked', this.checked); });
$(function () { fn_init_color_palettes(); fn_normalize_colors(); $('.color-input').trigger('change'); fn_render_preview(); });
</script>
</body>
</html>

View File

@@ -569,6 +569,8 @@
* 등록 AJAX
******************************************************** */
const fn_regist = function () {
trimInputValue();
const url = '<c:url value="/mngr/goods/goodsmngr/insertGoodsInfo"/>';
const formData = new FormData();
@@ -1270,7 +1272,6 @@
formData.append('files', file); // 서버에서 파일을 받을 때 'files'라는 이름으로 전송
});
if (confirm('상품을 <spring:message code="confirm.common.insert"/>')) {
$.ajax({
type: 'post',
@@ -1417,7 +1418,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full"
<input class="input-text full input-trim"
type="text" name="optnNm1_normal" id="optnNm1_normal`+rowCount+`"
title="일반옵션명">
<!-- <button type="button" class="btn outline xsm optionDel01">삭제</button>-->
@@ -1450,11 +1451,11 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" title="일반옵션 값" id="optnVal1" name="optnVal1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션 값" id="optnVal1" name="optnVal1_normal">
</div>
</div>
</td>
<td><div class="optionApply__priceContainer"><input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
<td><div class="optionApply__priceContainer"><input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
`
+invntry_policy_qy+
`
@@ -1557,11 +1558,11 @@
`
+firstAdd+
`
<td><input class="input-text full" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
`
+invntry_policy_qy+
`
@@ -1599,7 +1600,7 @@
</div>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td>
<div class="compnbDscntAt_invntry">
<label class="b-checkbox checkbox" for="compnbDscntAt02_`+rowCount+`">
@@ -2532,14 +2533,14 @@
<th>상품명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" placeholder="상품명을 입력해 주세요.">
<input class="input-text full input-trim" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" placeholder="상품명을 입력해 주세요.">
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.BOGoodsVO.sopmalCd}"/>
</div>
</td>
<th>상품명(영문)<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" placeholder="상품명을 입력해 주세요.">
<input class="input-text full input-trim" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" placeholder="상품명을 입력해 주세요.">
</div>
</td>
</tr>
@@ -2547,13 +2548,13 @@
<th>대표설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" placeholder="상품 대표설명을 입력해 주세요.">
<input class="input-text full input-trim" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" placeholder="상품 대표설명을 입력해 주세요.">
</div>
</td>
<th>간략설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="간략설명" id="srtDc" name="srtDc" placeholder="간략한 상품 설명을 입력해 주세요.">
<input class="input-text full input-trim" type="text" title="간략설명" id="srtDc" name="srtDc" placeholder="간략한 상품 설명을 입력해 주세요.">
</div>
</td>
</tr>
@@ -2561,7 +2562,7 @@
<th>검색어</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="검색어" id="kwrd" name="kwrd" placeholder="검색어는 ,(콤마)로 구분됩니다.">
<input class="input-text full input-trim" type="text" title="검색어" id="kwrd" name="kwrd" placeholder="검색어는 ,(콤마)로 구분됩니다.">
</div>
</td>
<th>브랜드</th>
@@ -2584,7 +2585,7 @@
<th>리뷰 연동</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" placeholder="상품 번호를 입력해주세요.">
<input class="input-text full input-trim" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" placeholder="상품 번호를 입력해주세요.">
</div>
</td>
<th>리뷰 작성 가능 여부</th>
@@ -2661,7 +2662,7 @@
<input type="checkbox" value="${ iconList.cd }" name="iconCd">
<span class="check"></span>
<span class="control-label">
<span class="product-badge ${fn:toLowerCase(iconList.cd)}">${ iconList.cdNm }</span>
<span class="product-badge ${fn:toLowerCase(iconList.cd)}" style="color: ${iconList.fontColor} !important; background-color: ${iconList.bgColor} !important; border-color: ${iconList.borderColor} !important;">${ iconList.cdNm }</span>
</span>
</label>
</c:forEach>
@@ -2724,7 +2725,7 @@
<span class="control-label">사용자페이지 판매중지 문구 변경 -> </span>
</label>
</div>
<label for="selStpgeCustomWords"></label><input type="text" class="input-text" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<label for="selStpgeCustomWords"></label><input type="text" class="input-text input-trim" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<c:if test="${resultMap.goodsDtl.selStpgeCustomWordsAt ne 'Y'}"> disabled </c:if>
/>
<span class="parentheses">) </span>
@@ -2760,7 +2761,7 @@
<th>예약 상품 안내문구</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text"
<input class="input-text xl input-trim" type="text"
id="resveGoodsGuidanceWordsCn" name="resveGoodsGuidanceWordsCn"
title="예약 상품 안내문구">
</div>
@@ -2814,7 +2815,7 @@
<tr>
<th>노출 문구</th>
<td>
<input class="input-text xl" type="text" title="노출 문구" id="expsrSetupFwords" name="expsrSetupFwords" disabled>
<input class="input-text xl input-trim" type="text" title="노출 문구" id="expsrSetupFwords" name="expsrSetupFwords" disabled>
</td>
</tr>
</tbody>
@@ -2891,7 +2892,7 @@
<span class="ml-4">개의 수량을</span>
<input type="text" id="rltmQyDdctStdrDt" class="datepicker" title="이벤트가판매 가수량차감기준일시 설정" autocomplete="off" disabled >
<span class="ml-4">부터</span>
<input type="text" class="input-text sm right" title="이벤트가판매 가수량차감시간 설정" value="0" id="rltmQyDdctTme" disabled>
<input type="text" class="input-text sm right number" title="이벤트가판매 가수량차감시간 설정" value="0" id="rltmQyDdctTme" disabled>
<span class="ml-4">분마다</span>
<input class="input-text sm right number" id="rltmDdctQy" value="0" type="text" title="이벤트가판매 가수량차감수량 설정" disabled>
<span class="ml-4">개씩 차감</span>
@@ -3080,7 +3081,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0">
<input class="input-text full input-trim" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0">
<%-- <button type="button" class="btn outline xsm optionDel01">삭제</button>--%>
<button type="button" class="btn outline xsm optionVal98" >옵션값 추가</button>
</div>
@@ -3111,18 +3112,18 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" id="optnVal1" name="optnVal1_normal" title="옵션값">
<input class="input-text full input-trim" type="text" id="optnVal1" name="optnVal1_normal" title="옵션값">
</div>
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" title="상품코드" name="optnCd1_normal">
<input class="input-text full input-trim" type="text" title="상품코드" name="optnCd1_normal">
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" value="220600" title="HS Code" name="hscode_normal" maxlength="10">
<input class="input-text full input-trim" type="text" value="220600" title="HS Code" name="hscode_normal" maxlength="10">
</div>
</td>
<td>
@@ -3280,16 +3281,16 @@
<td>
</td>
<td>
<input class="input-text full" name ="optnNm1_invntry" type="text" title="재고옵션명1" placeholder="옵션명1">
<input class="input-text full input-trim" name ="optnNm1_invntry" type="text" title="재고옵션명1" placeholder="옵션명1">
</td>
<td>
<input class="input-text full" name ="optnNm2_invntry" type="text" title="재고옵선명2" placeholder="옵션명2">
<input class="input-text full input-trim" name ="optnNm2_invntry" type="text" title="재고옵선명2" placeholder="옵션명2">
</td>
<td>
<input class="input-text full" name="optnNm3_invntry" type="text" title="재고옵션명3" placeholder="옵션명3">
<input class="input-text full input-trim" name="optnNm3_invntry" type="text" title="재고옵션명3" placeholder="옵션명3">
</td>
<td>
<input class="input-text full" name="optnNm4_invntry" type="text" title="재고옵션명4" placeholder="옵션명4">
<input class="input-text full input-trim" name="optnNm4_invntry" type="text" title="재고옵션명4" placeholder="옵션명4">
</td>
<td>
@@ -3804,7 +3805,7 @@
<th>배송 안내 문구</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" title="배송안내문구">
<input class="input-text full input-trim" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" title="배송안내문구">
</div>
</td>
</tr>
@@ -4014,7 +4015,7 @@
//옵션명
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__inputList').append(`
<div class="optionApply__inputContainer" style="margin: 0">
<input class="input-text full `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
<input class="input-text full input-trim `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
</div>
`);
//노출여부
@@ -4038,14 +4039,14 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" value="" type="text" title="일반옵션값" name="optnVal1_normal">
<input class="input-text full input-trim" value="" type="text" title="일반옵션값" name="optnVal1_normal">
</div>
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
<input class="input-text full input-trim" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="0.0" type="text" title="실무게(KG)" name="realWt_normal">

View File

@@ -621,6 +621,7 @@
* 복사 등록 AJAX
******************************************************** */
const fn_copy_regist = function () {
trimInputValue();
const url = '<c:url value="/mngr/goods/goodsmngr/insertGoodsInfo"/>';
const formData = new FormData();
@@ -1454,7 +1455,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full"
<input class="input-text full input-trim"
type="text" name="optnNm1_normal" id="optnNm1_normal`+rowCount+`"
title="해당 인풋에 대한 설명">
<button type="button" class="btn outline xsm optionDel01">삭제</button>
@@ -1487,11 +1488,11 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" title="일반옵션 값" id="optnVal1_normal`+rowCount+`" name="optnVal1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션 값" id="optnVal1_normal`+rowCount+`" name="optnVal1_normal">
</div>
</div>
</td>
<td><div class="optionApply__priceContainer"><input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
<td><div class="optionApply__priceContainer"><input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
`
+invntry_policy_qy+
`
@@ -1595,11 +1596,11 @@
`
+firstAdd+
`
<td><input class="input-text full" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
`
+invntry_policy_qy+
`
@@ -1637,7 +1638,7 @@
</div>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td>
<div class="compnbDscntAt_invntry">
<label class="b-checkbox checkbox" for="compnbDscntAt02_`+rowCount+`">
@@ -2678,14 +2679,14 @@
<th>상품명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" value="${resultMap.goodsDtl.goodsNm}">
<input class="input-text full input-trim" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" value="${resultMap.goodsDtl.goodsNm}">
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.BOGoodsVO.sopmalCd}"/>
</div>
</td>
<th>상품명(영문)<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" value="${resultMap.goodsDtl.goodsNmEn}">
<input class="input-text full input-trim" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" value="${resultMap.goodsDtl.goodsNmEn}">
</div>
</td>
</tr>
@@ -2693,13 +2694,13 @@
<th>대표설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" value="${resultMap.goodsDtl.reprsntDc}" >
<input class="input-text full input-trim" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" value="${resultMap.goodsDtl.reprsntDc}" >
</div>
</td>
<th>간략설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="간략설명" id="srtDc" name="srtDc" value="${resultMap.goodsDtl.srtDc}">
<input class="input-text full input-trim" type="text" title="간략설명" id="srtDc" name="srtDc" value="${resultMap.goodsDtl.srtDc}">
</div>
</td>
</tr>
@@ -2707,7 +2708,7 @@
<th>검색어</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="검색어" id="kwrd" name="kwrd" value="${resultMap.goodsDtl.kwrd}">
<input class="input-text full input-trim" type="text" title="검색어" id="kwrd" name="kwrd" value="${resultMap.goodsDtl.kwrd}">
</div>
</td>
<th>브랜드</th>
@@ -2731,7 +2732,7 @@
<th>리뷰 연동</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" value="${resultMap.goodsDtl.rvwGroupNb}">
<input class="input-text full input-trim" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" value="${resultMap.goodsDtl.rvwGroupNb}">
</div>
</td>
<th>리뷰 작성 가능 여부</th>
@@ -2832,7 +2833,7 @@
<input type="checkbox" value="${iconList.cd}" name="iconCd" ${isChecked}/>
<span class="check"></span>
<span class="control-label">
<span class="product-badge ${fn:toLowerCase(iconList.cd)}">${iconList.cdNm}</span>
<span class="product-badge ${fn:toLowerCase(iconList.cd)}" style="color: ${iconList.fontColor} !important; background-color: ${iconList.bgColor} !important; border-color: ${iconList.borderColor} !important;">${iconList.cdNm}</span>
</span>
</label>
@@ -2898,7 +2899,7 @@
<span class="control-label">사용자페이지 판매중지 문구 변경 -> </span>
</label>
</div>
<label for="selStpgeCustomWords"></label><input type="text" class="input-text" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<label for="selStpgeCustomWords"></label><input type="text" class="input-text input-trim" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<c:if test="${resultMap.goodsDtl.selStpgeCustomWordsAt ne 'Y'}"> disabled </c:if>
/>
<span class="parentheses">) </span>
@@ -2935,7 +2936,7 @@
<th>예약 상품 안내문구</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text"
<input class="input-text xl input-trim" type="text"
id="resveGoodsGuidanceWordsCn"
name="resveGoodsGuidanceWordsCn"
value="${resultMap.goodsDtl.resveGoodsGuidanceWordsCn}"
@@ -3001,7 +3002,7 @@
<tr>
<th>노출 문구</th>
<td>
<input class="input-text xl" type="text"
<input class="input-text xl input-trim" type="text"
title="노출 문구" id="expsrSetupFwords"
name="expsrSetupFwords"
<c:choose>
@@ -3092,7 +3093,7 @@
<span class="ml-4">개의 수량을</span>
<input type="text" id="rltmQyDdctStdrDt" value="${fn:split(resultMap.goodsDtl.rltmQyDdctStdrDt,'T')[0]}" class="datepicker" title="이벤트가판매 가수량차감기준일시 설정" autocomplete="off" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">부터</span>
<input type="text" class="input-text sm right" title="이벤트가판매 가수량차감시간 설정" value="${resultMap.goodsDtl.rltmQyDdctTme}" id="rltmQyDdctTme" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<input type="text" class="input-text sm right number" title="이벤트가판매 가수량차감시간 설정" value="${resultMap.goodsDtl.rltmQyDdctTme}" id="rltmQyDdctTme" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">분마다</span>
<input class="input-text sm right number" id="rltmDdctQy" value="${resultMap.goodsDtl.rltmDdctQy}" type="text" title="이벤트가판매 가수량차감수량 설정" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">개씩 차감</span>
@@ -3313,7 +3314,7 @@
<div class="optionApply__inputContainer">
<c:choose>
<c:when test="${optnNm01_status.index eq '0'}">
<input class="input-text full" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnNm01_status.index}">
<%-- <button type="button" class="btn outline xsm optionDel02">삭제</button>--%>
<button type="button" class="btn outline xsm optionVal98">옵션값 추가</button>
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
@@ -3323,7 +3324,7 @@
</c:forEach>
</c:when>
<c:otherwise>
<input class="input-text full" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
<c:if test="${goodsOptnInnb01_status.index ne '0' and optnNm01_status.index eq goodsOptnInnb01_status.index }">
<input type="hidden" name="goodsOptnInnb_normal" value="${goodsOptnInnb01}"/>
@@ -3337,7 +3338,7 @@
<div class="optionApply__inputContainer">
<c:choose>
<c:when test="${optnNm01_status.index eq '0'}">
<input class="input-text full" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<button type="button" class="btn outline xsm optionDel02">삭제</button>
<button type="button" class="btn outline xsm optionVal98">옵션값 추가</button>
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
@@ -3347,7 +3348,7 @@
</c:forEach>
</c:when>
<c:otherwise>
<input class="input-text full" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
<c:if test="${goodsOptnInnb01_status.index ne '0' and optnNm01_status.index eq goodsOptnInnb01_status.index }">
<input type="hidden" name="goodsOptnInnb_normal" value="${goodsOptnInnb01}"/>
@@ -3390,7 +3391,7 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" id="optnVal1_normal${optnTy01idx.index}${optnVal011_status.index}" name="optnVal1_normal" title="옵션값" value="${optnVal011}">
<input class="input-text full input-trim" type="text" id="optnVal1_normal${optnTy01idx.index}${optnVal011_status.index}" name="optnVal1_normal" title="옵션값" value="${optnVal011}">
</div>
</c:forEach>
</div>
@@ -3398,14 +3399,14 @@
<td>
<div class="optionApply__priceContainer">
<c:forEach var="optnCd011" items="${fn:split(optnList01.optnCd1, '|')}">
<input class="input-text full" type="text" title="상품코드" name="optnCd1_normal" value="${optnCd011}" >
<input class="input-text full input-trim" type="text" title="상품코드" name="optnCd1_normal" value="${optnCd011}" >
</c:forEach>
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<c:forEach var="hscode011" items="${fn:split(optnList01.hscode, '|')}">
<input class="input-text full" type="text" title="HS Code" name="hscode_normal" value="${hscode011}" maxlength="10" >
<input class="input-text full input-trim" type="text" title="HS Code" name="hscode_normal" value="${hscode011}" maxlength="10" >
</c:forEach>
</div>
</td>
@@ -3536,7 +3537,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0" value="">
<input class="input-text full input-trim" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0" value="">
<button type="button" class="btn outline xsm optionDel01">삭제</button>
<button type="button" class="btn outline xsm optionVal98" >옵션값 추가</button>
</div>
@@ -3566,19 +3567,19 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" id="optnVal1_normal0" name="optnVal1_normal" title="옵션값" value="">
<input class="input-text full input-trim" type="text" id="optnVal1_normal0" name="optnVal1_normal" title="옵션값" value="">
<input type="hidden" name="goodsOptnInnb_normal" value=""/>
</div>
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" title="상품코드" name="optnCd1_normal" value="" >
<input class="input-text full input-trim" type="text" title="상품코드" name="optnCd1_normal" value="" >
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" title="HS Code" name="hscode_normal" value="" maxlength="10">
<input class="input-text full input-trim" type="text" title="HS Code" name="hscode_normal" value="" maxlength="10">
</div>
</td>
<td>
@@ -3723,16 +3724,16 @@
<td>
</td>
<td>
<input class="input-text full" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="${optnList02.optnNm1}">
<input class="input-text full input-trim" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="${optnList02.optnNm1}">
</td>
<td>
<input class="input-text full" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="${optnList02.optnNm2}">
<input class="input-text full input-trim" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="${optnList02.optnNm2}">
</td>
<td>
<input class="input-text full" name="optnNm3_invntry" type="text" title="재고옵션명3" value="${optnList02.optnNm3}">
<input class="input-text full input-trim" name="optnNm3_invntry" type="text" title="재고옵션명3" value="${optnList02.optnNm3}">
</td>
<td>
<input class="input-text full" name="optnNm4_invntry" type="text" title="재고옵션명4" value="${optnList02.optnNm4}">
<input class="input-text full input-trim" name="optnNm4_invntry" type="text" title="재고옵션명4" value="${optnList02.optnNm4}">
</td>
<td>
@@ -3769,17 +3770,17 @@
<td>
</td>
<td>
<input class="input-text full" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="">
<input class="input-text full input-trim" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="">
<input type="hidden" name="goodsOptnInnb_invntry" value="" />
</td>
<td>
<input class="input-text full" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="">
<input class="input-text full input-trim" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="">
</td>
<td>
<input class="input-text full" name="optnNm3_invntry" type="text" title="재고옵션명3" value="">
<input class="input-text full input-trim" name="optnNm3_invntry" type="text" title="재고옵션명3" value="">
</td>
<td>
<input class="input-text full" name="optnNm4_invntry" type="text" title="재고옵션명4" value="">
<input class="input-text full input-trim" name="optnNm4_invntry" type="text" title="재고옵션명4" value="">
</td>
<td>
@@ -3827,13 +3828,13 @@
<label for="stdrDvAt02-${opt02Status.index}"></label>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 값1" name="optnVal1_invntry" value="${goodsOpt02Val.optnVal1}" />
<td><input class="input-text full input-trim" type="text" title="재고옵션 값1" name="optnVal1_invntry" value="${goodsOpt02Val.optnVal1}" />
<input type="hidden" name="goodsOptnInnb_invntry" value="${goodsOpt02Val.goodsOptnInnb}" />
</td>
<td><input class="input-text full" type="text" title="재고옵션 값2" name="optnVal2_invntry" value="${goodsOpt02Val.optnVal2}"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값3" name="optnVal3_invntry" value="${goodsOpt02Val.optnVal3}" /></td>
<td><input class="input-text full" type="text" title="재고옵션 값4" name="optnVal4_invntry" value="${goodsOpt02Val.optnVal4} "/></td>
<td><input class="input-text full" type="text" title="재고옵션 코드" name="optnCd1_invntry" value="${goodsOpt02Val.optnCd1}" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값2" name="optnVal2_invntry" value="${goodsOpt02Val.optnVal2}"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값3" name="optnVal3_invntry" value="${goodsOpt02Val.optnVal3}" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값4" name="optnVal4_invntry" value="${goodsOpt02Val.optnVal4} "/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 코드" name="optnCd1_invntry" value="${goodsOpt02Val.optnCd1}" /></td>
<td><input class="input-text full number right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.invntryQy}" pattern="#,###"/>" title="재고옵션 재고" name="invntryQy_invntry" /></td>
<td><input class="input-text full number right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.cnsmrpric}" pattern="#,###"/>" title="재고옵션 소비자가" name="cnsmrpric_invntry"/></td>
<td><input class="input-text full number right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.slepric}" pattern="#,###"/>" title="재고옵션 판매가" name="slepric_invntry"/></td>
@@ -3855,7 +3856,7 @@
</div>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 정보" name="optnInfo_invntry" value="${goodsOpt02Val.optnInfo}"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 정보" name="optnInfo_invntry" value="${goodsOpt02Val.optnInfo}"/></td>
<td>
<div class="compnbDscntAt_invntryList" style="height: 100%; display: flex; flex-direction: column; justify-content: space-around;">
<div class="compnbDscntAt_invntry">
@@ -4526,7 +4527,7 @@
<th>배송 안내 문구</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" value="${ resultMap.goodsDtl.dlvyGuidanceWordsCn}" title="배송안내문구">
<input class="input-text full input-trim" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" value="${ resultMap.goodsDtl.dlvyGuidanceWordsCn}" title="배송안내문구">
</div>
</td>
</tr>
@@ -5010,7 +5011,7 @@
//옵션명
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__inputList').append(`
<div class="optionApply__inputContainer" style="margin: 0">
<input class="input-text full `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
<input class="input-text full input-trim `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
</div>
`);
//노출여부
@@ -5035,14 +5036,14 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" value="" type="text" title="일반옵션값" name="optnVal1_normal">
<input class="input-text full input-trim" value="" type="text" title="일반옵션값" name="optnVal1_normal">
</div>
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
<input class="input-text full input-trim" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="0.0" type="text" title="실무게(KG)" name="realWt_normal">

View File

@@ -749,7 +749,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full"
<input class="input-text full input-trim"
type="text" name="optnNm1_normal" id="optnNm1_normal`+rowCount+`"
title="해당 인풋에 대한 설명">
<button type="button" class="btn outline xsm optionDel01">삭제</button>
@@ -782,11 +782,11 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" title="일반옵션 값" id="optnVal1_normal`+rowCount+`" name="optnVal1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션 값" id="optnVal1_normal`+rowCount+`" name="optnVal1_normal">
</div>
</div>
</td>
<td><div class="optionApply__priceContainer"><input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
<td><div class="optionApply__priceContainer"><input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal"></td></div>
`
+invntry_policy_qy+
`
@@ -890,11 +890,11 @@
`
+firstAdd+
`
<td><input class="input-text full" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값1" name="optnVal1_invntry" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값2" name="optnVal2_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값3" name="optnVal3_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값4" name="optnVal4_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 코드" name="optnCd1_invntry"/></td>
`
+invntry_policy_qy+
`
@@ -933,7 +933,7 @@
</div>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 정보" name="optnInfo_invntry"/></td>
<td>
<div class="compnbDscntAt_invntry">
<label class="b-checkbox checkbox" for="compnbDscntAt02_`+rowCount+`">
@@ -1440,6 +1440,7 @@
//구매 대상자 제한 정보 저장
const fn_save_purchase_limmit = function () {
trimInputValue();
if ($('#purchase_limmit_hiddenForm') != null) {
$('#purchase_limmit_hiddenForm').remove();
@@ -1763,7 +1764,7 @@
******************************************************** */
//카테고리 수정
$(document).on('click', '#btn_update_category', function () {
trimInputValue();
if ($('#hiddenForm_categry') != null) {
$('#hiddenForm_categry').remove();
@@ -1804,6 +1805,7 @@
//상품 기본정보 수정
$(document).on('click', '#btn_update_BscInfo', function (event) {
event.preventDefault()
trimInputValue();
if ($('#hiddenForm_bscInfo') != null) {
$('#hiddenForm_bscInfo').remove();
@@ -1936,6 +1938,7 @@
// 상품 판매정보 수정
$(document).on('click', '#btn_update_SelInfo', function () {
trimInputValue();
if ($('#hiddenForm_selInfo') != null) {
$('#hiddenForm_selInfo').remove();
@@ -2214,6 +2217,7 @@
//상품 옵션수정
$(document).on('click', '#btn_update_opt', function (event) {
event.preventDefault()
trimInputValue();
if ($('#hiddenForm_opt') != null) {
$('#hiddenForm_opt').remove();
@@ -2645,6 +2649,8 @@
//상품 이미지 수정
$(document).on('click', '#btn_update_img', function (event) {
event.preventDefault()
trimInputValue();
if($('#hiddenForm_img') != null) {
$('#hiddenForm_img').remove();
}
@@ -2717,6 +2723,8 @@
//상품 기타정보 수정
$(document).on('click', '[name="btn_update_EtcInfo"]', function (event) {
event.preventDefault()
trimInputValue();
if($('#hiddenForm_etcInfo') != null) {
$('#hiddenForm_etcInfo').remove();
}
@@ -2841,7 +2849,7 @@
//관련상품 수정
$(document).on('click','#btn_update_relateGoods', function (event) {
event.preventDefault()
trimInputValue();
if($('#hiddenForm_relateGoods') != null) {
$('#hiddenForm_relateGoods').remove();
@@ -3129,14 +3137,14 @@
<th>상품명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" value="${resultMap.goodsDtl.goodsNm}">
<input class="input-text full input-trim" type="text" title="상품명" id="goodsNm" name="goodsNm" maxlength="35" value="${resultMap.goodsDtl.goodsNm}">
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.BOGoodsVO.sopmalCd}"/>
</div>
</td>
<th>상품명(영문)<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" value="${resultMap.goodsDtl.goodsNmEn}">
<input class="input-text full input-trim" type="text" title="상품명(영문)" id="goodsNmEn" name="goodsNmEn" maxlength="35" value="${resultMap.goodsDtl.goodsNmEn}">
</div>
</td>
</tr>
@@ -3144,13 +3152,13 @@
<th>대표설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" value="${resultMap.goodsDtl.reprsntDc}" >
<input class="input-text full input-trim" type="text" title="대표설명" id="reprsntDc" name="reprsntDc" value="${resultMap.goodsDtl.reprsntDc}" >
</div>
</td>
<th>간략설명</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="간략설명" id="srtDc" name="srtDc" value="${resultMap.goodsDtl.srtDc}">
<input class="input-text full input-trim" type="text" title="간략설명" id="srtDc" name="srtDc" value="${resultMap.goodsDtl.srtDc}">
</div>
</td>
</tr>
@@ -3158,7 +3166,7 @@
<th>검색어</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="검색어" id="kwrd" name="kwrd" value="${resultMap.goodsDtl.kwrd}">
<input class="input-text full input-trim" type="text" title="검색어" id="kwrd" name="kwrd" value="${resultMap.goodsDtl.kwrd}">
</div>
</td>
<th>브랜드</th>
@@ -3182,7 +3190,7 @@
<th>리뷰 연동</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" value="${resultMap.goodsDtl.rvwGroupNb}">
<input class="input-text full input-trim" type="text" title="리뷰 연동" id="rvwGroupNb" name="rvwGroupNb" value="${resultMap.goodsDtl.rvwGroupNb}">
</div>
</td>
<th>리뷰 작성 가능 여부</th>
@@ -3283,7 +3291,7 @@
<input type="checkbox" value="${iconList.cd}" name="iconCd" ${isChecked}/>
<span class="check"></span>
<span class="control-label">
<span class="product-badge ${fn:toLowerCase(iconList.cd)}">${iconList.cdNm}</span>
<span class="product-badge ${fn:toLowerCase(iconList.cd)}" style="color: ${iconList.fontColor} !important; background-color: ${iconList.bgColor} !important; border-color: ${iconList.borderColor} !important;">${iconList.cdNm}</span>
</span>
</label>
@@ -3350,7 +3358,7 @@
<span class="control-label">사용자페이지 판매중지 문구 변경 -> </span>
</label>
</div>
<label for="selStpgeCustomWords"></label><input type="text" class="input-text" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<label for="selStpgeCustomWords"></label><input type="text" class="input-text input-trim" id="selStpgeCustomWords" name="selStpgeCustomWords" value="${resultMap.goodsDtl.selStpgeCustomWords}"
<c:if test="${resultMap.goodsDtl.selStpgeCustomWordsAt ne 'Y'}"> disabled </c:if>
/>
<span class="parentheses">) </span>
@@ -3387,7 +3395,7 @@
<th>예약 상품 안내문구</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text"
<input class="input-text xl input-trim" type="text"
id="resveGoodsGuidanceWordsCn"
name="resveGoodsGuidanceWordsCn"
value="${resultMap.goodsDtl.resveGoodsGuidanceWordsCn}"
@@ -3453,7 +3461,7 @@
<tr>
<th>노출 문구</th>
<td>
<input class="input-text xl" type="text"
<input class="input-text xl input-trim" type="text"
title="노출 문구" id="expsrSetupFwords"
name="expsrSetupFwords"
<c:choose>
@@ -3544,7 +3552,7 @@
<span class="ml-4">개의 수량을</span>
<input type="text" id="rltmQyDdctStdrDt" value="${fn:split(resultMap.goodsDtl.rltmQyDdctStdrDt,'T')[0]}" class="datepicker" title="이벤트가판매 가수량차감기준일시 설정" autocomplete="off" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">부터</span>
<input type="text" class="input-text sm right" title="이벤트가판매 가수량차감시간 설정" value="${resultMap.goodsDtl.rltmQyDdctTme}" id="rltmQyDdctTme" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<input type="text" class="input-text sm right number" title="이벤트가판매 가수량차감시간 설정" value="${resultMap.goodsDtl.rltmQyDdctTme}" id="rltmQyDdctTme" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">분마다</span>
<input class="input-text sm right number" id="rltmDdctQy" value="${resultMap.goodsDtl.rltmDdctQy}" type="text" title="이벤트가판매 가수량차감수량 설정" <c:if test="${resultMap.goodsDtl.rltmQyBannerDvCd ne '03'}">disabled</c:if> >
<span class="ml-4">개씩 차감</span>
@@ -3767,7 +3775,7 @@
<div class="optionApply__inputContainer">
<c:choose>
<c:when test="${optnNm01_status.index eq '0'}">
<input class="input-text full" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnNm01_status.index}">
<%-- <button type="button" class="btn outline xsm optionDel02">삭제</button>--%>
<button type="button" class="btn outline xsm optionVal98">옵션값 추가</button>
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
@@ -3777,7 +3785,7 @@
</c:forEach>
</c:when>
<c:otherwise>
<input class="input-text full" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
<c:if test="${goodsOptnInnb01_status.index ne '0' and optnNm01_status.index eq goodsOptnInnb01_status.index }">
<input type="hidden" name="goodsOptnInnb_normal" value="${goodsOptnInnb01}"/>
@@ -3791,7 +3799,7 @@
<div class="optionApply__inputContainer">
<c:choose>
<c:when test="${optnNm01_status.index eq '0'}">
<input class="input-text full" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="text" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<button type="button" class="btn outline xsm optionDel02">삭제</button>
<button type="button" class="btn outline xsm optionVal98">옵션값 추가</button>
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
@@ -3801,7 +3809,7 @@
</c:forEach>
</c:when>
<c:otherwise>
<input class="input-text full" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<input class="input-text full input-trim" value="${optnNm011}" type="hidden" title="일반옵션명" name="optnNm1_normal" id="optnNm1_normal${optnTy01idx.index}${optnNm01_status.index}">
<c:forEach var="goodsOptnInnb01" items="${fn:split(optnList01.goodsOptnInnb, '|')}" varStatus="goodsOptnInnb01_status">
<c:if test="${goodsOptnInnb01_status.index ne '0' and optnNm01_status.index eq goodsOptnInnb01_status.index }">
<input type="hidden" name="goodsOptnInnb_normal" value="${goodsOptnInnb01}"/>
@@ -3844,7 +3852,7 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" id="optnVal1_normal${optnTy01idx.index}${optnVal011_status.index}" name="optnVal1_normal" title="옵션값" value="${optnVal011}">
<input class="input-text full input-trim" type="text" id="optnVal1_normal${optnTy01idx.index}${optnVal011_status.index}" name="optnVal1_normal" title="옵션값" value="${optnVal011}">
</div>
</c:forEach>
</div>
@@ -3852,14 +3860,14 @@
<td>
<div class="optionApply__priceContainer">
<c:forEach var="optnCd011" items="${fn:split(optnList01.optnCd1, '|')}">
<input class="input-text full" type="text" title="일반옵션 상품코드" name="optnCd1_normal" value="${optnCd011}" >
<input class="input-text full input-trim" type="text" title="일반옵션 상품코드" name="optnCd1_normal" value="${optnCd011}" >
</c:forEach>
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<c:forEach var="hscode011" items="${fn:split(optnList01.hscode, '|')}">
<input class="input-text full" type="text" title="HS Code" name="hscode_normal" value="${hscode011}" maxlength="10" >
<input class="input-text full input-trim" type="text" title="HS Code" name="hscode_normal" value="${hscode011}" maxlength="10" >
</c:forEach>
</div>
</td>
@@ -3997,7 +4005,7 @@
<td>
<div class="optionApply__inputList">
<div class="optionApply__inputContainer">
<input class="input-text full" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0" value="">
<input class="input-text full input-trim" type="text" name="optnNm1_normal" title="옵션명" id="optnNm1_normal0" value="">
<button type="button" class="btn outline xsm optionDel01">삭제</button>
<button type="button" class="btn outline xsm optionVal98" >옵션값 추가</button>
</div>
@@ -4028,19 +4036,19 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" type="text" id="optnVal1_normal0" name="optnVal1_normal" title="옵션값" value="">
<input class="input-text full input-trim" type="text" id="optnVal1_normal0" name="optnVal1_normal" title="옵션값" value="">
<input type="hidden" name="goodsOptnInnb_normal" value=""/>
</div>
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" title="상품코드" name="optnCd1_normal" value="" >
<input class="input-text full input-trim" type="text" title="상품코드" name="optnCd1_normal" value="" >
</div>
</td>
<td>
<div class="optionApply__priceContainer">
<input class="input-text full" type="text" title="HS Code" name="hscode_normal" value="" maxlength="10" >
<input class="input-text full input-trim" type="text" title="HS Code" name="hscode_normal" value="" maxlength="10" >
</div>
</td>
<td>
@@ -4187,16 +4195,16 @@
<td>
</td>
<td>
<input class="input-text full" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="${optnList02.optnNm1}">
<input class="input-text full input-trim" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="${optnList02.optnNm1}">
</td>
<td>
<input class="input-text full" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="${optnList02.optnNm2}">
<input class="input-text full input-trim" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="${optnList02.optnNm2}">
</td>
<td>
<input class="input-text full" name="optnNm3_invntry" type="text" title="재고옵션명3" value="${optnList02.optnNm3}">
<input class="input-text full input-trim" name="optnNm3_invntry" type="text" title="재고옵션명3" value="${optnList02.optnNm3}">
</td>
<td>
<input class="input-text full" name="optnNm4_invntry" type="text" title="재고옵션명4" value="${optnList02.optnNm4}">
<input class="input-text full input-trim" name="optnNm4_invntry" type="text" title="재고옵션명4" value="${optnList02.optnNm4}">
</td>
<td>
</td>
@@ -4234,17 +4242,17 @@
<td>
</td>
<td>
<input class="input-text full" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="">
<input class="input-text full input-trim" name ="optnNm1_invntry" type="text" title="재고옵션명1" value="">
<input type="hidden" name="goodsOptnInnb_invntry" value="" />
</td>
<td>
<input class="input-text full" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="">
<input class="input-text full input-trim" name ="optnNm2_invntry" type="text" title="재고옵선명2" value="">
</td>
<td>
<input class="input-text full" name="optnNm3_invntry" type="text" title="재고옵션명3" value="">
<input class="input-text full input-trim" name="optnNm3_invntry" type="text" title="재고옵션명3" value="">
</td>
<td>
<input class="input-text full" name="optnNm4_invntry" type="text" title="재고옵션명4" value="">
<input class="input-text full input-trim" name="optnNm4_invntry" type="text" title="재고옵션명4" value="">
</td>
<td>
@@ -4294,13 +4302,13 @@
<label for="stdrDvAt02-${opt02Status.index}"></label>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 값1" name="optnVal1_invntry" value="${goodsOpt02Val.optnVal1}" />
<td><input class="input-text full input-trim" type="text" title="재고옵션 값1" name="optnVal1_invntry" value="${goodsOpt02Val.optnVal1}" />
<input type="hidden" name="goodsOptnInnb_invntry" value="${goodsOpt02Val.goodsOptnInnb}" />
</td>
<td><input class="input-text full" type="text" title="재고옵션 값2" name="optnVal2_invntry" value="${goodsOpt02Val.optnVal2}"/></td>
<td><input class="input-text full" type="text" title="재고옵션 값3" name="optnVal3_invntry" value="${goodsOpt02Val.optnVal3}" /></td>
<td><input class="input-text full" type="text" title="재고옵션 값4" name="optnVal4_invntry" value="${goodsOpt02Val.optnVal4} "/></td>
<td><input class="input-text full" type="text" title="재고옵션 코드" name="optnCd1_invntry" value="${goodsOpt02Val.optnCd1}" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값2" name="optnVal2_invntry" value="${goodsOpt02Val.optnVal2}"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값3" name="optnVal3_invntry" value="${goodsOpt02Val.optnVal3}" /></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 값4" name="optnVal4_invntry" value="${goodsOpt02Val.optnVal4} "/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 코드" name="optnCd1_invntry" value="${goodsOpt02Val.optnCd1}" /></td>
<td><input class="input-text full number right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.invntryQy}" pattern="#,###"/>" title="재고옵션 재고" name="invntryQy_invntry" <c:if test="${resultMap.goodsDtl.invntryPolicyCd eq '02'}"> disabled </c:if> /></td>
<td><input class="input-text full right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.usefulInvntry}" pattern="#,###"/>" title="재고옵션 가용재고" disabled /></td>
<td><input class="input-text full number right" type="text" value="<fmt:formatNumber value="${goodsOpt02Val.cnsmrpric}" pattern="#,###"/>" title="재고옵션 소비자가" name="cnsmrpric_invntry"/></td>
@@ -4323,7 +4331,7 @@
</div>
</div>
</td>
<td><input class="input-text full" type="text" title="재고옵션 정보" name="optnInfo_invntry" value="${goodsOpt02Val.optnInfo}"/></td>
<td><input class="input-text full input-trim" type="text" title="재고옵션 정보" name="optnInfo_invntry" value="${goodsOpt02Val.optnInfo}"/></td>
<td>
<div class="compnbDscntAt_invntryList" style="height: 100%; display: flex; flex-direction: column; justify-content: space-around;">
<div class="compnbDscntAt_invntry">
@@ -5005,7 +5013,7 @@
<th>배송 안내 문구</th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" value="${ resultMap.goodsDtl.dlvyGuidanceWordsCn}" title="배송안내문구">
<input class="input-text full input-trim" type="text" id="dlvyGuidanceWordsCn" name="dlvyGuidanceWordsCn" value="${ resultMap.goodsDtl.dlvyGuidanceWordsCn}" title="배송안내문구">
</div>
</td>
</tr>
@@ -5523,7 +5531,7 @@
//옵션명
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__inputList').append(`
<div class="optionApply__inputContainer" style="margin: 0">
<input class="input-text full `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
<input class="input-text full input-trim `+optnNm.attr('id')+`" type="hidden" value="`+optnNmVal+`" title="일반옵션명" name="optnNm1_normal">
</div>
`);
//노출여부
@@ -5548,14 +5556,14 @@
<button type="button" class="optionApply__moveBtn optionMove01 up"><span class="visually-hidden">위로</span></button>
<button type="button" class="optionApply__moveBtn optionMove01 down"><span class="visually-hidden">아래로</span></button>
</div>
<input class="input-text full" value="" type="text" title="일반옵션값" name="optnVal1_normal">
<input class="input-text full input-trim" value="" type="text" title="일반옵션값" name="optnVal1_normal">
</div>
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" type="text" title="일반옵션코드" name="optnCd1_normal">
<input class="input-text full input-trim" type="text" title="일반옵션코드" name="optnCd1_normal">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
<input class="input-text full input-trim" value="220600" type="text" title="HS Code" name="hscode_normal" maxlength="10">
`);
$closestTr.find('td:eq(' + tdCount++ + ') .optionApply__priceContainer').append(`
<input class="input-text full" value="0.0" type="text" title="실무게(KG)" name="realWt_normal">

View File

@@ -133,6 +133,17 @@
});
}
/* ********************************************************
* xml 임시
******************************************************** */
const fn_update_xml = function () {
const url = '<c:url value="/mngr/goods/goodsmngr/selectGoodsRegistForm"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
};
/* ********************************************************
* 등록폼 이동
******************************************************** */
@@ -441,6 +452,7 @@
<div class="page-title">
<h2 class="page-title__title">상품 목록</h2>
<div class="page-title__btn-container">
<button onclick="fn_update_xml()" class="btn primary">XML 업데이트(임시)</button>
<button onclick="fn_move_regpage()" class="btn primary">상품 <spring:message code="button.insert"/></button>
</div>
</div>

View File

@@ -23,7 +23,7 @@
fn_select_list(pageIndex, pageUnit);
//지정일
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDㄴt');
fn_set_date('srchStrtSndngDt','srchEndSndngDt','srchEndSndngDt');
//날짜 선택 버튼 선택 처리
$(".dateRange-btnContainer").on("click", ".dateRange-btn", function(){

View File

@@ -408,7 +408,7 @@
// 네이버페이 주문 제어 제한
let hasSmrt = false;
$(smrtShopngOrdrnbs).each(function() {
if($(this).val() != 'undefined' && $.trim($(this).val()) != '') {
if($(this).val() != 'undefined' && $(this).val() != 'null' && $.trim($(this).val()) != '') {
hasSmrt = true;
return;
}
@@ -446,7 +446,8 @@
* 열 헤더, 푸터 > 프린트 버튼 클릭 이벤트
*/
$(document).on('click', '[class*="btn-order-print"]', function() {
const tr = ($(this).attr('class').split(' ')[0]).replace('btn-order-print-', 'order-sttus-cd-');
fn_select_dwld_purch_ordr_list();
/*const tr = ($(this).attr('class').split(' ')[0]).replace('btn-order-print-', 'order-sttus-cd-');
const rowCheckboxs = $('.' + tr).closest('#orderList').find('.' + tr + ' input[name="ordrInnb"]:checked');
if (rowCheckboxs.length === 0) {
@@ -461,27 +462,7 @@
ordrInnbs.push($(item).val());
});
fn_go_ordr_dtstmn_dwld_popup(ordrInnbs)
});
/*
* 열 헤더 > 엑셀 발주서 다운로드 버튼 클릭 이벤트
*/
$(document).on('click', '.excel-dwld-purch-order', function() {
const srchStartDate = $('#srchStartDate').val();
const srchEndDate = $('#srchEndDate').val();
const srchOrdrSttusCd = '35';
var form = $('#condForm').clone().prop("id", "excelCondForm")
$(form).append($('<input/>', {type:'hidden', name:'srchOrdrSttusCd', value:srchOrdrSttusCd}));
$(form).attr('method', 'post');
$(form).attr('action', '<c:url value="/mngr/ordr/ordrmngr/selectExcelPoDwldListInqire"/>');
$(form).appendTo('body');
$(form).submit();
$(form).remove();
fn_go_ordr_dtstmn_dwld_popup(ordrInnbs)*/
});
/*
@@ -790,12 +771,12 @@
header += ' </div>';
if ('15' === data.ordrSttusCd) {
header += ' <button type="button" id="ordrSttus25" class="btn-' + currTr + ' btn confirm xsm">결제확인1</button>';
header += ' <button type="button" id="ordrSttus95" class="btn-' + currTr + ' btn gray xsm">주문무효1</button>';
header += ' <button type="button" id="ordrSttus25" class="btn-' + currTr + ' btn confirm xsm">결제확인</button>';
header += ' <button type="button" id="ordrSttus95" class="btn-' + currTr + ' btn gray xsm">주문무효</button>';
}
if ('25' === data.ordrSttusCd) {
header += ' <button type="button" id="ordrSttus35" class="btn-' + currTr + ' btn prep xsm">상품준비1</button>';
header += ' <button type="button" id="ordrSttus35" class="btn-' + currTr + ' btn prep xsm">상품준비</button>';
/* header += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */
}
@@ -806,7 +787,7 @@
header += ' <button type="button" class="btn-order-print-' + data.ordrSttusCd + ' btn outline xsm fs-13"><i class="icon icon_print"></i>프린트</button>';
if ('35' === data.ordrSttusCd) {
header += ' <button type="button" class="btn sm outline fs-13 excel-dwld-purch-order">';
header += ' <button type="button" onclick="fn_select_dwld_purch_ordr_list()" class="btn sm outline fs-13">';
header += ' <i class="icon icon_excel"></i>발주서 다운로드';
header += ' </button>';
}
@@ -834,7 +815,7 @@
if ('25' == data.ordrSttusCd) {
header += ' <button type="button" id="ordrSttus15" class="btn-' + currTr + ' btn sm outline fs-13">';
header += ' <i class="icon icon_reset"></i>\'주문접수\' 상태로 되돌리기1';
header += ' <i class="icon icon_reset"></i>\'주문접수\' 상태로 되돌리기';
header += ' </button>';
}
@@ -1389,12 +1370,12 @@
footer += ' </div>';
if ('15' === prevOrderSttusCd) {
footer += ' <button type="button" id="ordrSttus25" class="btn-' + prevTrClass + ' btn confirm xsm">결제확인2</button>';
footer += ' <button type="button" id="ordrSttus95" class="btn-' + prevTrClass + ' btn gray xsm">주문무효2</button>';
footer += ' <button type="button" id="ordrSttus25" class="btn-' + prevTrClass + ' btn confirm xsm">결제확인</button>';
footer += ' <button type="button" id="ordrSttus95" class="btn-' + prevTrClass + ' btn gray xsm">주문무효</button>';
}
if ('25' === prevOrderSttusCd) {
footer += ' <button type="button" id="ordrSttus35" class="btn-' + prevTrClass + ' btn prep xsm">상품준비2</button>';
footer += ' <button type="button" id="ordrSttus35" class="btn-' + prevTrClass + ' btn prep xsm">상품준비</button>';
/* footer += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */
}
@@ -1404,7 +1385,7 @@
}
footer += ' <button type="button" class="btn-order-print-' + data.ordrSttusCd + ' btn outline xsm fs-13"><i class="icon icon_print"></i>프린트</button>';
if ('35' === prevOrderSttusCd) {
footer += ' <button type="button" class="btn sm outline fs-13 excel-dwld-purch-order">';
footer += ' <button type="button" onclick="fn_select_dwld_purch_ordr_list()" class="btn sm outline fs-13">';
footer += ' <i class="icon icon_excel"></i>발주서 다운로드';
footer += ' </button>';
}
@@ -1738,8 +1719,6 @@
$(form).submit();
}
/* 다운로드 항목 목록 이동 */
const fn_select_dwld_ordr_list = function() {
var form = $('#condForm')
@@ -1753,9 +1732,17 @@
$(form).submit();
}
/* 발주서 다운로드 항목 목록 이동 */
const fn_select_dwld_purch_ordr_list = function() {
var form = $('#condForm')
$(form).find('input[name="ordrInnb"]').remove();
$(form).attr('method', 'post');
$(form).attr('action', '<c:url value="/mngr/ordr/ordrmngr/selectExcelPoListInqireRForm"/>');
$(form).submit();
}
</script>
</head>
<body>
@@ -1785,6 +1772,7 @@
<a type="button" onclick="fn_select_indvdl_setle_list();" class="btn outline">개인 결제 목록</a>
<a href="<c:url value="/crm/ordr/selectMngrOrdrRegistForm"/>" class="btn outline" target='_blank'>관리자 주문 등록</a>
<a type="button" onclick="fn_select_dwld_ordr_list();" class="btn outline">다운로드 항목설정 목록</a>
<a type="button" onclick="fn_select_dwld_purch_ordr_list()" class="btn outline"><i class="icon icon_excel"></i>발주서 다운로드</a>
<button type="button" class="btn primary" onclick="fn_dlivy_procs_popup('/mngr/ordr/dlivy/selectOrdrDlivyPopupForm','팝업','1400','840', 'O');">출고처리</button>
</div>
</div>

View File

@@ -1037,11 +1037,30 @@
url:'<c:url value="/mngr/ordr/ordrmngr/updateDlvylcInfoUpdt"/>',
data:$(obj).serialize(),
success:function(data) {
if (data.resBody != null) {
let result = data.resBody ? data.resBody.result : null;
if (!result) {
alert('<spring:message code="error.internal-server"/>');
return;
}
if (typeof result === 'string') {
if (!fn_check_json(result)) {
alert('<spring:message code="error.internal-server"/>');
return;
}
result = JSON.parse(result);
}
if (result.status !== '0') {
alert(result.message || '<spring:message code="error.internal-server"/>');
return;
}
alert('<spring:message code="success.common.update"/>');
fn_get_dlvy('${data.dtl.ordrInnb}');
}
},
error:function(data) {
fn_proc_error_message(data);
@@ -1499,7 +1518,10 @@
$("#overlay").fadeOut();
if (!data.responseJSON.resBody.message) {
if(!data.responseJSON.resBody.result)
alert('<spring:message code="error.internal-server"/>');
else
alert(data.responseJSON.resBody.result);
} else {
if (fn_check_json(data.responseJSON.resBody.message)) {
const errorObject = JSON.parse(data.responseJSON.resBody.message);
@@ -1759,7 +1781,7 @@
* 네이버페이 주문 제어 제한
*/
const fn_check_smrtShoping = function(smrtShopngOrdrnb, chgOrdrSttusCd) {
const hasSmrt = smrtShopngOrdrnb != 'undefined' && smrtShopngOrdrnb != '';
const hasSmrt = smrtShopngOrdrnb != 'undefined' && smrtShopngOrdrnb != 'null' && smrtShopngOrdrnb != '';
if ((chgOrdrSttusCd == undefined || chgOrdrSttusCd !== '35') && hasSmrt) {
alert('네이버페이 주문건은 처리할 수 없습니다.');
return true;

View File

@@ -18,6 +18,7 @@
<form id="adres${orderShipping.ordrDlvyInnb}">
<input type="hidden" name="sopmalCd" id="sopmalCd" value="${orderShipping.sopmalCd}"/>
<input type="hidden" name="ordrInnb" id="ordrInnb" value="${orderShipping.ordrInnb}">
<input type="hidden" name="dlvylcAreaCd" value="${orderShipping.dlvylcAreaCd}">
<h3 class="content-section__title">배송지 정보</h3>
<div class="form-control-container mb-10">
<div class="left">
@@ -62,7 +63,9 @@
<col style="width: auto;">
<col style="width: auto;">
<col style="width: auto;">
<col style="width: 40%;">
<col style="width: auto;">
<col style="width: auto;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
@@ -102,6 +105,12 @@
</div>
</div>
</td>
<th class="text-right">개인통관부호</th>
<td>
<div class="td-inner">
<input type="text" class="input-text" name="cstmclerCd" id="cstmclerCd" value="${orderShipping.cstmclerCd}" maxlength="13" placeholder="P로 시작하는 13자리 부호를 입력하세요"/>
</div>
</td>
</tr>
</tbody>
</table>

View File

@@ -4,7 +4,8 @@
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<spring:eval expression="@environment.getProperty('currency-unit.KR')" var="krUnit"/>
<!DOCTYPE html>
<html lang="ko">
<head>
@@ -182,20 +183,23 @@
<table class="order_print_info" style="width:100%;">
<tr>
<th>상품금액</th>
<td><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>원</td>
<td><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>배송비</th>
<td><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>원</td>
<td><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>할인</th>
<td><fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>원</td>
<td><fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>총 결제금액</th>
<td>
<span style="font-size:12px;"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>원</span>
<span style="font-size:12px;">
<fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>${curUnit}
(<fmt:formatNumber value="${setle.wonRlSetleAmt}" pattern="#,###"/>${krUnit})
</span>
</td>
</tr>
<tr>
@@ -304,13 +308,13 @@
</c:forEach>
</td>
<td class="right"><fmt:formatNumber value="${goods.ordrQy}" pattern="#,###"/></td>
<td class="right"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>원</td>
<td class="right"><fmt:formatNumber value="${goods.dscntAmt}" pattern="#,###"/>원</td>
<td class="right"><fmt:formatNumber value="${goods.applyDscntAmt}" pattern="#,###"/>원<br/>(<fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>원)</td>
<td class="right"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.dscntAmt}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.applyDscntAmt}" pattern="#,###"/>${curUnit}<br/>(<fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit})</td>
<td class="right"><fmt:formatNumber value="${goods.mlgAmt}" pattern="#,###"/></td>
<td rowspan="4" class="right">
<div><span>${goods.dlvyMthNm}</span></div>
<div><span class="bold"><fmt:formatNumber value="${goods.dlvyAmt}" pattern="#,###"/></span></div>
<div><span class="bold"><fmt:formatNumber value="${goods.dlvyAmt}" pattern="#,###"/>${curUnit}</span></div>
</td>
<td class="right"><fmt:formatNumber value="${goods.setleCanclQy}" pattern="#,###"/></td>
</tr>
@@ -368,7 +372,7 @@
</td>
<td style="text-align:center;font-size:12px;"><span>-</span></td>
<td style="text-align:right;font-size:12px;">
<span>할인<span> <fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>원</span></span>
<span>할인<span> <fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>${curUnit}</span></span>
</td>
<td style="text-align:center;font-size:12px;"><span>=</span></td>
<td style="text-align:right;font-size:12px;">
@@ -377,12 +381,12 @@
</tr>
<tr>
<td style="text-align:right;font-size:11px;">
<span><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>원</span>
<span><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>${curUnit}</span>
</td>
<td></td>
<td style="text-align:right;font-size:11px;">
<div>
<span><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>원</span>
<span><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>${curUnit}</span>
</div>
</td>
<td></td>
@@ -390,16 +394,19 @@
<c:set var="dscnts" value="${ordrDtstmnDwld.dscnt}"/>
<c:if test="${not empty dscnts}">
<c:forEach var="dscnt" items="${dscnts}" varStatus="status">
<div>${dscnt.dscntDvNm}:<span><fmt:formatNumber value="${dscnt.dscntAmt}" pattern="#,###"/>원</span></div>
<div>${dscnt.dscntDvNm}:<span><fmt:formatNumber value="${dscnt.dscntAmt}" pattern="#,###"/>${curUnit}</span></div>
</c:forEach>
</c:if>
<c:if test="${empty dscnts}">
<div><span>0원</span></div>
<div><span>0${curUnit}</span></div>
</c:if>
</td>
<td></td>
<td style="text-align:right;font-size:12px;">
<span><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>원</span>
<span>
<fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>${curUnit}
(<fmt:formatNumber value="${setle.wonRlSetleAmt}" pattern="#,###"/>${krUnit})
</span>
</td>
</tr>
</tbody>

View File

@@ -0,0 +1,533 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<spring:eval expression="@environment.getProperty('currency-unit.KR')" var="krUnit"/>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
<style>
@media print {
html, body {
height:auto;
width:auto;
margin: 0 !important;
padding: 0 !important;
overflow: hidden;
}
}
.right {
text-align: right;
}
.pbreak {
page-break-after: always;
}
.pbreak:last-child {
page-break-after: auto;
}
table.order_print_info tr th {
padding:3px 3px 3px 3px;
text-align:left;
font-size:11px;
color:#4d4d4d;
font-weight:normal;
}
table.order_print_info tr td {
padding:3px 3px 3px 3px;
text-align:right;
font-size:11px;
}
table.delivery_print_info {
border-collapse:collapse !important;
border:1px solid #bcbfc1;
table-layout: fixed;
}
table.delivery_print_info tr th {
padding:3px 3px 3px 3px;
font-size:11px;
color:#4d4d4d;
font-weight:normal;
}
table.delivery_print_info tr td {
padding:3px 3px 3px 3px;
font-size:11px;
}
table.delivery_goods_print_info {
border-collapse:collapse !important;
border:1px solid #bcbfc1;
table-layout: fixed
}
table.delivery_goods_print_info tr th {
padding:3px 3px 3px 3px;
font-size:11px;
color:#4d4d4d;
font-weight:normal;
border-left:1px solid #bcbfc1;
border-top:1px solid #bcbfc1;
}
table.delivery_goods_print_info tr td {
padding:3px 3px 3px 3px;
font-size:11px;
border-left:1px solid #bcbfc1;
border-top:1px solid #bcbfc1;
}
span.title_print_info {
font-size:12px;
color:#000000;
font-weight:normal;
letter-spacing:-1px;
}
table.order-sale-summary tr.total-sale-title td {
font-size:14px !important;
font-weight:normal !important;
color:#000000 !important;
}
tr.detail-sale-summary td div {
padding:0px !important;
color:#000000 !important;
}
tr.detail-sale-summary td {
color:#000000 !important;
}
tr.detail-sale-summary td span {
padding:0px !important;
color:#000000;
}
tr.total-sale-title td span {
padding:0px !important;
color:#000000;
}
tr.detail-sale-summary td:last-child {
padding:0px !important;
color:#000000 !important;
font-weight:normal !important;
}
tr.detail-sale-summary td:last-child span {
padding:0px !important;
color:#000000 !important;
font-size:14px !important;
font-weight:normal !important;
}
span.unit-money {
display:inline-block;width:10px;
}
tr {
page-break-inside:avoid;
page-break-after:auto;
}
td {
page-break-inside:avoid;
page-break-after:auto;
}
</style>
<script>
$(document).ready(function(){
loding(false);
window.print();
});
</script>
</head>
<body>
<div id="wrap">
<c:set var="ordrDtstmnDwlds" value="${data.ordrDtstmnDwldList}"/>
<c:forEach var="ordrDtstmnDwld" items="${ordrDtstmnDwlds}" varStatus="status">
<c:set var="shipping" value="${ordrDtstmnDwld.shipping}"/>
<c:set var="srchOrdrDlvyInnb" value="${ordrSrchVO.srchOrdrDlvyInnbs[status.index]}"/>
<c:set var="isLast" value="${ordrDtstmnDwlds.size() ne status.count}"/>
<div class="pbreak">
<div align="center">
<table>
<tr>
<td>
<span style="text-align:center;font-size:20px;letter-spacing:-1px;font-weight:bold;padding-top:20px;">
주문내역서
</span>
</td>
</tr>
</table>
</div>
<div style="height:5px;"></div>
<table style="width:100%;">
<col style="width:48%;">
<col style="width:4%;">
<col style="width:48%;">
<tr>
<td><span class="title_print_info">주문정보</span></td>
<td></td>
<td><span class="title_print_info">결제정보</span></td>
</tr>
<tr>
<td><div style="width:100%;border-top:1px solid #545454;height:1px;"></div></td>
<td></td>
<td><div style="width:100%;border-top:1px solid #545454;height:1px;"></div></td>
</tr>
<tr>
<td>
<c:set var="ordr" value="${ordrDtstmnDwld.ordr}"/>
<c:set var="setle" value="${ordrDtstmnDwld.setle}"/>
<table class="order_print_info" style="width:100%;">
<tr>
<th>주문번호</th>
<td>${ordr.ordrInnb}</td>
</tr>
<tr>
<th>주문일자</th>
<td>${ordr.ordrRceptDt}</td>
</tr>
<tr>
<th>주문고객</th>
<td>${ordr.mbrNm}</td>
</tr>
<tr>
<th>전화</th>
<td>${ordr.ordrrTelnb}</td>
</tr>
<tr>
<th>휴대전화</th>
<td>${ordr.ordrrMbtlnb}</td>
</tr>
<tr>
<th>이메일</th>
<td>${ordr.ordrrEmailAdres}</td>
</tr>
</table>
</td>
<td></td>
<td valign="top">
<table class="order_print_info" style="width:100%;">
<tr>
<th>상품금액</th>
<td><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>배송비</th>
<td><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>할인</th>
<td><fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>${curUnit}</td>
</tr>
<tr>
<th>총 결제금액</th>
<td>
<span style="font-size:12px;">
<fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>${curUnit}
(<fmt:formatNumber value="${setle.wonRlSetleAmt}" pattern="#,###"/>${krUnit})
</span>
</td>
</tr>
<tr>
<th>결제수단</th>
<td>${ordr.setleTyNm}</td>
</tr>
</table>
</td>
</tr>
</table>
<div style="height:10px"></div>
<table align="center" style="width:100%;">
<tr>
<td class="left"><span class="title_print_info">주문상품 (${ordr.itemCnt}종 - 총 ${ordr.orderCnt}개)</span></td>
</tr>
</table>
<div style="height:3px"></div>
<c:set var="goodsList" value="${ordrDtstmnDwld.goods}"/>
<c:if test="${not empty goodsList}">
<table class="delivery_goods_print_info" align="center" style="width:100%; ${status.count > 1 ? 'margin-top:5px;' : '' }">
<colgroup>
<col style="width:auto;">
<col style="width:50px;">
<col style="width:35px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:35px;">
</colgroup>
<tr>
<th>상품명</th>
<th>순번</th>
<th>주문</th>
<th>판매가</th>
<th>할인</th>
<th>할인가(단가)</th>
<th>적립</th>
<th>배송</th>
<th>취소</th>
</tr>
<c:forEach var="goods" items="${goodsList}" varStatus="status">
<tr>
<td>
<table style="border:0px">
<tr>
<td style="font-size:11px;border:0px;">
${goods.goodsNm}
<c:if test="${not empty goods.optnNm}">
<div style="padding:2px 0px 0px 0px;">- ${goods.optnNm}</div>
</c:if>
</td>
</tr>
</table>
</td>
<td class="right">
<c:forEach var="ship" items="${shipping}" varStatus="status">
<c:if test="${ship.ordrDlvyInnb == goods.ordrDlvyInnb}">
${status.count}번째
</c:if>
</c:forEach>
</td>
<td class="right"><fmt:formatNumber value="${goods.ordrQy}" pattern="#,###"/></td>
<td class="right"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.dscntAmt}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.applyDscntAmt}" pattern="#,###"/>${curUnit}<br/>(<fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit})</td>
<td class="right"><fmt:formatNumber value="${goods.mlgAmt}" pattern="#,###"/></td>
<td class="right">
<div><span>${goods.dlvyMthNm}</span></div>
<div><span class="bold"><fmt:formatNumber value="${goods.dlvyAmt}" pattern="#,###"/>${curUnit}</span></div>
</td>
<td class="right"><fmt:formatNumber value="${goods.setleCanclQy}" pattern="#,###"/></td>
</tr>
</c:forEach>
</table>
</c:if>
<c:if test="${empty goodsList}">
<table class="delivery_goods_print_info" align="center" style="width:100%;">
<colgroup>
<col style="width:auto;">
<col style="width:50px;">
<col style="width:35px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:35px;">
</colgroup>
<tr>
<th>상품명</th>
<th>순번</th>
<th>주문</th>
<th>판매가</th>
<th>할인</th>
<th>할인가(단가)</th>
<th>적립</th>
<th>배송</th>
<th>취소</th>
</tr>
<tr>
<td colspan="9" style="text-align: center">조회된 데이터가 없습니다.</td>
</tr>
</table>
</c:if>
<div style="height:10px"></div>
<div>
<table style="width:100%;">
<tr>
<td><span class="title_print_info">배송정보</span></td>
</tr>
</table>
<c:if test="${not empty shipping}">
<c:forEach var="ship" items="${shipping}" varStatus="status">
<c:if test="${srchOrdrDlvyInnb eq ship.ordrDlvyInnb}">
<table class="delivery_goods_print_info" style="width:100%; ${status.count > 1 ? 'margin-top:5px;' : '' }">
<col style="width:5%;">
<col style="width:20%;">
<col style="width:20%;">
<col style="width:20%;">
<tr align="left">
<td rowspan="3">${status.count}번째</td>
<td>${ship.recpntNm}</td>
<td>${ship.recpntMbtlnb}</td>
<td>${ship.recpntTelnb}</td>
</tr>
<tr align="left">
<td colspan="3">
${not empty ship.dlvylcZip ? '(' += ship.dlvylcZip += ')' : ''}
${ship.adres}
${ship.dlvylcAdresDtl}
</td>
</tr>
<tr align="left">
<td colspan="3">
<c:if test="${empty ship.dlvyMssageCn}">
-
</c:if>
<c:if test="${not empty ship.dlvyMssageCn}">
${ship.dlvyMssageCn}
</c:if>
</td>
</tr>
</table>
</c:if>
</c:forEach>
</c:if>
<c:if test="${empty shipping}">
<table class="delivery_goods_print_info" style="width:100%; ${status.count > 1 ? 'margin-top:5px;' : '' }">
<col style="width:5%;">
<col style="width:20%;">
<col style="width:20%;">
<col style="width:20%;">
<tr><td colspan="9" style="text-align: center">조회된 데이터가 없습니다.</td></tr>
</table>
</c:if>
</div>
<div style="height:10px"></div>
<table align="center" style="width:100%;">
<tr>
<td class="left"><span class="title_print_info">발송상품</span></td>
</tr>
</table>
<div style="height:3px"></div>
<c:set var="goodsList" value="${ordrDtstmnDwld.goods}"/>
<c:if test="${not empty goodsList}">
<table class="delivery_goods_print_info" align="center" style="width:100%; ${status.count > 1 ? 'margin-top:5px;' : '' }">
<colgroup>
<col style="width:auto;">
<col style="width:35px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:35px;">
</colgroup>
<tr>
<th>상품명</th>
<th>주문</th>
<th>판매가</th>
<th>할인</th>
<th>할인가(단가)</th>
<th>적립</th>
<th>취소</th>
<th>발송</th>
</tr>
<c:forEach var="goods" items="${goodsList}" varStatus="status">
<c:if test="${srchOrdrDlvyInnb eq goods.ordrDlvyInnb}">
<tr>
<td>
<table style="border:0px">
<tr>
<td style="font-size:11px;border:0px;">
${goods.goodsNm}
<div style="padding:2px 0px 0px 0px;">- ${goods.optnNm}</div>
</td>
</tr>
</table>
</td>
<td class="right"><fmt:formatNumber value="${goods.ordrQy}" pattern="#,###"/></td>
<td class="right"><fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.dscntAmt}" pattern="#,###"/>${curUnit}</td>
<td class="right"><fmt:formatNumber value="${goods.applyDscntAmt}" pattern="#,###"/>${curUnit}<br/>(<fmt:formatNumber value="${goods.slepric}" pattern="#,###"/>${curUnit})</td>
<td class="right"><fmt:formatNumber value="${goods.mlgAmt}" pattern="#,###"/></td>
<td class="right"><fmt:formatNumber value="${goods.setleCanclQy}" pattern="#,###"/></td>
<td class="right"><fmt:formatNumber value="${goods.sndngQy}" pattern="#,###"/></td>
</tr>
</c:if>
</c:forEach>
</table>
</c:if>
<c:if test="${empty goodsList}">
<table class="delivery_goods_print_info" align="center" style="width:100%;">
<colgroup>
<col style="width:auto;">
<col style="width:50px;">
<col style="width:35px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:70px;">
<col style="width:35px;">
</colgroup>
<tr>
<th>상품명</th>
<th>배송지</th>
<th>주문</th>
<th>판매가</th>
<th>할인</th>
<th>할인가(단가)</th>
<th>적립</th>
<th>배송</th>
<th>취소</th>
</tr>
<tr>
<td colspan="9" style="text-align: center">조회된 데이터가 없습니다.</td>
</tr>
</table>
</c:if>
<%--<div style="height:5px;"></div>
<table align="center" style="width:696px;">
<colgroup>
<col style="width:20%;">
<col>
<col style="width:20%;">
<col>
<col style="width:20%;">
<col>
<col style="width:20%;">
</colgroup>
<tbody>
<tr>
<td style="text-align:right;font-size:12px;">
<span>총 상품금액</span>
</td>
<td style="text-align:center;font-size:12px;"><span>+</span></td>
<td style="text-align:right;font-size:12px;">
<span>배송비</span>
</td>
<td style="text-align:center;font-size:12px;"><span>-</span></td>
<td style="text-align:right;font-size:12px;">
<span>할인<span> <fmt:formatNumber value="${setle.dscntAmt}" pattern="#,###"/>${curUnit}</span></span>
</td>
<td style="text-align:center;font-size:12px;"><span>=</span></td>
<td style="text-align:right;font-size:12px;">
<span>총 결제금액</span>
</td>
</tr>
<tr>
<td style="text-align:right;font-size:11px;">
<span><fmt:formatNumber value="${setle.slepric}" pattern="#,###"/>${curUnit}</span>
</td>
<td></td>
<td style="text-align:right;font-size:11px;">
<div>
<span><fmt:formatNumber value="${setle.dlvyAmt}" pattern="#,###"/>${curUnit}</span>
</div>
</td>
<td></td>
<td style="text-align:right;font-size:11px;">
<c:set var="dscnts" value="${ordrDtstmnDwld.dscnt}"/>
<c:if test="${not empty dscnts}">
<c:forEach var="dscnt" items="${dscnts}" varStatus="status">
<div>${dscnt.dscntDvNm}:<span><fmt:formatNumber value="${dscnt.dscntAmt}" pattern="#,###"/>${curUnit}</span></div>
</c:forEach>
</c:if>
<c:if test="${empty dscnts}">
<div><span>0${curUnit}</span></div>
</c:if>
</td>
<td></td>
<td style="text-align:right;font-size:12px;">
<span>
<fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/>${curUnit}
(<fmt:formatNumber value="${setle.wonRlSetleAmt}" pattern="#,###"/>${krUnit})
</span>
</td>
</tr>
</tbody>
</table>--%>
</div>
<c:if test="${isLast}">
<div style="height:50px"></div>
</c:if>
</c:forEach>
</div>
</body>
</html>

View File

@@ -0,0 +1,126 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="java.util.Date" %>
<%--
Class Name : PurchOrdrListInqireR.jsp
Description : 발주서 대상 목록 조회
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-07-15 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<section class="content-section">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총<strong><c:out value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
<!-- 코드 사용 -->
<div class="select-box">
<select title="페이지당 출력될 목록건수" name="pageUnit" id="pageUnit" onchange="fn_select_list(1);return false;">
<c:forEach items="${ resultMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
<option value="<c:out value="${ pageUnit }"/>"<c:if test="${ resultMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
</c:forEach>
</select>
</div>
</div>
</div>
<hr class="horizontal-line">
<div class="form-control-container">
<div class="left">
<button type="button" class="btn outline sm" onclick="fn_ordrdtstmn_print();">
<i class="icon icon_print"></i>프린트
</button>
<button type="button" class="btn outline sm" onclick="fn_excel_download();">
<i class="icon icon_excel"></i>발주서 다운로드
</button>
</div>
<div class="center"></div>
<div class="right"></div>
</div>
<hr class="spacing">
<div class="table-wrapper">
<table class="table vertical">
<caption>회원 목록</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 4%;">
<col style="width: 10%;">
<col style="width: 12%;">
<col style="width: 6%;">
<col style="width: 8%;">
<col style="width: auto;">
<col style="width: auto;">
<col style="width: 6%;">
<col style="width: auto;">
<col style="width: 6%;">
</colgroup>
<thead>
<tr>
<th>
<label class="b-checkbox checkbox is-medium check-all" id="chkALabel">
<input type="checkbox" id="chkA">
<span class="check"></span>
</label>
</th>
<th>엑셀 다운일</th>
<th>주문번호</th>
<th>배송번호</th>
<th>수취인</th>
<th>수취인 TEL</th>
<th>개인통관부호</th>
<th>우편번호</th>
<th>내용물</th>
<th>Unit Value</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${not empty resultMap.resultList}">
<c:forEach var="resultList" items="${resultMap.resultList}">
<tr>
<td>
<label class="b-checkbox checkbox is-medium">
<input type="checkbox" value="${resultList.ordrInnb}/${resultList.ovseaSelerRegistCd}" class="chk" name="purchOrdrPK">
<span class="check"></span>
</label>
<input type="hidden" class="cstmclerCd" value="${resultList.cstmclerCd}">
</td>
<td><c:out value="${resultList.excelDownDt}"/></td>
<td><c:out value="${resultList.ordrInnb}"/></td>
<td><c:out value="${resultList.ovseaSelerRegistCd}"/></td>
<td><c:out value="${resultList.recpntNm}"/></td>
<td><c:out value="${resultList.recpntMbtlnb}"/></td>
<td><c:out value="${resultList.cstmclerCd}"/></td>
<td><c:out value="${resultList.dlvylcZip}"/></td>
<td><c:out value="${resultList.cn}"/></td>
<td><c:out value="${resultList.unitValue}"/></td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="100%"><spring:message code="common.nodata"/></td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</section>
<div class="pagination__container mt-30">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ ordrSrchVO.pageIndex}"/>
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>
</html>

View File

@@ -0,0 +1,320 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="java.util.Date" %>
<%--
Class Name : PurchOrdrListInqireRForm.jsp
Description : 발주서 관리 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-07-15 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
<script type="text/javascript">
$(document).ready(function(){
//form메소드에서 pageIndex, pageUnit 갖고옴
let pageIndex = '<c:out value="${ ordrSrchVO.pageIndex }"/>';
<%--let pageUnit = '<c:out value="${ ordrSrchVO.pageUnit }"/>';--%>
let pageUnit = 100;
fn_select_list(pageIndex, pageUnit);
//검색 버튼 클릭
$('#btnSearch').on('click', function(){
fn_select_list(1);
});
});
/* ********************************************************
* 발주서 목록 조회
******************************************************** */
const fn_select_list = function(pageIndex, pageUnit) {
let dataStr;
if(!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
if(!pageUnit) {
dataStr = $('#listForm').serialize();
} else {
if($('#pageUnit').length){
$('#pageUnit').val(pageUnit);
dataStr = $('#listForm').serialize();
} else {
dataStr = $('#listForm').serialize()+'&pageUnit='+pageUnit;
}
}
$.ajax({
type: 'post',
url : '/mngr/ordr/ordrmngr/selectExcelPoListInqire',
data : dataStr,
success:function(resultHtml) {
$('#pageDiv').html(resultHtml);
$('#pageUnit').niceSelect();
}
});
}
/* ********************************************************
* 발주서 주문내역서 프린트
******************************************************** */
const fn_ordrdtstmn_print = function () {
const checkedBoxes = $('input[name="purchOrdrPK"]:checked');
if (checkedBoxes.length === 0) {
alert('선택값이 없습니다.');
return false;
}
let srchOrdrInnbs = [];
let srchOrdrDlvyInnbs = [];
$(checkedBoxes).each(function(idx, item) {
const split = $(item).val().split('/');
srchOrdrInnbs.push(split[0]);
srchOrdrDlvyInnbs.push(split[1]);
});
const title = 'orderPrint';
fn_open_center_popup(title, '900', '700');
var tempForm = $('<form>', {
target: title,
method: 'post',
action: '/mngr/ordr/ordrmngr/selectPurchOrdrDtstmnDwldPopupForm'
});
$.each(srchOrdrInnbs, function(key, value) {
$('<input>', {
type: 'hidden',
name: 'srchOrdrInnbs',
value: value
}).appendTo(tempForm);
});
$.each(srchOrdrDlvyInnbs, function(key, value) {
$('<input>', {
type: 'hidden',
name: 'srchOrdrDlvyInnbs',
value: value
}).appendTo(tempForm);
});
tempForm.appendTo('body');
console.log(tempForm.prop('outerHTML'));
tempForm.submit();
tempForm.remove();
}
/**
* 발주서 엑셀다운로드
* */
const fn_excel_download = function () {
const checkedBoxes = $('input[name="purchOrdrPK"]:checked');
if (checkedBoxes.length === 0) {
alert('선택값이 없습니다.');
return false;
}
let cstmclerCds = [];
let srchOrdrInnbs = [];
let srchOrdrDlvyInnbs = [];
$(checkedBoxes).each(function(idx, item) {
const cstmclerCd = $(this).closest('td').find('.cstmclerCd').val();
cstmclerCds.push(cstmclerCd);
const split = $(item).val().split('/');
srchOrdrInnbs.push(split[0]);
srchOrdrDlvyInnbs.push(split[1]);
});
const duplicate = new Set(cstmclerCds).size !== cstmclerCds.length;
if(duplicate) {
alert('개인통관부호가 중복되었습니다.')
return false;
}
var tempForm = $('<form>', {
method: 'post',
action: '/mngr/ordr/ordrmngr/selectExcelPoDwldListInqire'
});
$.each(srchOrdrInnbs, function(key, value) {
$('<input>', {
type: 'hidden',
name: 'srchOrdrInnbs',
value: value
}).appendTo(tempForm);
});
$.each(srchOrdrDlvyInnbs, function(key, value) {
$('<input>', {
type: 'hidden',
name: 'srchOrdrDlvyInnbs',
value: value
}).appendTo(tempForm);
});
tempForm.appendTo('body');
tempForm.submit();
tempForm.remove();
}
/* open popup */
const fn_open_center_popup = function (title, w, h) {
const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
const dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;
const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;
const left = ((width / 2) - (w / 2)) + dualScreenLeft;
const top = ((height / 2) - (h / 2)) + dualScreenTop;
window.open('', title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
}
/**
* 체크박스 전체 처리
* */
const fn_change_event = function (_target, _arg) {
if (_arg === 'all') {
if ($('#' + _target + '-all').is(':checked')) {
$('[name=' + _target + ']').prop('checked', true);
} else {
$('[name=' + _target + ']').prop('checked', false);
}
} else {
let chkCnt = $('[name=' + _target + ']:checked').length;
let allCnt = $('[name=' + _target + ']').length;
if (chkCnt !== allCnt && $('#' + _target + '-all').is(':checked')) {
$('#' + _target + '-all').prop('checked', false);
} else if (chkCnt === allCnt) {
$('#' + _target + '-all').prop('checked', true);
}
}
}
// 테이블 체크박스 전체 선택
$(document).on("click", "#chkA", function () {
if($(this).is(':checked')){
$(".chk").prop('checked', true);
}else{
$(".chk").prop('checked', false);
}
});
// 목록에서 체크 해제시 전체 체크박스 해제 및 목록 항목 전체 체크 시 전체체크 버튼 true
$(document).on("click", ".chk", function () {
let length = $(".chk").length;
let chcedLen = $(".chk:checked").length;
if (length == chcedLen) {
$("#chkA").prop('checked', true);
}else{
$("#chkA").prop('checked', false);
}
});
</script>
</head>
<body>
<%-- 상단메뉴 공통화 적용 : 2023-11-30 / 박철민 추가 --%>
<%@include file ="/WEB-INF/views/comm/mngr/Header.jsp" %>
<main class="main">
<%-- 좌측메뉴 공통화 적용 : 2023-11-30 / 박철민 추가 --%>
<%@include file ="/WEB-INF/views/comm/mngr/Left.jsp" %>
<div class="content">
<div class="content__inner">
<button class="side-nav__fold"><span class="visually-hidden">좌측메뉴 펼치기/닫기</span></button>
<div class="page-title">
<h2 class="page-title__title">발주서 대상 조회</h2>
</div>
<form id="listForm">
<section class="content-section">
<span class="red-7">*검색어는 정확히 입력해주세요</span>
<div class="table-wrapper">
<table class="table">
<caption>발주서 대상 검색</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>배송지</th>
<td>
<div class="td-inner">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox check-all">
<input id="dlvylcAreaCds-all" type="checkbox" onclick="fn_change_event('dlvylcAreaCds', 'all');">
<span class="check"></span>
<span class="control-label">전체</span>
</label>
<c:forEach items="${nationCdList}" var="nationCd" varStatus="status">
<label class="b-checkbox checkbox">
<input type="checkbox" name="dlvylcAreaCds" value="${nationCd.cd}"onclick="fn_change_event('dlvylcAreaCds', 'other');" <c:if test="${nationCd.cd eq 'KR'}">checked</c:if>>
<span class="check"></span>
<span class="control-label">${nationCd.cdNm}</span>
</label>
</c:forEach>
</div>
</div>
</td>
</tr>
<tr>
<th>엑셀다운 포함 여부</th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<div class="custom-radio">
<input type="radio" id="excelIncY" name="excelInclude" value="Y" checked>
<label for="excelIncY">포함</label>
</div>
<div class="custom-radio">
<input type="radio" id="excelIncN" name="excelInclude" value="N">
<label for="excelIncN">미포함</label>
</div>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="form-control-container">
<div class="left"></div>
<div class="center">
<button type="button" class="btn outline" id="btnResetForm">
<spring:message code="button.init"/>
</button>
<button type="button" class="btn primary" id="btnSearch">
<spring:message code="button.search"/>
</button>
</div>
<div class="right">
</div>
</div>
</section>
<div id="pageDiv"></div>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
</main>
<div id = "modalDiv"></div>
</body>
</html>

View File

@@ -1051,6 +1051,11 @@
$('#hiddenForm').remove();
}
// 네이버페이 주문 제어 제한
if (fn_check_smrtShoping('${data.dtl.smrtShopngOrdrnb}')) {
return false;
}
const hiddenForm = document.createElement('form');
hiddenForm.name = 'hiddenForm';
hiddenForm.id = 'hiddenForm';
@@ -1203,7 +1208,10 @@
* 환불 철회
******************************************************** */
const fn_retraction_refund = function() {
// 네이버페이 주문 제어 제한
if (fn_check_smrtShoping('${data.dtl.smrtShopngOrdrnb}')) {
return false;
}
const data = $('#adminMemoForm').serialize();
@@ -1229,7 +1237,10 @@
* 반품/환불 철회
******************************************************** */
const fn_retraction_return = function() {
// 네이버페이 주문 제어 제한
if (fn_check_smrtShoping('${data.dtl.smrtShopngOrdrnb}')) {
return false;
}
const data = $('#adminMemoForm').serialize();
@@ -1434,7 +1445,18 @@
}
/**
* 네이버페이 주문 제어 제한
*/
const fn_check_smrtShoping = function(smrtShopngOrdrnb) {
const hasSmrt = smrtShopngOrdrnb != 'undefined' && smrtShopngOrdrnb != 'null' && smrtShopngOrdrnb != '';
if (hasSmrt) {
alert('네이버페이 주문건은 처리할 수 없습니다.');
return true;
}
return false;
}
</script>

View File

@@ -157,7 +157,7 @@
<c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case02.goodsSttusCd eq '03'}">
@@ -180,10 +180,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -198,10 +198,10 @@
<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__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>
</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>
</div>
</div>
@@ -332,7 +332,7 @@
<c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case04.goodsSttusCd eq '03'}">
@@ -355,10 +355,10 @@
<c:forEach items="${fn:split(case04.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -373,10 +373,10 @@
<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__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>
</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>
</div>
</div>
@@ -484,7 +484,7 @@
<c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case05.goodsSttusCd eq '03'}">
@@ -507,10 +507,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -525,10 +525,10 @@
<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__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>
</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"><c:out value="${case05.slePercent}"/>%</span>
</div>
</div>
@@ -601,7 +601,7 @@
<c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case07.goodsSttusCd eq '03'}">
@@ -622,10 +622,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -640,10 +640,10 @@
<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__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>
</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>
</div>
</div>
@@ -718,7 +718,7 @@
<c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case08.goodsSttusCd eq '03'}">
@@ -754,10 +754,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -772,10 +772,10 @@
<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__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>
</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>
</div>
</div>
@@ -880,7 +880,7 @@
<span class="product-unit-rating__score"><c:out value="${case09.avgEvlScore}" default="0.0"/></span>
</div>
<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>
</div>
</div>
@@ -1197,7 +1197,7 @@
<c:choose>
<c:when test="${case02.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case02.goodsSttusCd eq '03'}">
@@ -1220,10 +1220,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1238,10 +1238,10 @@
<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__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>
</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>
</div>
</div>
@@ -1376,7 +1376,7 @@
<c:choose>
<c:when test="${case04.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case04.goodsSttusCd eq '03'}">
@@ -1403,10 +1403,10 @@
var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1424,12 +1424,12 @@
<div class="product-unit-price col order-${case04.pricExpsrOrdr-1}"
style="order:${case04.pricExpsrOrdr-1}">
<div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber
<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>
</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>
</div>
</div>
@@ -1543,7 +1543,7 @@
<c:choose>
<c:when test="${case05.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case05.goodsSttusCd eq '03'}">
@@ -1566,10 +1566,10 @@
<c:forEach items="${fn:split(case05.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1584,10 +1584,10 @@
<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__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>
</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"><c:out value="${case05.slePercent}"/>%</span>
</div>
</div>
@@ -1660,7 +1660,7 @@
<c:choose>
<c:when test="${case07.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case07.goodsSttusCd eq '03'}">
@@ -1681,10 +1681,10 @@
<c:forEach items="${fn:split(case07.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1699,10 +1699,10 @@
<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__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>
</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>
</div>
</div>
@@ -1777,7 +1777,7 @@
<c:choose>
<c:when test="${case08.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${case08.goodsSttusCd eq '03'}">
@@ -1813,10 +1813,10 @@
<c:forEach items="${fn:split(case08.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -1831,10 +1831,10 @@
<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__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>
</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>
</div>
</div>
@@ -2130,7 +2130,7 @@
str += ' <div class="product-unit-image">';
if (result.goodsSttusCd === '02') {
str += '<div class="sold-out">';
str += ' <span>SOLD OUT</span>';
str += ' <span>입고 대기중</span>';
str += '</div>';
} else if (result.goodsSttusCd === '03') {
str += '<div class="sold-out">';
@@ -2156,9 +2156,9 @@
if (iconCdNm.includes('-')) {
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 {
str += '<span class="product-badge ' + lower + '">' + upper + '</span>';
str += '<span class="product-badge ' + lower + '" data-badge-cd="' + iconCdNm + '">' + upper + '</span>';
}
});
}
@@ -2173,10 +2173,10 @@
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__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 += ' </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 += ' </div>';
str += '</div>';

View File

@@ -16,6 +16,7 @@
--%>
<!DOCTYPE html>
<html lang="ko">
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -132,13 +133,13 @@
});
} else { //메인화면 호출 안할 시
// 상품 - 4열 슬라이드 타입 (이벤트 추천 상품 슬릭 이벤트)
$('.four-row-slick').slick({
$('.relate-goods-slick').slick({
slidesToShow: 4,
slidesToScroll: 4,
speed: 900,
infinite: true,
prevArrow: $('.four-row-slick__prev'),
nextArrow: $('.four-row-slick__next'),
prevArrow: $('.relate-goods-slick__prev'),
nextArrow: $('.relate-goods-slick__next'),
});
}
}
@@ -266,7 +267,7 @@
const reqUrl = $("#reqUrl").val();
if (reqUrl === 'csc') {
form.attr("action", "/sopmal/csc/selectCscListForm");
} else if (reqUrl === 'subPage') {
} else if (reqUrl === 'subPage' || reqUrl === 'detail') {
form.attr("action", "/sopmal/csc/selectSubPageListForm");
}
form.attr("method", "POST");
@@ -823,7 +824,9 @@
<i class="icon icon_lock"></i>
</c:if>
</h4>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<p class="eventDetail__date"><c:out value="${bbscttInfo.sumRegistDt}"/></p>
</c:if>
</div>
<%-------------------------------%>
<%--첨부 파일 다운로드 영역--%>
@@ -938,106 +941,96 @@
</div>
</c:if>
<%-------------------------------%>
<c:if test="${bbsInfo.recomendGoodsExpsrAt eq 'Y' && not empty goodsList.relateInfoList}">
<c:if test="${bbsInfo.recomendGoodsExpsrAt eq 'Y' && not empty goodsList}">
<div class="cartOrder">
<div class="main-section__container">
<section class="main-section main-section__four-row">
<div class="main-section-header">
<div class="main-section-title">
<h3 class="main-section-title__title">
추천 상품
<c:choose>
<c:when test = "${not empty bbscttInfo.relateGoodsWords}">
<c:out value="${bbscttInfo.relateGoodsWords}" escapeXml="false"/>
</c:when>
<c:otherwise>
이 글과 관련된 사케
</c:otherwise>
</c:choose>
</h3>
</div>
</div>
<div class="product-list-type1">
<div class="four-row-slick evtSlick">
<c:forEach var = "item" items="${goodsList.relateInfoList}">
<div class="${fn:length(goodsList) gt 4 ? 'four-row-slick relate-goods-slick evtSlick' : 'product-list-type1__list'}">
<c:forEach var = "item" items="${goodsList}">
<c:if test = "${not empty item.goodsInnb}">
<div class="product-unit">
<div class="product-unit-image">
<c:forEach var = "img" items = "${goodsList.relateImgList}">
<c:if test = "${item.goodsInnb eq img.goodsInnb}">
<button type="button" onclick = "fn_move_goods_dtl(<c:out value="${item.goodsInnb}"/>)" value="${item.goodsInnb}">
<c:if test="${item.goodsSttusCd eq '02'}">
<div class="sold-out"><span>입고 대기중</span></div>
</c:if>
<a class="product-detail" href="javascript:void(0);" onclick="fn_move_goods_dtl('<c:out value="${item.goodsInnb}"/>');">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="<c:out value = "${cdnurl}${img.img}"/>" style="width: 100%;
height: 304px; /* 원하는 고정 높이 설정 */
object-fit: cover; /* 이미지 비율을 유지하면서 영역에 맞게 자름 */"
onerror="this.src='/pc/images/image_placeholder.png'" alt="해당 이미지에 대한 설명">
</button>
</c:if>
<img src="<c:out value = "${cdnurl}${item.img}"/>"
onerror="this.src='/pc/images/image_placeholder.png'" alt="<c:out value="${item.goodsNm}"/>">
</a>
</div>
<div class="product-unit-info d-flex flex-column" style="flex-direction:column">
<c:if test="${not empty item.iconCdNmList && item.iconExpsrAt eq 'Y'}">
<div class="product-badge-container col order-${item.iconExpsrOrdr-1}" style="order: ${item.iconExpsrOrdr-1}">
<c:forEach items="${fn:split(item.iconCdNmList, ',')}" var="iconCdNm">
<span class="product-badge ${fn:toLowerCase(iconCdNm)}" data-badge-cd="${iconCdNm}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
</c:forEach>
</div>
<div class="product-unit-info">
<div class="product-badge-container">
<c:if test = "${not empty item.goodsIconCd}">
<c:forEach items="${fn:split(item.goodsIconCd, ',')}" var="icon">
<c:if test="${icon eq 'new'}">
<span class="product-badge new">NEW</span>
</c:if>
<c:if test="${icon eq 'hot'}">
<span class="product-badge hot">HOT</span>
</c:if>
<c:if test="${icon eq 'best'}">
<span class="product-badge best">BEST</span>
</c:if>
<c:if test="${icon eq 'md-pick'}">
<span class="product-badge md-pick">MD PICK</span>
</c:if>
<c:if test="${icon eq 'hot-deal'}">
<span class="product-badge four-row">HOT DEAL</span>
</c:if>
</c:forEach>
</c:if>
</div>
<div class="product-unit-info__inner">
<div class="product-unit-title">
<button type="button" onclick = "fn_move_goods_dtl(<c:out value="${item.goodsInnb}"/>)">
<c:if test="${item.goodsNmExpsrAt eq 'Y'}">
<div class="product-unit-title col order-${item.goodsNmExpsrOrdr-1}" style="order: ${item.goodsNmExpsrOrdr-1}">
<a href="javascript:void(0);" onclick="fn_move_goods_dtl('<c:out value="${item.goodsInnb}"/>');">
<c:out value = "${item.goodsNm}"/>
</button>
</a>
</div>
<div class="product-unit-price">
<c:forEach var="goodsOpt" items="${goodsList.relateGoodsOptList}">
<c:if test="${item.goodsInnb eq goodsOpt.goodsInnb && goodsOpt.stdrDvAt eq 'Y'}">
</c:if>
<c:if test="${item.pricExpsrAt eq 'Y'}">
<div class="product-unit-price col order-${item.pricExpsrOrdr-1}" style="order: ${item.pricExpsrOrdr-1}">
<div class="product-unit-price__price">
<span class="product-unit-price__original">
<fmt:formatNumber value="${goodsOpt.cnsmrpric}" pattern="#,###"/>
<span class="product-unit-price__original <c:if test="${item.slePercent eq 0}">visually-hidden</c:if>">
<fmt:formatNumber value="${item.cnsmrpric}"/> ${curUnit}
</span>
<span class="product-unit-price__current">
<fmt:formatNumber value="${goodsOpt.slepric}" pattern="#,###"/>
<fmt:formatNumber value="${item.slepric}"/> ${curUnit}
</span>
</div>
<div class="product-unit-price__sale">
<span class="percent"><c:out value = "${goodsOpt.slePercent}"/>%</span>
<div class="product-unit-price__sale <c:if test="${item.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent"><c:out value = "${item.slePercent}"/> %</span>
</div>
</div>
</c:if>
</c:forEach>
</div>
<span class="product-unit-price__monthly-payment"><c:out value = "${item.srtDc}"/></span>
</div>
<div class="product-unit-rating">
<c:if test="${item.reprsntDcExpsrAt eq 'Y'}">
<div class="product-unit-price__monthly-payment col order-${item.reprsntDcExpsrOrdr-1}" style="order: ${item.reprsntDcExpsrOrdr-1}"><c:out value = "${item.reprsntDc}"/></div>
</c:if>
<c:if test="${item.rvwEvlScreExpsrAt eq 'Y'}">
<div class="product-unit-rating col order-${item.rvwEvlScreExpsrOrdr-1}" style="order: ${item.rvwEvlScreExpsrOrdr-1}">
<i class="icon icon_rating-star"></i>
<c:forEach var = "evlInfo" items="${goodsList.goodsRvwEvlList}">
<c:if test = "${evlInfo.goodsInnb eq item.goodsInnb}">
<span class="product-unit-rating__score"><c:out value = "${evlInfo.avgEvlScore}"/>${goodsOpt.goodInnb}</span>
<span class="product-unit-rating__count">(<fmt:formatNumber value="${evlInfo.cntBbsctt}" pattern="#,###"/>)</span>
</c:if>
</c:forEach>
<span class="product-unit-rating__score"><c:out value = "${item.avgEvlScore}"/></span>
<span class="product-unit-rating__count">(<fmt:formatNumber value="${item.cntEvlScor}"/>)</span>
</div>
</c:if>
</div>
</div>
</c:if>
</c:forEach>
</div>
<c:if test="${fn:length(goodsList) gt 4}">
<div class="four-row-slick__btn-container">
<button class="four-row-slick__prev">
<button class="relate-goods-slick__prev">
<i class="icon icon_prev02"></i>
<span class="visually-hidden">이전</span>
</button>
<button class="four-row-slick__next">
<button class="relate-goods-slick__next">
<i class="icon icon_next02"></i>
<span class="visually-hidden">다음</span>
</button>
</div>
</c:if>
</div>
</section>
</div>

View File

@@ -260,7 +260,7 @@
</c:choose>
</tbody>
</table>
<c:if test = "${bbsInfo.bbscttRegist eq 'Y'}">
<c:if test = "${bbsInfo.bbscttRegist eq 'Y' and resultMap.registAuthResult eq 'Y'}">
<div class="sub-board__top-btn-container">
<button type = "button" class="btn outline theme" id = "regBtn"><spring:message code="button.insert"/></button>
</div>

View File

@@ -292,7 +292,7 @@
</c:choose>
</tbody>
</table>
<c:if test = "${bbsInfo.bbscttRegist eq 'Y'}">
<c:if test = "${bbsInfo.bbscttRegist eq 'Y' and resultMap.registAuthResult eq 'Y'}">
<div class="sub-board__top-btn-container">
<button type = "button" class="btn outline theme" id = "regBtn"><spring:message code="button.insert"/></button>
</div>

View File

@@ -287,16 +287,17 @@
</div>
<div class="product-unit-price">
<div class="product-unit-price__price">
<span class="product-unit-price__original">
<span class="product-unit-price__original <c:if test="${addCartResultMap.goodsDtl.dcPercent eq 0}">visually-hidden</c:if>">
<span class="comma">
<fmt:formatNumber value="${addCartResultMap.goodsDtl.cnsmrpric}"/></span>
<span class="priceUnit"></span>
<span class="priceUnit">${curUnit}</span>
</span>
<span class="product-unit-price__current">
<span class="comma"> <fmt:formatNumber value="${addCartResultMap.goodsDtl.dcSlepric}"/></span>
<span class="priceUnit">${curUnit}</span></span>
<span class="priceUnit">${curUnit}</span>
</span>
</div>
<div class="product-unit-price__sale">
<div class="product-unit-price__sale <c:if test="${addCartResultMap.goodsDtl.dcPercent eq 0}">visually-hidden</c:if>">
<span class="percent">
<c:out value="${addCartResultMap.goodsDtl.dcPercent}"/>
%

View File

@@ -3884,7 +3884,7 @@
<div class="product-unit-image">
<c:if test="${resultMap.goodsDtl.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:if>
<c:if test="${resultMap.goodsDtl.goodsSttusCd eq '03'}">
@@ -3922,14 +3922,16 @@
<c:if test="${not empty resultMap.goodsDtl.goodsIconCd}">
<div class="product-badge-container">
<c:forTokens var="iconNm" items="${resultMap.goodsDtl.goodsIconCd}" delims=",">
<c:choose>
<c:when test="${fn:contains(iconNm,'-')}">
<span class="product-badge product-badge--lg ${fn:toLowerCase(iconNm)}"> ${fn:toUpperCase(fn:replace(iconNm, '-', ' '))}</span>
</c:when>
<c:otherwise>
<span class="product-badge product-badge--lg ${fn:toLowerCase(iconNm)}"> ${fn:toUpperCase(iconNm)}</span>
</c:otherwise>
</c:choose>
<c:set var="badgeMatched" value="false"/>
<c:forEach items="${resultMap.goodsBadgeList}" var="badge">
<c:if test="${badge.cd eq iconNm}">
<span class="product-badge product-badge--lg ${fn:toLowerCase(iconNm)}" data-badge-cd="${iconNm}" style="color: ${badge.fontColor} !important; background-color: ${badge.bgColor} !important; border-color: ${badge.borderColor} !important;">${badge.cdNm}</span>
<c:set var="badgeMatched" value="true"/>
</c:if>
</c:forEach>
<c:if test="${not badgeMatched}">
<span class="product-badge product-badge--lg ${fn:toLowerCase(iconNm)}" data-badge-cd="${iconNm}">${fn:toUpperCase(fn:replace(iconNm, '-', ' '))}</span>
</c:if>
</c:forTokens>
</div>
</c:if>
@@ -3959,7 +3961,7 @@
<div class="productDetailInfo__price__sale">
<c:choose>
<c:when test="${resultMap.goodsDtl.pricRplcWordsUseAt ne 'Y'}">
<span class="percent"> <c:out value=" ${resultMap.goodsDtl.slePercent}"/> <span class="priceUnit">%</span></span>
<span class="percent <c:if test="${resultMap.goodsDtl.slePercent eq 0}">visually-hidden</c:if>"> <c:out value=" ${resultMap.goodsDtl.slePercent}"/> <span class="priceUnit">%</span></span>
</c:when>
<c:otherwise>
<a style="color: #e34747;" href="${resultMap.goodsDtl.pcPricRplcLink}" <c:if test="${resultMap.goodsDtl.pricRplcLinkBrwsrDvCd eq'01'}"> target="_blank" </c:if> >
@@ -3970,15 +3972,14 @@
</div>
<c:if test="${resultMap.goodsDtl.pricRplcWordsUseAt ne 'Y'}">
<div class="productDetailInfo__price__price">
<span class="productDetailInfo__price__original">
<span class="comma"><fmt:formatNumber value="${resultMap.goodsDtl.cnsmrpric}"/> </span><span
class="priceUnit"></span>
<span class="productDetailInfo__price__original <c:if test="${resultMap.goodsDtl.slePercent eq 0}">visually-hidden</c:if>">
<span class="comma"><fmt:formatNumber value="${resultMap.goodsDtl.cnsmrpric}"/> </span>
<span class="priceUnit">${curUnit}</span>
<input type="hidden" id="cnsmrpric" value="<c:out value="${resultMap.goodsDtl.cnsmrpric}"/>"/>
</span>
<span class="productDetailInfo__price__current" id="_salesPrice">
<span class="comma"><fmt:formatNumber
value="${resultMap.goodsDtl.slepric}"/></span><span
class="priceUnit">${curUnit}</span>
<span class="comma"><fmt:formatNumber value="${resultMap.goodsDtl.slepric}"/></span>
<span class="priceUnit">${curUnit}</span>
</span>
</div>
</c:if>

View File

@@ -48,7 +48,7 @@
<c:choose>
<c:when test="${list.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${list.goodsSttusCd eq '03'}">
@@ -84,10 +84,10 @@
<c:forEach items="${fn:split(list.iconCdNmList, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -105,12 +105,14 @@
<c:when test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
<div class="product-unit-price col order-${list.pricExpsrOrdr-1}" style="order: ${list.pricExpsrOrdr-1}">
<div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber
value="${list.cnsmrpric}"/> ${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber
value="${list.slepric}"/> ${curUnit}</span>
<span class="product-unit-price__original <c:if test="${list.slePercent eq 0}">visually-hidden</c:if>">
<fmt:formatNumber value="${list.cnsmrpric}"/> ${curUnit}
</span>
<span class="product-unit-price__current">
<fmt:formatNumber value="${list.slepric}"/> ${curUnit}
</span>
</div>
<div class="product-unit-price__sale">
<div class="product-unit-price__sale <c:if test="${list.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent"> <c:out value="${list.slePercent}"/> %</span>
</div>
</div>

View File

@@ -45,7 +45,7 @@
<c:choose>
<c:when test="${list.goodsSttusCd eq '02'}">
<div class="sold-out">
<span>SOLD OUT</span>
<span>입고 대기중</span>
</div>
</c:when>
<c:when test="${list.goodsSttusCd eq '03'}">
@@ -78,10 +78,10 @@
<c:forEach items="${fn:split(list.iconCdNmList, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>
@@ -99,12 +99,12 @@
<c:when test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
<div class="product-unit-price col order-${list.pricExpsrOrdr-1}" style="order: ${list.pricExpsrOrdr-1}">
<div class="product-unit-price__price">
<span class="product-unit-price__original"><fmt:formatNumber
value="${list.cnsmrpric}"/> ${curUnit}</span>
<span class="product-unit-price__current"><fmt:formatNumber
value="${list.slepric}"/> ${curUnit}</span>
<span class="product-unit-price__original <c:if test="${list.slePercent eq 0}">visually-hidden</c:if>">
<fmt:formatNumber value="${list.cnsmrpric}"/> ${curUnit}
</span>
<span class="product-unit-price__current"><fmt:formatNumber value="${list.slepric}"/> ${curUnit}</span>
</div>
<div class="product-unit-price__sale">
<div class="product-unit-price__sale <c:if test="${list.slePercent eq 0}">visually-hidden</c:if>">
<span class="percent"><c:out value="${list.slePercent}"/> %</span>
</div>
</div>

View File

@@ -82,7 +82,7 @@
}
if(!pageUnit) {
dataStr = $('#listForm').serialize();
dataStr = `$('#listForm').serialize();`
} else {
if($('#pageUnit').length){
$('#pageUnit').val(pageUnit);

View File

@@ -1002,10 +1002,10 @@
<c:forEach items="${fn:split(case02.goodsIconCd, ',')}" var="iconCdNm" varStatus="iconStatus">
<c:choose>
<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: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:choose>
</c:forEach>

View File

@@ -8,27 +8,40 @@
<%--
Class Name : WslistInqireR.jsp
Description : 마이페이지 위시리스트
Class Name : DlvyInqireR.jsp
Description : 배송 조회 팝업 모달
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-03-27 추지훈 최초 생성
2026-07-06 이대환 수정
--%>
<!-- 모달 -->
<style>
.statusEn {
font-size: 12px;
color: #50514f;
}
.deliveryStatus th,
.deliveryStatus td {
border: 1px solid #dee2e6 !important;
}
</style>
<jsp:useBean id="nowDate" class="java.util.Date" />
<fmt:formatDate var="currentTime" value="${nowDate}" pattern="yyyy-MM-dd HH:mm:ss" />
<!-- 배송 조회 -->
<div id="delivery-check-pop" class="modal default" style="max-width: 640px;">
<div class="modal-header">
<div class="modal-header__title">배송 조회</div>
</div>
<c:choose>
<c:when test="${ not empty resultMap.resultList && fn:length(resultMap.resultList) > 0 }">
<c:forEach var="list" items="${ resultMap.resultList }" varStatus="status">
<c:when test="${ not empty resultMap && resultMap.status eq 'success' }">
<c:set var="podInfo" value="${resultMap.podInfo[0]}"/>
<div class="modal-content">
<div class="table-wrapper">
<table class="table deliveryInfo">
<caption>해당 테이블에 대한 설명</caption>
<caption>주문 상세</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 20%;">
@@ -36,61 +49,38 @@
</colgroup>
<tbody>
<tr>
<th>
주문자
</th>
<td>
<c:out value="${ resultMap.result.ordrrNm }"/>
</td>
<th>송장번호</th>
<td><c:out value="${ podInfo.blno }"/></td>
</tr>
<tr>
<th>
수령인
</th>
<td>
<c:out value="${ list.recpntNm }"/>
</td>
<th>주문자</th>
<td><c:out value="${ ordrInfo.shippingList[0].recpntNm }"/></td>
</tr>
<tr>
<th>
배송지
</th>
<td><c:if test="${ not empty list.dlvylcZip }">(<c:out value="${ list.dlvylcZip }"/>)</c:if>
<th>수령인</th>
<td>
<c:choose>
<c:when test="${ list.dlvylcAdresDvCd eq '01'}">
<c:out value="${ list.dlvylcRnmAdres }"/>
</c:when>
<c:when test="${ list.dlvylcAdresDvCd eq '02'}">
<c:out value="${ list.dlvylcLnbAdres }"/>
<c:when test="${ podInfo.recipient eq 'null' }">
<c:out value="${ ordrInfo.shippingList[0].recpntNm }"/>
</c:when>
<c:otherwise>
<c:out value="${ podInfo.recipient }"/>
</c:otherwise>
</c:choose>
<c:out value="${ list.dlvylcAdresDtl }"/>
</td>
</tr>
<tr>
<th>
택배사
</th>
<td>
<c:out value="${ list.hdrycpnNm }"/>
</td>
</tr>
<tr>
<th>
송장번호
</th>
<td><c:out value="${ list.invcnb }"/></td><!-- TODO : 주문 목록에 붙여서 파라미터로 받은 송장번호 출력 -->
</tr>
</tbody>
</table>
</div>
<p>>> 국내 입항보고</p>
<div class="table-wrapper">
<table class="table deliveryStatus">
<caption>해당 테이블에 대한 설명</caption>
<caption>입항 상세</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 30%;">
<col style="width: 30%;">
<col style="width: 20%;">
<col style="width: 5%;">
<col style="width: auto;">
</colgroup>
<thead>
@@ -101,20 +91,171 @@
</tr>
</thead>
<tbody>
<c:forEach var="trackingList" items="${ list.trackingDetails }" varStatus="status">
<c:if test="${ not empty podInfo.dateLocalwhin }">
<tr>
<td><c:out value="${ trackingList.time }"/></td>
<td><c:out value="${ podInfo.dateLocalwhin }"/></td>
<td></td>
<td>
<c:out value="${ trackingList.where }"/>
<c:choose>
<c:when test="${ podInfo.dateLocalwhin > currentTime }">
발송물이 픽업(예정)되어, 공항출항 대기중입니다.
<p class="statusEn">Shipment pick up(expected) and waiting at the origin airport</p>
</c:when>
<c:otherwise>
발송물이 픽업되어, 공항출항 대기중입니다.
<p class="statusEn">Shipment pick up and waiting at the origin airport</p>
</c:otherwise>
</c:choose>
</td>
<td><c:out value="${ trackingList.kind }"/></td>
</tr>
</c:if>
<c:if test="${ not empty podInfo.dateLocaldeparture }">
<tr>
<td><c:out value="${ podInfo.dateLocaldeparture }"/></td>
<td></td>
<td>
<c:choose>
<c:when test="${ podInfo.dateLocaldeparture > currentTime }">
화물이 인천공항으로 출발(예정)하였습니다.
<p class="statusEn">Shipment departed(expected) to Incheon International Airport</p>
</c:when>
<c:otherwise>
화물이 인천공항으로 출발하였습니다.
<p class="statusEn">Shipment departed to Incheon International Airport</p>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:if>
<c:if test="${ not empty podInfo.dateIcnarrival }">
<tr>
<td><c:out value="${ podInfo.dateIcnarrival }"/></td>
<td>인천공항</td>
<td>
<c:choose>
<c:when test="${ podInfo.dateLocaldeparture > currentTime }">
화물이 인천공항에 도착(예정)하였습니다.
<p class="statusEn">Shipped the goods arrived(expected) at Incheon International Airport.</p>
</c:when>
<c:otherwise>
화물이 인천공항에 도착하였습니다.
<p class="statusEn">Shipped the goods arrived at Incheon International Airport.</p>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:if>
<c:if test="${ not empty podInfo.dateCustomes }">
<tr>
<td><c:out value="${ podInfo.dateCustomes }"/></td>
<td>인천공항</td>
<td>
<c:choose>
<c:when test="${ podInfo.dateLocaldeparture > currentTime }">
인천공항 세관에서 통관완료(예정)되었습니다.
<p class="statusEn">Customs clearance is completed(expected) in the Republic of Korea</p>
</c:when>
<c:otherwise>
인천공항 세관에서 통관완료되었습니다.
<p class="statusEn">Customs clearance is completed in the Republic of Korea</p>
</c:otherwise>
</c:choose>
</td>
</tr>
</c:if>
</tbody>
</table>
</div>
<c:if test="${ not empty podInfo.customs }">
<p>>> 통관 조회</p>
<c:forEach var="customOne" items="${ podInfo.customs }" varStatus="status">
<div class="table-wrapper">
<table class="table deliveryStatus">
<caption>통관 상세</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 20%;">
<col style="width: auto;">
</colgroup>
<thead>
<tr>
<th>처리일시</th>
<th>처리상태</th>
</tr>
</thead>
<tbody>
<c:forEach var="customDetail" items="${ customOne }" varStatus="status">
<tr>
<td><c:out value="${ customDetail.dateEvent }"/></td>
<td><c:out value="${ customDetail.traceStatus }"/></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</c:forEach>
</c:if>
<c:if test="${ not empty podInfo.localPod }">
<p>>> 우체국 배송 조회</p>
<div class="table-wrapper">
<table class="table deliveryStatus">
<caption>배송 상세</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 20%;">
<col style="width: 35%;">
<col style="width: auto;">
</colgroup>
<thead>
<tr>
<th>처리일시</th>
<th>현재위치</th>
<th>처리현황</th>
</tr>
</thead>
<tbody>
<c:forEach var="localPod" items="${ podInfo.localPod }" varStatus="status">
<tr>
<td><c:out value="${ localPod.dateEvent }"/></td>
<td><c:out value="${ localPod.position }"/></td>
<td>
<c:out value="${ localPod.traceStatus }"/>
<c:choose>
<c:when test="${ localPod.traceStatus eq '접수' }">
<p class="statusEn">HANDED OVER TO KP</p>
</c:when>
<c:when test="${ localPod.traceStatus eq '발송' }">
<p class="statusEn">MOVE TO DEPOT</p>
</c:when>
<c:when test="${ localPod.traceStatus eq '도착' }">
<p class="statusEn">ARR. AT DEPOT</p>
</c:when>
<c:when test="${ localPod.traceStatus eq '배달준비' }">
<p class="statusEn">HANDED OVER TO POST MAN</p>
</c:when>
<c:when test="${ localPod.traceStatus eq '배달완료' }">
<c:set var="dlivyCompt" value="true"/>
<p class="statusEn">DELIVERED TO CNEE</p>
</c:when>
</c:choose>
</td>
</tr>
</c:forEach>
<c:if test="${ dlivyCompt }">
<tr>
<td colspan="3" style="text-align: center;">
배송완료 - 수령인 : <c:out value="${ podInfo.recipient }"/>
</td>
</tr>
</c:if>
</tbody>
</table>
</div>
</c:if>
</div>
</c:when>
<c:otherwise>
<div class="couponList">

View File

@@ -33,6 +33,7 @@
<c:set var="order" value="${data.order}"/>
<script src="<c:url value='/js/dlvylc/dlvylc.js'/>"></script>
<script src="<c:url value='/js/sopmal/refund-popup.js'/>"></script>
<script>
$(document).ready(function() {
@@ -664,21 +665,11 @@
return;
}
$.ajax({
type:'post',
url:'<c:url value="/sopmal/mpage/ordr/selectSetleCanclPopupForm"/>',
data:{
fn_load_refund_popup('<c:url value="/sopmal/mpage/ordr/selectSetleCanclPopupForm"/>', {
'sopmalCd':sopmalCd,
'ordrInnb':ordrInnb,
'ordrDlvyInnb':ordrDlvyInnb
},
success:function(html) {
$('#refund-pop').remove();
$('#refundPopupDiv').html(html);
const popup = $('#refund-pop');
}, function(popup) {
$(popup).find('.orderRefundPop .select-box select').niceSelect();
$(popup).find('#refundAcntnb').on("input", function () {
@@ -686,7 +677,6 @@
});
$(popup).modal();
}
});
}
@@ -731,21 +721,18 @@
}
/* 배송조회 팝업 화면 호출 */
const fn_open_dlvy_popup = function (ordrDlvyInnb) {
const fn_open_dlvy_popup = function (ordrInnb, ordrDlvyInnb) {
$.ajax({
type:'post',
url:'<c:url value="/sopmal/mpage/ordr/selectDlvyInqire"/>',
data:{
ordrInnb:ordrInnb,
ordrDlvyInnb:ordrDlvyInnb
},
success:function (data) {
// $('#modalDiv').html(data);
//
// $('#delivery-check-pop').remove().modal();
$('#modalDiv').html(data);
let invcnb = JSON.parse(data.resBody.result).invcnb;
let url = 'https://www.acieshop.com/pod.php?OrderNo=' + invcnb;
window.open(url, 'acieView', 'width=605,height=700');
$('#delivery-check-pop').remove().modal();
}
});
}
@@ -1332,7 +1319,7 @@
</c:if>
</c:when>
<c:when test="${goods.ordrSttusCd > 54 && goods.ordrSttusCd < 76 && order.sknEnvrnCd ne 'POS'}">
<a href="javascript:void(0);" onclick="fn_open_dlvy_popup('<c:out value="${goods.ordrDlvyInnb}"/>');" id="inqireDlvy" class="btn-ordr-sttus btn outline sm full">배송조회</a>
<a href="javascript:void(0);" onclick="fn_open_dlvy_popup('<c:out value="${goods.ordrInnb}"/>', '<c:out value="${goods.ordrDlvyInnb}"/>');" id="inqireDlvy" class="btn-ordr-sttus btn outline sm full">배송조회</a>
<a href="javascript:void(0);" id="reqstRefund" class="btn-ordr-sttus btn gray sm full" onclick="fn_pop_m2mqna_regist('<c:out value="${order.ordrInnb}"/>');">반품신청</a>
<c:choose>
<c:when test="${goods.itemOrdrSttusCd > 54 && goods.itemOrdrSttusCd < 76 && goods.purchsDcsnAt eq 'N'}">
@@ -1481,7 +1468,7 @@
<a href="javascript:void(0);" id="reqstRefund" class="btn-ordr-sttus btn gray sm full" onclick="fn_pop_m2mqna_regist('<c:out value="${order.ordrInnb}"/>');">반품신청</a>
</c:when>
<c:when test="${goods.ordrSttusCd > 54 && goods.ordrSttusCd < 76 && order.sknEnvrnCd ne 'POS'}">
<a href="javascript:void(0);" onclick="fn_open_dlvy_popup('<c:out value="${goods.ordrDlvyInnb}"/>');" id="inqireDlvy" class="btn-ordr-sttus btn outline sm full">배송조회</a>
<a href="javascript:void(0);" onclick="fn_open_dlvy_popup('<c:out value="${goods.ordrInnb}"/>', '<c:out value="${goods.ordrDlvyInnb}"/>');" id="inqireDlvy" class="btn-ordr-sttus btn outline sm full">배송조회</a>
<a href="javascript:void(0);" id="reqstRefund" class="btn-ordr-sttus btn gray sm full" onclick="fn_pop_m2mqna_regist('<c:out value="${order.ordrInnb}"/>');">반품신청</a>
<c:choose>
<c:when test="${goods.itemOrdrSttusCd > 54 && goods.itemOrdrSttusCd < 76 && goods.purchsDcsnAt eq 'N'}">
@@ -1638,7 +1625,10 @@
</c:if>
<tr>
<th>결제금액</th>
<td><span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit} / <span class="comma">${setle.wonSetleAmt}</span>${krUnit}</td>
<td>
<span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit}
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">/ <span class="comma">${setle.wonSetleAmt}</span>${krUnit}</c:if>
</td>
</tr>
<c:if test = "${order.ordrSttusCd ne '85' && order.ordrSttusCd ne '95'}"><%--주문취소시 미노출--%>
<tr>
@@ -1705,7 +1695,10 @@
</ul>
<div class="cartOrderBox__total">
<span class="cartOrderBox__totalTh">결제금액</span>
<span class="cartOrderBox__totalTd"><span class="comma"><fmt:formatNumber value="${total.setleAmt}" pattern="#,###"/></span><span class="priceUnit">${curUnit}</span> / <span class="comma">${total.wonRlSetleAmt}</span><span class="priceUnit">${krUnit}</span></span>
<span class="cartOrderBox__totalTd">
<span class="comma"><fmt:formatNumber value="${total.setleAmt}" pattern="#,###"/></span><span class="priceUnit">${curUnit}</span>
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">/ <span class="comma">${total.wonRlSetleAmt}</span><span class="priceUnit">${krUnit}</span></c:if>
</span>
</div>
</div>
</div>

View File

@@ -870,10 +870,12 @@
<span class="comma"><c:out value="${ reTotAmt.realRefundAmt }"/></span>
<span class="priceUnit">${curUnit}</span>
</div>
<c:if test="${resultMap.result.refnd.pgCmpnyNm ne 'stripe'}">
<span class="priceSum__itemPrice">
[<span class="comma"><c:out value="${ reTotAmt.realWonRefundAmt }"/></span>
<span class="priceUnit">${krUnit}</span>]
</span>
</c:if>
</div>
</div>
</div>

View File

@@ -32,6 +32,7 @@
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
<script src="<c:url value='/js/dlvylc/dlvylc.js'/>"></script>
<script src="<c:url value='/js/sopmal/refund-popup.js'/>"></script>
<script>
$(document).ready(function() {
@@ -659,21 +660,11 @@
return;
}
$.ajax({
type:'post',
url:'<c:url value="/sopmal/mpage/ordr/selectSetleCanclPopupForm"/>',
data:{
fn_load_refund_popup('<c:url value="/sopmal/mpage/ordr/selectSetleCanclPopupForm"/>', {
'sopmalCd':sopmalCd,
'ordrInnb':ordrInnb,
'ordrDlvyInnb':ordrDlvyInnb
},
success:function(html) {
$('#refund-pop').remove();
$('#refundPopupDiv').html(html);
const popup = $('#refund-pop');
}, function(popup) {
$(popup).find('.orderRefundPop .select-box select').niceSelect();
$(popup).find('#refundAcntnb').on("input", function () {
@@ -681,7 +672,6 @@
});
$(popup).modal();
}
});
}
@@ -1491,10 +1481,12 @@
<span class="comma"><c:out value="${ reTotAmt.rlRefundAmt }"/></span>
<span class="priceUnit">${curUnit}</span>
</div>
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">
<span class="priceSum__itemPrice">
[<span class="comma"><c:out value="${ reTotAmt.realWonRefundAmt }"/></span>
<span class="priceUnit">${krUnit}</span>]
</span>
</c:if>
</div>
</div>
</div>
@@ -1786,7 +1778,10 @@
</c:if>
<tr>
<th>결제금액</th>
<td><span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit} / <span class="comma">${setle.wonSetleAmt}</span>${krUnit}</td>
<td>
<span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit}
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">/ <span class="comma">${setle.wonSetleAmt}</span>${krUnit}</c:if>
</td>
</tr>
<c:if test = "${order.ordrSttusCd ne '85' && order.ordrSttusCd ne '95'}"><%--주문취소시 미노출--%>
<tr>

View File

@@ -521,13 +521,14 @@
});
/* 결제정보 결제수단 버튼 선택 이벤트 */
$('input[name="pg"]').on('click', function() {
$('input[name="pg"]').on('click', function(event, skipDefaultMethod) {
const form = $(this).closest('#setleForm')
const id = $(this).attr('id');
const pgCmpnyNm = $(this).val();
$(form).find('.pgContent').hide();
$(form).find('#' + id + 'Content').show();
$('.cartOrderBox__totalKr').show();
//$(form).find('#setleSetupTyCd').val() === '01' ? $(form).find('#pg04Content').show() : $(form).find('#pg03Content').show();
if($(form).find('#setleSetupTyCd').val() === '01'){$(form).find('#pg04Content').show();}
@@ -573,12 +574,22 @@
});
$(form).find('#setleTyCd').val('03');
} else if('st01' === id){ //Stripe
$('.cartOrderBox__totalKr').hide();
} else {
$(form).find('#setleTyCd').val('');
$('.order-method-normal__btn').removeClass('active');
$('.order-method-normal__content').hide();
}
// 통화를 선택하면 사용 가능한 첫 결제수단을 기존 클릭 처리로 선택한다.
// 결제수단 버튼에서 라디오를 갱신할 때는 재귀 선택을 생략한다.
if (!skipDefaultMethod && ['st01', 'pg03', 'pg04', 'pg06'].includes(id)) {
$(form).find('#' + id + 'Content')
.find('.order-method-normal__btn:visible:not(:disabled)')
.first().trigger('click');
}
});
/* 결제정보 > 일반결제 > 결제수단 버튼 선택 이벤트 */
@@ -587,10 +598,8 @@
const content = $('.order-method-normal__content');
const useCashMlgAmt = $('#useCashMlgAmt').val();
//$('#setleSetupTyCd').val() === '01' ? $('#pg04').click() : $('#pg03').click();
if($('#setleSetupTyCd').val() === '01'){$('#pg04').click();}
else if($('#setleSetupTyCd').val() === '02'){$('#pg03').click();}
else if($('#setleSetupTyCd').val() === '03'){$('#pg06').click();}
const pgId = $(this).closest('.pgContent').attr('id').replace(/Content$/, '');
$('#' + pgId).trigger('click', [true]);
$('.order-method-normal__btn').removeClass('active');
$(this).addClass('active');
@@ -2087,7 +2096,7 @@
tr += ' <span class="cartItem__discountPrice"><span class="cartItem__discountMinus">(-)</span><span class="comma product-dscntAmt-text">' + (goods.dscntAmt).toLocaleString() + '</span><span class="priceUnit">' + curUnit + '</span></span>';
tr += ' </td>';
tr += ' <td>';
tr += ' <span class="cartItem__beforePrice"><span class="comma product-subCnsmrpric">' + (goods.subCnsmrpric).toLocaleString() + '</span>' + curUnit + '</span>';
tr += ' <span class="cartItem__beforePrice' + (goods.subCnsmrpric == goods.dscntApplyAmt ? ' visually-hidden' : '') + '"><span class="comma product-subCnsmrpric">' + (goods.subCnsmrpric).toLocaleString() + '</span>' + curUnit + '</span>';
tr += ' <span class="cartItem__afterPrice"><span class="comma product-dscntApplyAmt">' + (goods.dscntApplyAmt).toLocaleString() + '</span><span class="priceUnit">' + curUnit + '</span></span>';
tr += ' </td>';
tr += '</tr>';
@@ -3030,7 +3039,7 @@
return false;
}
if ('kcp' === pgCmpnyNm || 'toss' === pgCmpnyNm || 'kiwoom' === pgCmpnyNm) {
if ('kcp' === pgCmpnyNm || 'toss' === pgCmpnyNm || 'kiwoom' === pgCmpnyNm || 'stripe' === pgCmpnyNm) {
const div = $('#setleForm').find('.order-method-normal');
if (!$(div).find('.order-method-normal__btn-container button').hasClass('active')) {
@@ -4239,11 +4248,27 @@
</c:if>
<%-- 퀵계좌이체 끝 --%>
<%-- Stripe 시작 --%>
<c:if test="${'Y' eq payInfo.stripeUseAt}">
<div class="custom-radio is-medium">
<input type="radio" name="pg" id="st01" value="stripe">
<label for="st01">엔화(¥) 결제</label>
</div>
<div id="st01Content" class="pgContent order-method-normal" <%-- style="display: none"--%>>
<div class="order-method-normal__btn-container">
<button type="button" name="01" id="stripe" class="order-method-normal__btn gift_pay">
<div class="order-method-normal__icon order-method-normal__icon--card"></div>신용카드
</button>
</div>
</div>
</c:if>
<%-- Stripe 끝 --%>
<%-- toss 결제 시작 --%>
<c:if test="${'02' eq payInfo.setleSetupTyCd}">
<div class="custom-radio is-medium">
<input type="radio" name="pg" id="pg03" value="toss">
<label for="pg03">일반결제</label>
<label for="pg03">원화(₩) 결제</label>
</div>
<div id="pg03Content" class="pgContent order-method-normal" <%-- style="display: none"--%>>
<div class="order-method-normal__btn-container">
@@ -4375,7 +4400,7 @@
<c:if test="${'01' eq payInfo.setleSetupTyCd}">
<div class="custom-radio is-medium">
<input type="radio" name="pg" id="pg04" value="kcp">
<label for="pg04">일반결제</label>
<label for="pg04">원화(₩) 결제</label>
</div>
<div id="pg04Content" class="pgContent order-method-normal" <%-- style="display: none"--%>>
<div class="order-method-normal__btn-container">
@@ -4507,7 +4532,7 @@
<c:if test="${'03' eq payInfo.setleSetupTyCd}">
<div class="custom-radio is-medium">
<input type="radio" name="pg" id="pg06" value="kiwoom">
<label for="pg06">일반결제</label>
<label for="pg06">원화(₩) 결제</label>
</div>
<div id="pg06Content" class="pgContent order-method-normal" <%-- style="display: none"--%>>
<div class="order-method-normal__btn-container">
@@ -4656,11 +4681,11 @@
<span class="cartOrderBox__td"><span class="cartOrderBox__discountMinus">(-)</span><span id="dscntAmtSapn" class="comma">0</span><span class="priceUnit">${curUnit}</span></span>
</li>
</ul>
<div class="cartOrderBox__total" style="margin-bottom: 5px;">
<div class="cartOrderBox__total">
<span class="cartOrderBox__totalTh">총 결제금액</span>
<span class="cartOrderBox__td"><span id="setleAmtSapn" class="comma">0</span><span class="priceUnit">${curUnit}</span></span>
</div>
<div class="cartOrderBox__total" style="margin-top: 5px;">
<div class="cartOrderBox__total cartOrderBox__totalKr" style="margin-top: 10px;">
<span class="cartOrderBox__totalTh"></span>
<span class="cartOrderBox__totalTd"><span id="setleAmtKrSapn" class="comma">0</span><span class="priceUnit">${krUnit}</span></span>
</div>

View File

@@ -539,7 +539,10 @@
</c:if>
<tr>
<th>결제금액</th>
<td><span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit} / <span class="comma"><fmt:formatNumber value="${setle.wonSetleAmt}" pattern="#,###"/></span>${krUnit}</td>
<td>
<span class="comma"><fmt:formatNumber value="${setle.setleAmt}" pattern="#,###"/></span>${curUnit}
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">/ <span class="comma"><fmt:formatNumber value="${setle.wonSetleAmt}" pattern="#,###"/></span>${krUnit}</c:if>
</td>
</tr>
<tr>
<th>결제일시</th>
@@ -623,7 +626,10 @@
</ul>
<div class="cartOrderBox__total">
<span class="cartOrderBox__totalTh">결제금액</span>
<span class="cartOrderBox__totalTd"><span class="comma"><fmt:formatNumber value="${total.setleAmt}" pattern="#,###"/></span><span class="priceUnit">${curUnit}</span> / <span class="comma"><fmt:formatNumber value="${total.wonRlSetleAmt}" pattern="#,###"/></span><span class="priceUnit">${krUnit}</span></span>
<span class="cartOrderBox__totalTd">
<span class="comma"><fmt:formatNumber value="${total.setleAmt}" pattern="#,###"/></span><span class="priceUnit">${curUnit}</span>
<c:if test="${data.setleList[0].pgCmpnyNm ne 'stripe'}">/ <span class="comma"><fmt:formatNumber value="${total.wonRlSetleAmt}" pattern="#,###"/></span><span class="priceUnit">${krUnit}</span></c:if>
</span>
</div>
</div>
</div>

View File

@@ -0,0 +1,66 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : OrsrReqstStripeR.jsp
Description : Stripe 주문 요청
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-09-17 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<!-- <meta charset="UTF-8"> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Pragma" content="no-cache" />
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script type="text/javascript" language="javascript">
$(document).ready(function() {
$.ajax({
url : "<c:url value="/sopmal/stripe/checkout"/>",
type : "POST",
data : $('#order_info').serialize(),
success : function(res) {
console.log(res);
const data = JSON.parse(res.resBody.result);
window.location.replace(data.redirectUrl);
}
});
});
</script>
</head>
<body>
<%-- Controller에 넘어가는 값 --%>
<form name="order_info" id="order_info">
<input type="hidden" name="sopmalCd" class="sopmalCd" value="${data.setle.sopmalCd}" />
<input type="hidden" name="ordrInnb" class="ordrInnb" value="${data.setle.ordrInnb}" />
<input type="hidden" name="pgCmpnyNm" class="pgCmpnyNm" value="${data.setle.pgCmpnyNm}" />
<input type="hidden" name="setleTyCd" class="setleTyCd" value="${data.setle.setleTyCd}" />
<input type="hidden" name="goodsNm" class="goodsNm" value="${data.setle.goodsNm}"/>
<input type="hidden" name="setleAmt" class="setleAmt" value="${data.setle.wonSetleAmt}"/>
<input type="hidden" name="jpSetleAmt" class="jpSetleAmt" value="${data.setle.setleAmt}"/>
<input type="hidden" name="ordrrNm" class="ordrrNm" value="${data.ordr.ordrrNm}"/>
<input type="hidden" name="ordrrEmail" class="ordrrEmail" value="${data.ordr.ordrrEmail}"/>
<input type="hidden" name="ordrrMbtlnb" class="ordrrMbtlnb" value="${data.ordr.ordrrMbtlnb}"/>
<input type="hidden" name="mbrId" class="mbrId" value="${data.ordr.mbrId}"/>
<input type="hidden" name="mbrInnb" class="mbrInnb" value="${data.ordr.mbrInnb}" />
<input type="hidden" name="sesionId" class="sesionId" value="${data.ordr.sesionId}" />
<input type="hidden" name="subsvcInnb" id="subsvcInnb" value="${subsvcInnb}"/>
</form>
</body>
</html>

View File

@@ -0,0 +1,64 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : PayStripeCnclC.jsp
Description : Stripe 결제 실패창
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-09-17 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>결제 실패</title>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script>
$(document).ready(function() {
var returnUrl = '${returnUrl}';
var status = '${status}';
var payment_status = '${payment_status}';
var customer_details = '${customer_details}';
let form = $('<form></form>');
$(form).attr('method', 'post');
$(form).attr('action', returnUrl);
history.replaceState(null, '', returnUrl);
$(form).append($('<input/>', {type:'hidden', name:'sopmalCd', value:'${sopmalCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrInnb', value:'${ordrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'pgCmpnyNm', value:'${pgCmpnyNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleTyCd', value:'${setleTyCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'goodsNm', value:'${goodsNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleAmt', value:'${setleAmt}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrNm', value:'${ordrrNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrEmail', value:'${ordrrEmail}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrMbtlnb', value:'${ordrrMbtlnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrId', value:'${mbrId}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrInnb', value:'${mbrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'sesionId', value:'${sesionId}'}));
$(form).append($('<input/>', {type:'hidden', name:'message', value:'${message}'}));
$(form).append($('<input/>', {type:'hidden', name:'subsvcInnb', value:'${subsvcInnb}'}));
$(form).appendTo('body');
$(form).submit().remove();
});
</script>
</head>
<body>
<section>
<h1>결제 취소</h1>
</section>
</body>
</html>

View File

@@ -0,0 +1,108 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : PayStripeSucsC.jsp
Description : Stripe 결제 성공창
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-09-17 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>결제 결과 확인 중</title>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<style>
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
background: #f8fafc;
color: #202938;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
.payment-progress {
padding: 32px 20px;
text-align: center;
}
.payment-progress__spinner {
width: 44px;
height: 44px;
margin: 0 auto 24px;
border: 4px solid #e2e8f0;
border-top-color: #0075d4;
border-radius: 50%;
animation: payment-spin 0.9s linear infinite;
}
.payment-progress h1 {
margin: 0 0 10px;
font-size: 20px;
line-height: 1.5;
word-break: keep-all;
}
.payment-progress p {
margin: 0;
color: #64748b;
font-size: 15px;
line-height: 1.6;
}
@keyframes payment-spin {
to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
.payment-progress__spinner { animation: none; }
}
</style>
<script src="<c:url value='/pc/vendor/jquery-3.7.1.min.js'/>"></script>
<script>
$(document).ready(function() {
var returnUrl = '${returnUrl}';
var status = '${status}';
var payment_status = '${payment_status}';
var customer_details = '${customer_details}';
let form = $('<form></form>');
$(form).attr('method', 'post');
$(form).attr('action', returnUrl);
history.replaceState(null, '', returnUrl);
$(form).append($('<input/>', {type:'hidden', name:'sopmalCd', value:'${sopmalCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrInnb', value:'${ordrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'pgCmpnyNm', value:'${pgCmpnyNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleTyCd', value:'${setleTyCd}'}));
$(form).append($('<input/>', {type:'hidden', name:'goodsNm', value:'${goodsNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'setleAmt', value:'${setleAmt}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrNm', value:'${ordrrNm}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrEmail', value:'${ordrrEmail}'}));
$(form).append($('<input/>', {type:'hidden', name:'ordrrMbtlnb', value:'${ordrrMbtlnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrId', value:'${mbrId}'}));
$(form).append($('<input/>', {type:'hidden', name:'mbrInnb', value:'${mbrInnb}'}));
$(form).append($('<input/>', {type:'hidden', name:'sesionId', value:'${sesionId}'}));
$(form).append($('<input/>', {type:'hidden', name:'message', value:'${message}'}));
$(form).append($('<input/>', {type:'hidden', name:'subsvcInnb', value:'${subsvcInnb}'}));
$(form).appendTo('body');
$(form).submit().remove();
});
</script>
</head>
<body>
<section class="payment-progress" role="status" aria-live="polite">
<div class="payment-progress__spinner" aria-hidden="true"></div>
<h1>결제 결과를 확인하고 있습니다.</h1>
<p>잠시만 기다려 주세요.</p>
</section>
</body>
</html>

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