Compare commits

..

70 Commits

Author SHA1 Message Date
김현욱
305d5d226c 배송비 계산 수정(4) 2026-02-12 15:15:07 +09:00
김현욱
8a5583b600 배송비 계산 수정(3) 2026-02-11 13:41:15 +09:00
김현욱
5db37dfafb 배송비 계산 수정(2) 2026-02-11 12:20:51 +09:00
이대환
bcf64f0f92 fix : 주문결제 > 배송지 정보 세팅 - 배송지역코드, 개인통관부호, 도도부현코드 추가 2026-02-11 11:44:45 +09:00
jazz
2763d956a8 fix : 관리자 전체 주문목록 - 주문->출고처리 목록조회 2026-02-11 10:39:25 +09:00
jazz
96670ab6a5 fix : 관리자 구독서비스 구독자 조회 팝업 2026-02-10 17:58:37 +09:00
김현욱
1097660b22 배송비 계산 수정(1) 2026-02-10 16:42:28 +09:00
jazz
12ae420a48 Merge remote-tracking branch 'origin/master' 2026-02-10 16:39:09 +09:00
jazz
1a7cab2c9c fix : 관리자 구독서비스 구독자 조회 팝업 2026-02-10 16:39:00 +09:00
이대환
072704c995 fix : 구독서비스 주문/배송 - 반품 안내문구 2026-02-10 16:34:56 +09:00
이대환
cb022e9841 Merge remote-tracking branch 'origin/master' 2026-02-10 14:48:39 +09:00
이대환
4939bf7954 fix : 배송지 등록/수정 - 도도부현코드 수정 2026-02-10 14:48:29 +09:00
jazz
55192f8ccc fix : 사용자 마이페이지>일반 주문/배송 구독서비스 제외 2026-02-10 14:28:20 +09:00
jazz
780f061592 Merge remote-tracking branch 'origin/master' 2026-02-10 13:48:38 +09:00
jazz
daf9770fbe fix : 관리자 주문 전체주문조회, 출고조회 메뉴 구독서비스 제외 2026-02-10 13:48:32 +09:00
이대환
86c7b59070 fix : 구독서비스 주문/배송 상세조회(모바일) 2026-02-10 10:27:40 +09:00
jazz
190f81d5c6 fix : 관리자 구독서비스 구독자 조회 2026-02-09 16:51:14 +09:00
jazz
e6bf779b11 fix : 관리자 구독서비스 상품변경 관리 2026-02-09 11:36:45 +09:00
이대환
e9b53f049e fix : 구독서비스 주문/배송 상세조회 2026-02-09 10:19:49 +09:00
이대환
a1c1b77c86 fix : 구독서비스 주문/배송 일본어 제거 2026-02-09 10:03:33 +09:00
jazz
f82df1e5cf Merge remote-tracking branch 'origin/master' 2026-02-06 16:22:29 +09:00
jazz
006d3f5a09 fix : 관리자 구독서비스 상품준비 관리 2026-02-06 16:22:16 +09:00
김현욱
844d539166 배송그룹 수정 2026-02-06 15:57:12 +09:00
이대환
543a05b5f5 fix : 구독서비스 주문/배송 2026-02-05 18:30:43 +09:00
이대환
f5dfdb2f78 fix : 배송지 등록/수정 - 일본 주소 api 호출 스크립트 개선 2026-02-05 18:26:59 +09:00
이대환
3b8eba8e0b fix : 배송지 등록/수정 - 일본 주소(일본어) 옵션 추가(모바일) 2026-02-04 17:59:00 +09:00
이대환
df6340658e fix : 배송지 등록/수정 - 일본 주소(일본어) 옵션 추가 2026-02-04 11:19:12 +09:00
jazz
f8282b55e0 fix : 관리자 구독서비스 목록 2026-02-04 10:23:39 +09:00
jazz
c567cf4d4c fix : 관리자 구독서비스 등록(복사) 2026-02-03 10:02:58 +09:00
jazz
acf929e0eb fix : 관리자 구독서비스 수정 2026-02-02 15:05:58 +09:00
jazz
8f131dcec4 fix : 관리자 구독서비스 수정 2026-02-02 14:39:31 +09:00
이대환
cbc4c6bee5 일본 주소 api callback 테스트 2026-02-02 12:04:20 +09:00
이대환
a7dd13fc65 일본 주소 api 테스트 2026-02-02 10:11:42 +09:00
이대환
252a27601e fix : 배송지 등록/수정 수정
fix : 상품 메뉴(카테고리) column 수 변경
2026-01-30 18:37:28 +09:00
jazz
b654dcb447 fix : 관리자 구독서비스 삭제 및 상세 2026-01-29 18:20:58 +09:00
jazz
22d45afeb5 fix : 관리자 구독서비스 삭제 및 상세 2026-01-29 18:16:54 +09:00
이대환
36b0f963c2 fix : 메인화면 미리보기 기능 오류 수정 요청 2026-01-29 12:26:26 +09:00
이대환
77060045ca fix : 쇼핑몰 구독서비스 관련(모바일) 2026-01-29 12:08:55 +09:00
jazz
c0d7079e37 fix : 관리자 구독서비스 목록 2026-01-27 12:07:17 +09:00
이대환
bda09e6e4f fix : 쇼핑몰 구독서비스 관련 2026-01-23 16:47:37 +09:00
jazz
4f920c0919 fix : 관리자 구독서비스 목록 2026-01-23 16:44:37 +09:00
이대환
d41b6a45f6 fix : 구독서비스 관련 추가 2026-01-22 18:21:26 +09:00
jazz
a1a107cfe1 fix : 마이페이지 구독서비스 주문/배송 목록조회 화면 2026-01-22 14:58:33 +09:00
이대환
542ec44a3c fix : 상점관리 > 쇼핑몰관리 - 1엔 환율, 구독서비스 안내문구 추가 2026-01-22 14:00:26 +09:00
jazz
3346af5d1f fix : 메일서버 도메인변경 2026-01-22 10:44:21 +09:00
김현욱
df0cba8888 상품옵션 변경 시 예외처리 추가 2026-01-16 15:22:12 +09:00
이대환
5cc24e3fc9 fix : footer 템플릿 문구 변경
fix : 추가 배송비 문구 수정(오키나와,홋카이도 → 도서산간+제주도)
2026-01-16 12:21:21 +09:00
jazz
60f083a22f fix : batch서버 ip추가 2026-01-15 13:48:23 +09:00
jazz
72328ab9f8 fix : 다운로드 항목설정 오류 수정 2026-01-14 17:14:44 +09:00
jazz
eee0e423f8 fix : batch에서 BO호출할 수 있도록 security 수정 2026-01-14 15:21:01 +09:00
jazz
73690055e2 fix : 결제확인 상태에서 상품준비버튼만 표시 2026-01-08 15:05:18 +09:00
jazz
a43c0b5ae3 fix : 메일서버 주소변경 2026-01-07 14:58:11 +09:00
이대환
46b465c74b fix : 화폐단위 변경 (원 → 円, 마일리지 → 점)
fix : footer 템플릿 문구 변경
2026-01-06 15:27:53 +09:00
김현욱
8797be6b74 사용자 로그인 회원가입 표시(모바일) 2026-01-05 16:41:24 +09:00
김현욱
3e409a3408 DB 서버 변경 2026-01-05 15:51:01 +09:00
이대환
27b816b332 fix : 주문/배송조회 > 주문상세 - 배송완료(구매확정)의 경우 반품신청 버튼 추가 2026-01-02 18:21:32 +09:00
jazz
be349e305b Merge remote-tracking branch 'origin/master' 2026-01-02 17:07:08 +09:00
jazz
9407a4fb78 fix : 1:1문의 수정 2026-01-02 17:06:57 +09:00
김현욱
deb1ab8174 장바구니 네이버페이 제거(1) 2026-01-02 16:48:00 +09:00
김현욱
d9a33f8dc5 회원정보 수정에서 주소 제거 2026-01-02 15:53:43 +09:00
김현욱
abf74d996b 장바구니 네이버페이 제거 2026-01-02 15:52:05 +09:00
이대환
4e20d28c4d fix : 주문/배송조회 - 주문 액션 버튼 제거(주문취소, 배송지변경, 배송조회, 구매확정 등) 2026-01-02 15:33:12 +09:00
이대환
085a75593a 구독서비스 페이지 추가
fix : 화폐단위 변경 (원 → 円)
fix : 관리자 상품 상세 - 공유버튼 제거
fix : 관리자 상품 등록/복사재등록, 구매이벤트 - 스타일 일부 변경
fix : 사용자 주문 상세 - 스타일 일부 변경
2026-01-02 15:26:19 +09:00
jazz
ac1db26212 fix : 로그처리 2026-01-02 10:54:28 +09:00
jazz
c3ed788b0a fix : POOL사이즈 변경 2026-01-02 10:22:51 +09:00
jazz
1e1f70ff73 fix : 모바일 로그아웃 2025-12-31 14:46:54 +09:00
jazz
05e09659b2 fix : 로그인 및 게시판 오류 2025-12-31 11:30:22 +09:00
김현욱
65d920874f 동일상품 여러개 주문 시 배송료 누적 계산(1) 2025-12-30 16:51:25 +09:00
김현욱
54c0266824 Merge remote-tracking branch 'origin/master' 2025-12-30 14:54:55 +09:00
김현욱
3f812a4bb4 관리자 대시보드 대체(대시보드 -> 게시글) 메뉴사라짐 수정 2025-12-30 14:54:50 +09:00
141 changed files with 16020 additions and 864 deletions

View File

@@ -34,7 +34,7 @@ public class ImagePaginationRenderer extends AbstractPaginationRenderer implemen
//previousPageLabel = "<li><a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \"><img src=\"" + servletContext.getContextPath() + "/images/egovframework/com/cmm/mod/icon/icon_prev.gif\" alt=\"이전\" border=\"0\"/></a></li>"; //previousPageLabel = "<li><a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \"><img src=\"" + servletContext.getContextPath() + "/images/egovframework/com/cmm/mod/icon/icon_prev.gif\" alt=\"이전\" border=\"0\"/></a></li>";
previousPageLabel = "<button class=\"pagination__item prev\" onclick=\"{0}({1});return false; \"><span class=\"visually-hidden\">이전 페이지로</span></button>"; previousPageLabel = "<button class=\"pagination__item prev\" onclick=\"{0}({1});return false; \"><span class=\"visually-hidden\">이전 페이지로</span></button>";
//currentPageLabel = "<li><strong>{0}</strong></li>"; //currentPageLabel = "<li><strong>{0}</strong></li>";
currentPageLabel = "<li><button class=\"pagination__item active\"><span>{0}</span></button></li>"; currentPageLabel = "<li><button class=\"pagination__item active\" onclick=\"return false; \"><span>{0}</span></button></li>";
//otherPageLabel = "<li><a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \">{2}</a></li>"; //otherPageLabel = "<li><a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \">{2}</a></li>";
otherPageLabel = "<li><button class=\"pagination__item\" onclick=\"{0}({1});return false; \"><span>{2}</span></button></li>"; otherPageLabel = "<li><button class=\"pagination__item\" onclick=\"{0}({1});return false; \"><span>{2}</span></button></li>";
//nextPageLabel = "<li>&#160;<a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \"><img src=\"" + servletContext.getContextPath() + "/images/egovframework/com/cmm/mod/icon/icon_next.gif\" alt=\"다음\" border=\"0\"/></a></li>"; //nextPageLabel = "<li>&#160;<a href=\"?pageIndex={1}\" onclick=\"{0}({1});return false; \"><img src=\"" + servletContext.getContextPath() + "/images/egovframework/com/cmm/mod/icon/icon_next.gif\" alt=\"다음\" border=\"0\"/></a></li>";

View File

@@ -286,6 +286,13 @@ public class BOMaMtngController {
return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND); return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND);
} }
} else { } else {
// if (CollectionUtils.isEmpty(multiOrdrDlvylc)) {
// log.info("배송지 정보를 찾을 수 없습니다.");
// content.put("result","Y");
// content.put("message", "배송지 정보를 찾을 수 없습니다.");
// // throw new WnbtRestException("주문유형 정보를 찾을 수 없습니다.");
// return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND);
// }
if (CollectionUtils.isEmpty(shipping)) { if (CollectionUtils.isEmpty(shipping)) {
log.info("배송지 정보를 찾을 수 없습니다."); log.info("배송지 정보를 찾을 수 없습니다.");
content.put("result","Y"); content.put("result","Y");
@@ -322,27 +329,91 @@ public class BOMaMtngController {
String[] receptMbtlnbArray = null; // 배송지 받는이 휴대폰번호 String[] receptMbtlnbArray = null; // 배송지 받는이 휴대폰번호
if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송 if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송
if ( if (!CollectionUtils.isEmpty(multiOrdrDlvylc)) {
StringUtil.isEmpty((String) shipping.get("dlvylcZip")) ||
StringUtil.isEmpty((String) shipping.get("dlvylcAdresDvCd")) || // 배송지 리스트
( "01".equals(shipping.get("dlvylcAdresDvCd")) && StringUtil.isEmpty((String) shipping.get("dlvylcRnmAdres")) ) || List<LinkedHashMap<String, Object>> dlvylcListMulti = (List<LinkedHashMap<String, Object>>) multiOrdrDlvylc.get("dlvylc");
( "02".equals(shipping.get("dlvylcAdresDvCd")) && StringUtil.isEmpty((String) shipping.get("dlvylcLnbAdres")) ) ||
StringUtil.isEmpty((String) shipping.get("dlvylcAdresDtl")) /** ----------------------------------------------- 배송지별 주문 상품 수량 검사 START ----------------------------------------------- */
) { content = checkDistributedQyMatchesOrder(goodsList, dlvylcListMulti);
content.put("result","Y"); if (!"0".equals(content.get("status"))) {
content.put("message", "배송지 정보를 찾을 수 없습니다. 다시 시도해 주세요."); return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND);
return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND); }
/** ----------------------------------------------- 배송지별 주문 상품 수량 검사 END ----------------------------------------------- */
// 부정판매 체크를 위한 배송지 정렬
if (!CollectionUtils.isEmpty(dlvylcListMulti)) {
boolean hasInvalidAddress = dlvylcListMulti.stream().anyMatch(map -> {
String dlvylcZip = StringUtil.isNullToString(map.get("dlvylcZip"));
String adresDvCd = StringUtil.isNullToString(map.get("dlvylcAdresDvCd"));
String dlvylcLnbAdres = StringUtil.isNullToString(map.get("dlvylcLnbAdres"));
String dlvylcRnmAdres = StringUtil.isNullToString(map.get("dlvylcRnmAdres"));
String adresDtl = StringUtil.isNullToString(map.get("dlvylcAdresDtl"));
return StringUtil.isEmpty(dlvylcZip)
|| StringUtil.isEmpty(adresDvCd)
|| ("01".equals(adresDvCd) && StringUtil.isEmpty(dlvylcRnmAdres))
|| ("02".equals(adresDvCd) && StringUtil.isEmpty(dlvylcLnbAdres))
|| StringUtil.isEmpty(adresDtl);
});
if (hasInvalidAddress) {
content.put("result","Y");
content.put("message", "배송지 정보를 찾을 수 없습니다. 다시 시도해 주세요.");
return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND);
}
List<String> adresList = dlvylcListMulti.stream()
.map(map -> {
String adresDvCd = StringUtil.isNullToString(map.get("dlvylcAdresDvCd"));
String adresDtl = StringUtil.isNullToString(map.get("dlvylcAdresDtl"));
String dlvylcLnbAdres = StringUtil.isNullToString(map.get("dlvylcLnbAdres"));
String dlvylcRnmAdres = StringUtil.isNullToString(map.get("dlvylcRnmAdres"));
String adresMulti;
if ("01".equals(adresDvCd)) {
adresMulti = dlvylcRnmAdres + " " + adresDtl;
} else {
adresMulti = dlvylcLnbAdres + " " + adresDtl;
}
return adresMulti;
})
.collect(Collectors.toList());
adresArray = adresList.toArray(new String[0]);
List<String> receptMbtlnbList = dlvylcListMulti.stream()
.map(map -> {
return StringUtil.isNullToString(map.get("recpntMbtlnb"));
})
.collect(Collectors.toList());
receptMbtlnbArray = receptMbtlnbList.toArray(new String[0]);
}
} }
// if (
String dlvylcAdresDvCd = (String) shipping.get("dlvylcAdresDvCd"); // StringUtil.isEmpty((String) shipping.get("dlvylcZip")) ||
String dlvylcLnbAdres = (String) shipping.get("dlvylcLnbAdres"); // StringUtil.isEmpty((String) shipping.get("dlvylcAdresDvCd")) ||
String dlvylcRnmAdres = (String) shipping.get("dlvylcRnmAdres"); // ( "01".equals(shipping.get("dlvylcAdresDvCd")) && StringUtil.isEmpty((String) shipping.get("dlvylcRnmAdres")) ) ||
String dlvylcAdresDtl = (String) shipping.get("dlvylcAdresDtl"); // ( "02".equals(shipping.get("dlvylcAdresDvCd")) && StringUtil.isEmpty((String) shipping.get("dlvylcLnbAdres")) ) ||
// StringUtil.isEmpty((String) shipping.get("dlvylcAdresDtl"))
adres = "01".equals(dlvylcAdresDvCd) ? dlvylcRnmAdres + " " + dlvylcAdresDtl : dlvylcLnbAdres + " " + dlvylcAdresDtl; // ) {
// content.put("result","Y");
String recpntMbtlnb = StringUtil.isNullToString(shipping.get("recpntMbtlnb")); // content.put("message", "배송지 정보를 찾을 수 없습니다. 다시 시도해 주세요.");
receptMbtlnbArray = new String[]{recpntMbtlnb}; // return ApiResponse.of(content).ifPresentOrElse(HttpStatus.OK, HttpStatus.NOT_FOUND);
// }
//
// String dlvylcAdresDvCd = (String) shipping.get("dlvylcAdresDvCd");
// String dlvylcLnbAdres = (String) shipping.get("dlvylcLnbAdres");
// String dlvylcRnmAdres = (String) shipping.get("dlvylcRnmAdres");
// String dlvylcAdresDtl = (String) shipping.get("dlvylcAdresDtl");
//
// adres = "01".equals(dlvylcAdresDvCd) ? dlvylcRnmAdres + " " + dlvylcAdresDtl : dlvylcLnbAdres + " " + dlvylcAdresDtl;
//
// String recpntMbtlnb = StringUtil.isNullToString(shipping.get("recpntMbtlnb"));
// receptMbtlnbArray = new String[]{recpntMbtlnb};
} else if ("05".equals(ordrTyCd)) { // 여러곳 배송 } else if ("05".equals(ordrTyCd)) { // 여러곳 배송
if (!CollectionUtils.isEmpty(multiOrdrDlvylc)) { if (!CollectionUtils.isEmpty(multiOrdrDlvylc)) {

View File

@@ -406,6 +406,8 @@ public class BOMaMtngService {
List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList"); // 상품정보 List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList"); // 상품정보
LinkedHashMap enuri = (LinkedHashMap) param.get("enuri"); // 할인정보 LinkedHashMap enuri = (LinkedHashMap) param.get("enuri"); // 할인정보
log.debug("selectBOPreOrderValidationList-goodsList: {}",goodsList);
//사용한 장바구니 쿠폰 //사용한 장바구니 쿠폰
//비회원의 경우 enuri 자체가 없어서 isEmpty 확인 //비회원의 경우 enuri 자체가 없어서 isEmpty 확인
List<LinkedHashMap> usedCartCouponList = new ArrayList<>(); List<LinkedHashMap> usedCartCouponList = new ArrayList<>();

View File

@@ -138,6 +138,12 @@ public class BOMaSopmalVO extends AbstractVO {
/** 주문 자동 구매확정 기간 */ /** 주문 자동 구매확정 기간 */
private String ordrAtmcPurchsDcsnPd; private String ordrAtmcPurchsDcsnPd;
/** 1엔 환율(살때) */
private String buyRate;
/** 1엔 환율(팔때) */
private String sellRate;
/** 마일리지 보유 사용 금액 */ /** 마일리지 보유 사용 금액 */
private String mlgHoldUseAmt; private String mlgHoldUseAmt;
@@ -495,6 +501,9 @@ public class BOMaSopmalVO extends AbstractVO {
/** 회원가입 주요문구 */ /** 회원가입 주요문구 */
private String joinComptWords; private String joinComptWords;
/** 구독서비스 안내문구 */
private String subsvcGuidanceWords;
/** 회원등급 정보 */ /** 회원등급 정보 */
private String mbrGradGroupNm; private String mbrGradGroupNm;
private String pageDv; private String pageDv;

View File

@@ -81,19 +81,6 @@ public class BOOrderService {
log.debug("결제정보 => {} ", new Gson().toJson(setle)); log.debug("결제정보 => {} ", new Gson().toJson(setle));
log.debug("사은품 => {} ", new Gson().toJson(prsntList)); log.debug("사은품 => {} ", new Gson().toJson(prsntList));
/** 여러곳 배송 배송지 세팅 시작 */
LinkedHashMap<String, Object> multiOrdrDlvylcMap = new LinkedHashMap<>();
List<LinkedHashMap<String, Object>> dlvylcListMulti = new ArrayList<>();
multiOrdrDlvylcMap = (LinkedHashMap) param.get("multiOrdrDlvylc");
log.debug("multiOrdrDlvylcMap : {}", multiOrdrDlvylcMap);
if (!CollectionUtils.isEmpty(multiOrdrDlvylcMap)) {
// 배송지 리스트
dlvylcListMulti = (List<LinkedHashMap<String, Object>>) multiOrdrDlvylcMap.get("dlvylc");
log.debug("dlvylcListMulti : {}", dlvylcListMulti);
}
/** 여러곳 배송 배송지 세팅 종료 */
String sopmalCd = ""; String sopmalCd = "";
if("01".equals(user.getSysDvCd())){ if("01".equals(user.getSysDvCd())){
sopmalCd = user.getSopmalCd(); sopmalCd = user.getSopmalCd();
@@ -103,6 +90,85 @@ public class BOOrderService {
String ordrTyCd = (String) param.get("ordrTyCd"); String ordrTyCd = (String) param.get("ordrTyCd");
log.debug("insertMngrOrdrRegist-param : {}", param);
/* *****************************
0. 여러곳 배송 배송지 세팅
***************************** */
/** 여러곳 배송 배송지 세팅 시작 */
LinkedHashMap<String, Object> multiOrdrDlvylcMap = new LinkedHashMap<>();
List<LinkedHashMap<String, Object>> dlvylcListMulti = new ArrayList<>();
multiOrdrDlvylcMap = (LinkedHashMap) param.get("multiOrdrDlvylc");
log.debug("multiOrdrDlvylcMap : {}", multiOrdrDlvylcMap);
if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "04".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원 개인결제, 정기배송
for(int i=0;i<goodsList.size();i++) {
int goodsQy = (int) goodsList.get(i).get("qy");
int dlvyGroupInnb = (int) goodsList.get(i).get("dlvyGroupInnb");
String sopmalCode = sopmalCd;
DataMap shippingParam = new DataMap() {{
put("dlvyGroupInnb", dlvyGroupInnb);
put("sopmalCd", sopmalCode);
}};
DataMap shippingGrouping = mapper.selectShippingGrouping(shippingParam);
BigDecimal itemDftDlvyAmt = (BigDecimal) shippingGrouping.get("dftDlvyAmt"); // 기본배송비
BigDecimal itemDlvyAmt = itemDftDlvyAmt; // 배송비
// String dlvyAreaAditAt = (String) shippingGrouping.get("dlvyAreaAditAt"); // 도서산간 추가 배송비 조건
// BigDecimal areaAditDlvyAmt = (BigDecimal) shippingGrouping.get("areaAditDlvyAmt"); // 도서산간 추가 배송비
List<LinkedHashMap> itemGoodsList = new ArrayList<>();
itemGoodsList.add(goodsList.get(i));
for (LinkedHashMap<String, Object> itemGoodsMap : itemGoodsList) {
itemGoodsMap.put("qy", 1);
}
List<LinkedHashMap> itempPrsntList = new ArrayList<>();
if(!prsntList.isEmpty()){
itempPrsntList.add(prsntList.get(i));
for (LinkedHashMap<String, Object> itemPrsntMap : itempPrsntList) {
itemPrsntMap.put("qy", 1);
}
}
for(int j=0;j<goodsQy;j++) {
LinkedHashMap<String, Object> dlvyMap = new LinkedHashMap<>();
dlvyMap.put("dftDlvyAmt", itemDftDlvyAmt.intValue());
dlvyMap.put("dlvyAmt", itemDlvyAmt.intValue());
dlvyMap.put("couponInnb", 0);
dlvyMap.put("dwldCouponInnb", 0);
dlvyMap.put("dplctDscntAt", "");
dlvyMap.put("otrCouponSmtmUseAt", "");
dlvyMap.put("mngrFreeDlvyUseAt", "N");
dlvyMap.put("dlvylcZip", shipping.get("dlvylcZip"));
dlvyMap.put("recpntNm", shipping.get("recpntNm"));
dlvyMap.put("recpntMbtlnb", shipping.get("recpntMbtlnb"));
dlvyMap.put("dlvylcAdresDvCd", shipping.get("dlvylcAdresDvCd"));
dlvyMap.put("dlvylcLnbAdres", shipping.get("dlvylcLnbAdres"));
dlvyMap.put("dlvylcRnmAdres", shipping.get("dlvylcRnmAdres"));
dlvyMap.put("dlvylcAdresDtl", shipping.get("dlvylcAdresDtl"));
dlvyMap.put("dlvyMssageCn", shipping.get("dlvyMssageCn"));
dlvyMap.put("goodsList", itemGoodsList);
dlvyMap.put("prsntList", itempPrsntList); //prsntList.get(i));
dlvylcListMulti.add(dlvyMap);
}
}
} else if ("05".equals(ordrTyCd)) { // 여러곳 배송, 선물하기
if (!CollectionUtils.isEmpty(multiOrdrDlvylcMap)) {
// 배송지 리스트
dlvylcListMulti = (List<LinkedHashMap<String, Object>>) multiOrdrDlvylcMap.get("dlvylc");
log.debug("dlvylcListMulti : {}", dlvylcListMulti);
}
}
/** 여러곳 배송 배송지 세팅 종료 */
/* ***************************** /* *****************************
1. 주문등록(GC_ORDER) 1. 주문등록(GC_ORDER)
***************************** */ ***************************** */
@@ -128,122 +194,387 @@ public class BOOrderService {
BOOrderShippingVO shippingEscrowVO = new BOOrderShippingVO(); BOOrderShippingVO shippingEscrowVO = new BOOrderShippingVO();
if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "04".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원 개인결제, 정기배송 if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "04".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원 개인결제, 정기배송
BOOrderShippingVO shippingVO = new BOOrderShippingVO(); log.debug("여러곳 배송 > 배송지별 배송정보 => {} ", new Gson().toJson(dlvylcListMulti));
shippingVO.setSopmalCd(sopmalCd); // 짜투리 계산을 위해 상품별 수량 체크
shippingVO.setOrdrInnb(ordrInnb); List<LinkedHashMap> goodsSetList = new ArrayList<>();
shippingVO.setMngrInnb(orderVO.getMngrInnb()); for (LinkedHashMap multiGoods : goodsList) {
shippingVO.setMbrInnb(orderVO.getMbrInnb()); int multiGoodsInnb = (int) multiGoods.get("goodsInnb");
shippingVO.setOrdrSttusCd(orderVO.getOrdrSttusCd()); int multiGoodsOptnInnb = (int) multiGoods.get("goodsOptnInnb");
shippingVO.setMngrFreeDlvyUseAt(StringUtil.isNullToString(shipping.get("mngrFreeDlvyUseAt")) != "" ? StringUtil.isNullToString(shipping.get("mngrFreeDlvyUseAt")) : "N");
/* ***************************************** LinkedHashMap baseGoods = goodsList.stream()
5. 주문배송 정보 등록(GC_ORDER_SHIPPING) .filter(goods ->
***************************************** */ Objects.equals((int) goods.get("goodsInnb"), multiGoodsInnb) &&
Objects.equals((int) goods.get("goodsOptnInnb"), multiGoodsOptnInnb)
)
.findFirst()
.orElse(null);
insertShipping(ordrTyCd, shipping, shippingVO); if (baseGoods != null) {
shippingEscrowVO = shippingVO; //에스크로에 보낼 배송정보 LinkedHashMap merged = new LinkedHashMap<>(baseGoods);
merged.put("setQy", 0);
BigInteger ordrDlvyInnb = shippingVO.getOrdrDlvyInnb(); goodsSetList.add(merged);
String mngrFreeDlvyUseAt = (String) shipping.get("mngrFreeDlvyUseAt");
if ("Y".equals(mngrFreeDlvyUseAt)) { // TODO : cjh : 2025-02-28 무료 배송비 : 'Y' 일 경우 애누리에 할인 금액 세팅 -> 배송비 0원에 여부 데이터만 세팅으로 변경 됌.
// BigDecimal dscntAmt = new BigDecimal(StringUtils.hasText((String) enuri.get("enuriAmt")) ? (String) enuri.get("enuriAmt") : "0");
// BigDecimal mngrFreeDlvyUseAmt = new BigDecimal((String) shipping.get("mngrFreeDlvyUseAmt"));
// enuri.put("enuriAmt", dscntAmt.add(mngrFreeDlvyUseAmt).toString());
}
// 분배된 할인 금액 누적
BOOrderRestAmtVO discountInfo = new BOOrderRestAmtVO();
int optionSeqIndex = 1;
BOOrderNoVO optionNoVO = new BOOrderNoVO();
optionNoVO.setOrdrInnb(ordrInnb);
for (int i = 0; i < goodsList.size(); i++) {
LinkedHashMap goods = goodsList.get(i);
boolean isLast = i == goodsList.size() - 1;
if (!CollectionUtils.isEmpty(goods)) {
int goodsInnb = (int) goods.get("goodsInnb");
int goodsOptnInnb = (int) goods.get("goodsOptnInnb");
int ordrQy = (int) goods.get("qy");
BOOrderItemVO orderItemVO = insertedGoodsList.stream().filter(obj-> Objects.equals(ordrInnb, obj.getOrdrInnb()) &&
Objects.equals(BigInteger.valueOf(goodsInnb), obj.getGoodsInnb())).findAny().orElse(null);
/* ***********************************************
6. 주문 상품 옵션 정보 등록(GC_ORDER_ITEM_OPTION)
주문 상품 입력 옵션 정보 등록
*********************************************** */
if (orderItemVO != null) {
BOOrderItemOptnVO itemOptnVO = new BOOrderItemOptnVO();
itemOptnVO.setSopmalCd(sopmalCd);
itemOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb());
itemOptnVO.setOrdrDlvyInnb(ordrDlvyInnb);
itemOptnVO.setOrdrInnb(ordrInnb);
itemOptnVO.setOrdrSttusCd("0"); // 주문상태(99:결제실패)
setGoodsOptn(sopmalCd, goodsInnb, goodsOptnInnb, ordrQy, itemOptnVO); // 상품 옵션정보 세팅
setDscntDtls(goodsInnb, goodsOptnInnb, null, goodsList, shipping, enuri, itemOptnVO, isLast, isLast, discountInfo); // 상품 할인내역 세팅
if (StringUtils.hasText((String) purchsr.get("mbrId"))) { // 회원
setMlgAmt(ordrTyCd, goodsInnb, goodsOptnInnb, ordrQy, goodsList, itemOptnVO); // 상품 마일리지 정보 세팅
} else {
itemOptnVO.setMlgAccmlUnit(new BigDecimal(0)); // 마일리지적립금액(개당)
itemOptnVO.setMlgAccmlRest(new BigDecimal(0)); // 마일리지적립금액(짜투리)
}
itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
mapper.insertOrdrGoodsOption(itemOptnVO); // 주문 상품 옵션 정보 등록
String inputOptn = (String) goods.get("inputOptn");
if (StringUtils.hasText(inputOptn)) {
String[] inputOptns = inputOptn.split("/");
for (int j = 0; j < inputOptns.length; j++) {
String optn = inputOptns[j];
String[] optns = optn.split(",");
BOOrderItemOptnVO inputOptnVO = new BOOrderItemOptnVO();
inputOptnVO.setSopmalCd(sopmalCd); // 쇼핑몰 코드
inputOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb()); // 주문상품 고유번호
inputOptnVO.setOrdrDlvyInnb(ordrDlvyInnb); // 주문배송 고유번호
inputOptnVO.setOrdrSttusCd(orderVO.getOrdrSttusCd());
inputOptnVO.setRelateOrdrGoodsOptnInnb(itemOptnVO.getOrdrGoodsOptnInnb());
setGoodsOptn(optns[0], Integer.parseInt(optns[1]), Integer.parseInt(optns[2]), 0, inputOptnVO);
if (i == 0) {
inputOptnVO.setOptnVal1(optns[3]);
} else if (i == 1) {
inputOptnVO.setOptnVal2(optns[3]);
} else if (i == 2) {
inputOptnVO.setOptnVal3(optns[3]);
} else if (i == 3) {
inputOptnVO.setOptnVal4(optns[3]);
}
itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
mapper.insertOrdrGoodsOption(inputOptnVO); // 주문 상품 입력 옵션 정보 등록
}
}
}
} }
} }
/* *********************************************************** log.debug("상품별 수량 체크 : {}", goodsSetList);
7. 주문 상품 옵션(사은품) 정보 등록(GC_ORDER_ITEM_OPTION)
*********************************************************** */
if (!CollectionUtils.isEmpty(prsntList)) { if (!CollectionUtils.isEmpty(dlvylcListMulti)) {
insertPrsnt(sopmalCd, ordrInnb, shippingVO.getOrdrDlvyInnb(), prsntList);
// 배송지별 상품 수량 합산 - isLast 찾기 위함.
List<LinkedHashMap<String, Object>> allMergedGoodsList = new ArrayList<>();
for (LinkedHashMap<String, Object> dlvylcMapMulti : dlvylcListMulti) {
List<LinkedHashMap> goodsListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("goodsList");
for (LinkedHashMap multiGoods : goodsListMulti) {
int multiGoodsInnb = (int) multiGoods.get("goodsInnb");
int multiGoodsOptnInnb = (int) multiGoods.get("goodsOptnInnb");
LinkedHashMap baseGoods = goodsList.stream()
.filter(goods ->
Objects.equals((int) goods.get("goodsInnb"), multiGoodsInnb) &&
Objects.equals((int) goods.get("goodsOptnInnb"), multiGoodsOptnInnb)
)
.findFirst()
.orElse(null);
if (baseGoods != null) {
LinkedHashMap<String, Object> merged = new LinkedHashMap<>(baseGoods);
allMergedGoodsList.add(merged);
}
}
}
// 분배된 할인 금액 누적
BOOrderRestAmtVO discountInfo = new BOOrderRestAmtVO();
int allGoodsCount = 0; // 전체 상품 순번
for (LinkedHashMap<String, Object> dlvylcMapMulti : dlvylcListMulti) {
log.debug("dlvylcMapMulti : {}", dlvylcMapMulti);
BOOrderShippingVO shippingVO = new BOOrderShippingVO();
shippingVO.setSopmalCd(sopmalCd);
shippingVO.setOrdrInnb(ordrInnb);
shippingVO.setMngrInnb(orderVO.getMngrInnb());
shippingVO.setMbrInnb(orderVO.getMbrInnb());
shippingVO.setOrdrSttusCd(orderVO.getOrdrSttusCd());
shippingVO.setMngrFreeDlvyUseAt(StringUtil.isNullToString(dlvylcMapMulti.get("mngrFreeDlvyUseAt")) != "" ? StringUtil.isNullToString(dlvylcMapMulti.get("mngrFreeDlvyUseAt")) : "N");
/* *****************************************
5. 주문배송 정보 등록(GC_ORDER_SHIPPING)
***************************************** */
insertShipping(ordrTyCd, dlvylcMapMulti, shippingVO);
shippingEscrowVO = shippingVO; //에스크로에 보낼 배송정보
BigInteger ordrDlvyInnb = shippingVO.getOrdrDlvyInnb();
String mngrFreeDlvyUseAt = (String) dlvylcMapMulti.get("mngrFreeDlvyUseAt");
if ("Y".equals(mngrFreeDlvyUseAt)) { // TODO : cjh : 2025-02-28 무료 배송비 : 'Y' 일 경우 애누리에 할인 금액 세팅 -> 배송비 0원에 여부 데이터만 세팅으로 변경 됌.
// BigDecimal dscntAmt = new BigDecimal(StringUtils.hasText((String) enuri.get("enuriAmt")) ? (String) enuri.get("enuriAmt") : "0");
// BigDecimal mngrFreeDlvyUseAmt = new BigDecimal((String) dlvylcMapMulti.get("mngrFreeDlvyUseAmt"));
// enuri.put("enuriAmt", dscntAmt.add(mngrFreeDlvyUseAmt).toString());
}
List<LinkedHashMap> goodsListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("goodsList");
List<LinkedHashMap> mergedGoodsList = new ArrayList<>();
/** CJH
* 배송지별 상품 정보 머지
* 여러곳 배송일 경우 서버에서 계산해온 상품 정보를 배송지별 수량에 맞게 분배하다보니
* 상품 정보와 배송지별 수량정보를 합쳐주는 작업이 필요함
* * 일반 주분에서 이벤트 할인 금액, 쿠폰 적용 처리, 적립 마일리지 계산을 배송지별로 계속해서 계산하는데에 어려움이 있어 상품은 유지하고 배송지별로 분배하는 방법을 채택함.
*/
for (LinkedHashMap multiGoods : goodsListMulti) {
int multiGoodsInnb = (int) multiGoods.get("goodsInnb");
int multiGoodsOptnInnb = (int) multiGoods.get("goodsOptnInnb");
// 머지대상
int qy = (int) multiGoods.get("qy"); // 주문 수량
// goodsList에서 상세 정보 찾기
LinkedHashMap baseGoods = goodsList.stream()
.filter(goods ->
Objects.equals((int) goods.get("goodsInnb"), multiGoodsInnb) &&
Objects.equals((int) goods.get("goodsOptnInnb"), multiGoodsOptnInnb)
)
.findFirst()
.orElse(null);
if (baseGoods != null) {
// 병합
LinkedHashMap<String, Object> merged = new LinkedHashMap<>(baseGoods);
merged.put("baseQy", merged.get("qy")); // 총 상품별 주문 수량 유지
merged.put("qy", qy); // 수량은 배송지별 정보 우선
mergedGoodsList.add(merged);
}
}
log.debug("머지 작업 후 mergedGoodsList : {}", mergedGoodsList);
log.debug("머지 작업 후 goodsList : {}", goodsList);
/** ------------------------------------------- 사은품 세팅 시작 ------------------------------------------- */
List<LinkedHashMap> prsntListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("prsntList");
List<LinkedHashMap> mergedPrsntList = new ArrayList<>();
/** CJH
* 배송지별 상품 정보 머지
* 여러곳 배송일 경우 서버에서 계산해온 상품 정보를 배송지별 수량에 맞게 분배하다보니
* 상품 정보와 배송지별 수량정보를 합쳐주는 작업이 필요함
* * 일반 주분에서 이벤트 할인 금액, 쿠폰 적용 처리, 적립 마일리지 계산을 배송지별로 계속해서 계산하는데에 어려움이 있어 상품은 유지하고 배송지별로 분배하는 방법을 채택함.
*/
for (LinkedHashMap multiGoods : prsntListMulti) {
int multiGoodsInnb = (int) multiGoods.get("goodsInnb");
int multiGoodsOptnInnb = (int) multiGoods.get("goodsOptnInnb");
// 머지대상
int qy = (int) multiGoods.get("provdCnt"); // 주문 수량
// goodsList에서 상세 정보 찾기
LinkedHashMap baseGoods = prsntList.stream()
.filter(goods ->
Objects.equals((int) goods.get("goodsInnb"), multiGoodsInnb) &&
Objects.equals((int) goods.get("goodsOptnInnb"), multiGoodsOptnInnb)
)
.findFirst()
.orElse(null);
if (baseGoods != null) {
// 병합
LinkedHashMap<String, Object> merged = new LinkedHashMap<>(baseGoods);
merged.put("baseQy", merged.get("provdCnt")); // 총 상품별 주문 수량 유지
merged.put("provdCnt", qy); // 수량은 배송지별 정보 우선
mergedPrsntList.add(merged);
}
}
log.debug("머지 작업 후 mergedPrsntList : {}", mergedPrsntList);
log.debug("머지 작업 후 prsntList : {}", prsntList);
/** ------------------------------------------- 사은품 세팅 끝 ------------------------------------------- */
for (int i = 0; i < mergedGoodsList.size(); i++) {
LinkedHashMap goods = mergedGoodsList.get(i);
boolean isLast = allGoodsCount == allMergedGoodsList.size() - 1;
if (!CollectionUtils.isEmpty(goods)) {
int goodsInnb = (int) goods.get("goodsInnb");
int goodsOptnInnb = (int) goods.get("goodsOptnInnb");
int ordrQy = (int) goods.get("qy");
BOOrderItemVO orderItemVO = insertedGoodsList.stream().filter(obj-> Objects.equals(ordrInnb, obj.getOrdrInnb()) &&
Objects.equals(BigInteger.valueOf(goodsInnb), obj.getGoodsInnb())).findAny().orElse(null);
/* ***********************************************
6. 주문 상품 옵션 정보 등록(GC_ORDER_ITEM_OPTION)
주문 상품 입력 옵션 정보 등록
*********************************************** */
if (orderItemVO != null) {
BOOrderItemOptnVO itemOptnVO = new BOOrderItemOptnVO();
itemOptnVO.setSopmalCd(sopmalCd);
itemOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb());
itemOptnVO.setOrdrDlvyInnb(ordrDlvyInnb);
itemOptnVO.setOrdrInnb(ordrInnb);
itemOptnVO.setOrdrSttusCd("0"); // 주문상태(99:결제실패)
setGoodsOptn(sopmalCd, goodsInnb, goodsOptnInnb, ordrQy, itemOptnVO); // 상품 옵션정보 세팅
LinkedHashMap goodsSet = goodsSetList.stream().filter(obj-> Objects.equals(goodsInnb, obj.get("goodsInnb")) && Objects.equals(goodsOptnInnb, obj.get("goodsOptnInnb"))).findAny().orElse(null);
setDscntDtlsMulti(goodsInnb, goodsOptnInnb, null, mergedGoodsList, dlvylcMapMulti, enuri, itemOptnVO, isLast, isLast, discountInfo, goodsList, goodsSet); // 상품 할인내역 세팅 - 여러곳 배송
if (StringUtils.hasText((String) purchsr.get("mbrId"))) { // 회원
setMlgAmtMulti(ordrTyCd, goodsInnb, goodsOptnInnb, ordrQy, mergedGoodsList, itemOptnVO, goodsSet); // 상품 마일리지 정보 세팅 - 여러곳 배송
} else {
itemOptnVO.setMlgAccmlUnit(new BigDecimal(0)); // 마일리지적립금액(개당)
itemOptnVO.setMlgAccmlRest(new BigDecimal(0)); // 마일리지적립금액(짜투리)
}
itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
mapper.insertOrdrGoodsOption(itemOptnVO); // 주문 상품 옵션 정보 등록
// 상품별 수량 체크
goodsSet.put("setQy", (int) goodsSet.get("setQy") + ordrQy);
String inputOptn = (String) goods.get("inputOptn");
if (StringUtils.hasText(inputOptn)) {
String[] inputOptns = inputOptn.split("/");
for (int j = 0; j < inputOptns.length; j++) {
String optn = inputOptns[j];
String[] optns = optn.split(",");
BOOrderItemOptnVO inputOptnVO = new BOOrderItemOptnVO();
inputOptnVO.setSopmalCd(sopmalCd); // 쇼핑몰 코드
inputOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb()); // 주문상품 고유번호
inputOptnVO.setOrdrDlvyInnb(ordrDlvyInnb); // 주문배송 고유번호
inputOptnVO.setOrdrSttusCd(orderVO.getOrdrSttusCd());
inputOptnVO.setRelateOrdrGoodsOptnInnb(itemOptnVO.getOrdrGoodsOptnInnb());
setGoodsOptn(optns[0], Integer.parseInt(optns[1]), Integer.parseInt(optns[2]), 0, inputOptnVO);
if (i == 0) {
inputOptnVO.setOptnVal1(optns[3]);
} else if (i == 1) {
inputOptnVO.setOptnVal2(optns[3]);
} else if (i == 2) {
inputOptnVO.setOptnVal3(optns[3]);
} else if (i == 3) {
inputOptnVO.setOptnVal4(optns[3]);
}
itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
mapper.insertOrdrGoodsOption(inputOptnVO); // 주문 상품 입력 옵션 정보 등록
}
}
}
}
// 전체 수량의 마지막 체크
allGoodsCount = allGoodsCount + 1;
}
/* ***********************************************************
7. 주문 상품 옵션(사은품) 정보 등록(GC_ORDER_ITEM_OPTION)
*********************************************************** */
if (!CollectionUtils.isEmpty(prsntList)) {
insertPrsnt(sopmalCd, ordrInnb, ordrDlvyInnb, mergedPrsntList);
}
}
} }
// BOOrderShippingVO shippingVO = new BOOrderShippingVO();
//
// shippingVO.setSopmalCd(sopmalCd);
// shippingVO.setOrdrInnb(ordrInnb);
// shippingVO.setMngrInnb(orderVO.getMngrInnb());
// shippingVO.setMbrInnb(orderVO.getMbrInnb());
// shippingVO.setOrdrSttusCd(orderVO.getOrdrSttusCd());
// shippingVO.setMngrFreeDlvyUseAt(StringUtil.isNullToString(shipping.get("mngrFreeDlvyUseAt")) != "" ? StringUtil.isNullToString(shipping.get("mngrFreeDlvyUseAt")) : "N");
//
// /* *****************************************
// 5. 주문배송 정보 등록(GC_ORDER_SHIPPING)
// ***************************************** */
//
// insertShipping(ordrTyCd, shipping, shippingVO);
// shippingEscrowVO = shippingVO; //에스크로에 보낼 배송정보
//
// BigInteger ordrDlvyInnb = shippingVO.getOrdrDlvyInnb();
//
// String mngrFreeDlvyUseAt = (String) shipping.get("mngrFreeDlvyUseAt");
//
// if ("Y".equals(mngrFreeDlvyUseAt)) { // TODO : cjh : 2025-02-28 무료 배송비 : 'Y' 일 경우 애누리에 할인 금액 세팅 -> 배송비 0원에 여부 데이터만 세팅으로 변경 됌.
//// BigDecimal dscntAmt = new BigDecimal(StringUtils.hasText((String) enuri.get("enuriAmt")) ? (String) enuri.get("enuriAmt") : "0");
//// BigDecimal mngrFreeDlvyUseAmt = new BigDecimal((String) shipping.get("mngrFreeDlvyUseAmt"));
//
// // enuri.put("enuriAmt", dscntAmt.add(mngrFreeDlvyUseAmt).toString());
// }
//
// // 분배된 할인 금액 누적
// BOOrderRestAmtVO discountInfo = new BOOrderRestAmtVO();
//
// int optionSeqIndex = 1;
// BOOrderNoVO optionNoVO = new BOOrderNoVO();
// optionNoVO.setOrdrInnb(ordrInnb);
// for (int i = 0; i < goodsList.size(); i++) {
// LinkedHashMap goods = goodsList.get(i);
//
// boolean isLast = i == goodsList.size() - 1;
//
// if (!CollectionUtils.isEmpty(goods)) {
// int goodsInnb = (int) goods.get("goodsInnb");
// int goodsOptnInnb = (int) goods.get("goodsOptnInnb");
// int ordrQy = (int) goods.get("qy");
//
// BOOrderItemVO orderItemVO = insertedGoodsList.stream().filter(obj-> Objects.equals(ordrInnb, obj.getOrdrInnb()) &&
// Objects.equals(BigInteger.valueOf(goodsInnb), obj.getGoodsInnb())).findAny().orElse(null);
//
// /* ***********************************************
// 6. 주문 상품 옵션 정보 등록(GC_ORDER_ITEM_OPTION)
// 주문 상품 입력 옵션 정보 등록
// *********************************************** */
// if (orderItemVO != null) {
// BOOrderItemOptnVO itemOptnVO = new BOOrderItemOptnVO();
//
// itemOptnVO.setSopmalCd(sopmalCd);
// itemOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb());
// itemOptnVO.setOrdrDlvyInnb(ordrDlvyInnb);
// itemOptnVO.setOrdrInnb(ordrInnb);
// itemOptnVO.setOrdrSttusCd("0"); // 주문상태(99:결제실패)
//
// setGoodsOptn(sopmalCd, goodsInnb, goodsOptnInnb, ordrQy, itemOptnVO); // 상품 옵션정보 세팅
//
// setDscntDtls(goodsInnb, goodsOptnInnb, null, goodsList, shipping, enuri, itemOptnVO, isLast, isLast, discountInfo); // 상품 할인내역 세팅
//
// if (StringUtils.hasText((String) purchsr.get("mbrId"))) { // 회원
// setMlgAmt(ordrTyCd, goodsInnb, goodsOptnInnb, ordrQy, goodsList, itemOptnVO); // 상품 마일리지 정보 세팅
// } else {
// itemOptnVO.setMlgAccmlUnit(new BigDecimal(0)); // 마일리지적립금액(개당)
// itemOptnVO.setMlgAccmlRest(new BigDecimal(0)); // 마일리지적립금액(짜투리)
// }
//
// itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
// mapper.insertOrdrGoodsOption(itemOptnVO); // 주문 상품 옵션 정보 등록
//
// String inputOptn = (String) goods.get("inputOptn");
//
// if (StringUtils.hasText(inputOptn)) {
// String[] inputOptns = inputOptn.split("/");
//
// for (int j = 0; j < inputOptns.length; j++) {
// String optn = inputOptns[j];
// String[] optns = optn.split(",");
//
// BOOrderItemOptnVO inputOptnVO = new BOOrderItemOptnVO();
//
// inputOptnVO.setSopmalCd(sopmalCd); // 쇼핑몰 코드
// inputOptnVO.setOrdrGoodsInnb(orderItemVO.getOrdrGoodsInnb()); // 주문상품 고유번호
// inputOptnVO.setOrdrDlvyInnb(ordrDlvyInnb); // 주문배송 고유번호
// inputOptnVO.setOrdrSttusCd(orderVO.getOrdrSttusCd());
// inputOptnVO.setRelateOrdrGoodsOptnInnb(itemOptnVO.getOrdrGoodsOptnInnb());
//
// setGoodsOptn(optns[0], Integer.parseInt(optns[1]), Integer.parseInt(optns[2]), 0, inputOptnVO);
//
// if (i == 0) {
// inputOptnVO.setOptnVal1(optns[3]);
// } else if (i == 1) {
// inputOptnVO.setOptnVal2(optns[3]);
// } else if (i == 2) {
// inputOptnVO.setOptnVal3(optns[3]);
// } else if (i == 3) {
// inputOptnVO.setOptnVal4(optns[3]);
// }
//
// itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
// mapper.insertOrdrGoodsOption(inputOptnVO); // 주문 상품 입력 옵션 정보 등록
// }
// }
// }
// }
// }
//
// /* ***********************************************************
// 7. 주문 상품 옵션(사은품) 정보 등록(GC_ORDER_ITEM_OPTION)
// *********************************************************** */
// if (!CollectionUtils.isEmpty(prsntList)) {
// insertPrsnt(sopmalCd, ordrInnb, shippingVO.getOrdrDlvyInnb(), prsntList);
// }
} else if ("05".equals(ordrTyCd)) { // 여러곳 배송, 선물하기 } else if ("05".equals(ordrTyCd)) { // 여러곳 배송, 선물하기
log.debug("여러곳 배송 > 배송지별 배송정보 => {} ", new Gson().toJson(dlvylcListMulti)); log.debug("여러곳 배송 > 배송지별 배송정보 => {} ", new Gson().toJson(dlvylcListMulti));
@@ -1219,18 +1550,30 @@ public class BOOrderService {
shippingVO.setDlvyMthCd("01"); // 택배 shippingVO.setDlvyMthCd("01"); // 택배
if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송 if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송
shippingVO.setRecpntNm((String) shipping.get("recpntNm")); shippingVO.setRecpntNm(StringUtil.isNullToString(shipping.get("recpntNm")));
shippingVO.setRecpntTelnb((String) shipping.get("recpntTelnb")); shippingVO.setRecpntTelnb(StringUtil.isNullToString(shipping.get("recpntTelnb")));
shippingVO.setRecpntMbtlnb((String) shipping.get("recpntMbtlnb")); shippingVO.setRecpntMbtlnb(StringUtil.isNullToString(shipping.get("recpntMbtlnb")));
shippingVO.setDlvylcZip((String) shipping.get("dlvylcZip")); shippingVO.setDlvylcZip(StringUtil.isNullToString(shipping.get("dlvylcZip")));
shippingVO.setDlvylcAdresDvCd((String) shipping.get("dlvylcAdresDvCd")); shippingVO.setDlvylcAdresDvCd(StringUtil.isNullToString(shipping.get("dlvylcAdresDvCd")));
shippingVO.setDlvylcLnbAdres((String) shipping.get("dlvylcLnbAdres")); shippingVO.setDlvylcLnbAdres(StringUtil.isNullToString(shipping.get("dlvylcLnbAdres")));
shippingVO.setDlvylcRnmAdres((String) shipping.get("dlvylcRnmAdres")); shippingVO.setDlvylcRnmAdres(StringUtil.isNullToString(shipping.get("dlvylcRnmAdres")));
shippingVO.setDlvylcAdresDtl((String) shipping.get("dlvylcAdresDtl")); shippingVO.setDlvylcAdresDtl(StringUtil.isNullToString(shipping.get("dlvylcAdresDtl")));
shippingVO.setDlvyMssageCn((String) shipping.get("dlvyMssageCn")); shippingVO.setDlvyMssageCn(StringUtil.isNullToString(shipping.get("dlvyMssageCn")));
shippingVO.setDlvyCycleCd((String) shipping.get("dlvyCycleCd")); shippingVO.setDlvyCycleCd(StringUtil.isNullToString(shipping.get("dlvyCycleCd")));
// shippingVO.setRecpntNm((String) shipping.get("recpntNm"));
// shippingVO.setRecpntTelnb((String) shipping.get("recpntTelnb"));
// shippingVO.setRecpntMbtlnb((String) shipping.get("recpntMbtlnb"));
//
// shippingVO.setDlvylcZip((String) shipping.get("dlvylcZip"));
// shippingVO.setDlvylcAdresDvCd((String) shipping.get("dlvylcAdresDvCd"));
// shippingVO.setDlvylcLnbAdres((String) shipping.get("dlvylcLnbAdres"));
// shippingVO.setDlvylcRnmAdres((String) shipping.get("dlvylcRnmAdres"));
// shippingVO.setDlvylcAdresDtl((String) shipping.get("dlvylcAdresDtl"));
//
// shippingVO.setDlvyMssageCn((String) shipping.get("dlvyMssageCn"));
// shippingVO.setDlvyCycleCd((String) shipping.get("dlvyCycleCd"));
} }
if ("05".equals(ordrTyCd)) { // 여러곳 배송 if ("05".equals(ordrTyCd)) { // 여러곳 배송
@@ -2194,6 +2537,9 @@ public class BOOrderService {
throw new WnbtRestException("주문배송 정보를 찾을 수 없습니다."); throw new WnbtRestException("주문배송 정보를 찾을 수 없습니다.");
} }
} else { } else {
// if (CollectionUtils.isEmpty(multiOrdrDlvylc)) {
// throw new WnbtRestException("주문배송 정보를 찾을 수 없습니다.");
// }
if (CollectionUtils.isEmpty(shipping)) { if (CollectionUtils.isEmpty(shipping)) {
throw new WnbtRestException("주문배송 정보를 찾을 수 없습니다."); throw new WnbtRestException("주문배송 정보를 찾을 수 없습니다.");
} }

View File

@@ -177,6 +177,7 @@ public class BOPurchsService {
public DataMap selectDftDlvylc(BOPurchsrVO purchsrVO) { public DataMap selectDftDlvylc(BOPurchsrVO purchsrVO) {
DataMap dftDlvylc = new DataMap(); DataMap dftDlvylc = new DataMap();
//기본배송지여부
purchsrVO.setDftDlvylcAt("Y"); purchsrVO.setDftDlvylcAt("Y");
List<DataMap> dlvylcAdresList = mapper.selectDlvylcList(purchsrVO); List<DataMap> dlvylcAdresList = mapper.selectDlvylcList(purchsrVO);
@@ -1854,6 +1855,8 @@ public class BOPurchsService {
}}; }};
String defaultAdressAt = ""; String defaultAdressAt = "";
String dlvylcAreaCd = (String) param.get("dlvylcAreaCd");
String prefcd = (String) param.get("prefcd");
List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList"); List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
@@ -1922,7 +1925,7 @@ public class BOPurchsService {
if (dlvylc.get("dlvyAmt") != null) { if (dlvylc.get("dlvyAmt") != null) {
dlvyAmtBydlvylc = dlvyAmtBydlvylc + castAmt(dlvylc, "dlvyAmt"); dlvyAmtBydlvylc = dlvyAmtBydlvylc + castAmt(dlvylc, "dlvyAmt");
} else { } else {
dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue(); dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue();
@@ -1947,7 +1950,7 @@ public class BOPurchsService {
if (dlvylcMap.get("dlvyAmt") != null) { if (dlvylcMap.get("dlvyAmt") != null) {
dlvyAmtBydlvylc = dlvyAmtBydlvylc + castAmt(dlvylcMap, "dlvyAmt"); dlvyAmtBydlvylc = dlvyAmtBydlvylc + castAmt(dlvylcMap, "dlvyAmt");
} else { } else {
dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue(); dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue();
@@ -1958,7 +1961,7 @@ public class BOPurchsService {
dlvyAmt = new BigDecimal(dlvyAmtBydlvylc); dlvyAmt = new BigDecimal(dlvyAmtBydlvylc);
} }
} else { } else {
dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmt = (BigDecimal) dlvyAmtMap.get("dlvyAmt"); dlvyAmt = (BigDecimal) dlvyAmtMap.get("dlvyAmt");
@@ -2104,9 +2107,10 @@ public class BOPurchsService {
* @param goodsList * @param goodsList
* @return List<DataMap> * @return List<DataMap>
*/ */
public DataMap getDlvyAmt(List<LinkedHashMap> goodsList, String sopmalCd, String defaultAdressAt) { public DataMap getDlvyAmt(List<LinkedHashMap> goodsList, String sopmalCd, String defaultAdressAt, String dlvylcAreaCd) {
DataMap dlvyAmtMap = null; DataMap dlvyAmtMap = null;
log.debug("우편번호 확인 : {}", defaultAdressAt); log.debug("우편번호 확인 : {}", defaultAdressAt);
log.debug("getDlvyAmt-goodsList : {}", goodsList);
BigDecimal rlDlvyAmt = new BigDecimal(0); // 실 최종 배송비 BigDecimal rlDlvyAmt = new BigDecimal(0); // 실 최종 배송비
@@ -2158,6 +2162,9 @@ public class BOPurchsService {
for (Map.Entry<BigInteger, List<DataMap>> dlvyGroupEtry : goodsByDlvyGroupMap.entrySet()) { for (Map.Entry<BigInteger, List<DataMap>> dlvyGroupEtry : goodsByDlvyGroupMap.entrySet()) {
int dlvyGroupInnb = dlvyGroupEtry.getKey().intValue(); int dlvyGroupInnb = dlvyGroupEtry.getKey().intValue();
List<DataMap> goodsByDlvyGroupList = dlvyGroupEtry.getValue(); List<DataMap> goodsByDlvyGroupList = dlvyGroupEtry.getValue();
log.debug("goodsByDlvyGroupList : {}", goodsByDlvyGroupList);
// BigDecimal goodsQy = (BigDecimal) goodsByDlvyGroupList.get("qy");
// log.debug("goodsByDlvyGroupList qy : {}", qy);
finalDlvyGroupInnb = dlvyGroupInnb; finalDlvyGroupInnb = dlvyGroupInnb;
@@ -2168,38 +2175,65 @@ public class BOPurchsService {
DataMap shippingGrouping = mapper.selectShippingGrouping(param); DataMap shippingGrouping = mapper.selectShippingGrouping(param);
//"KR".equals(dlvylcAreaCd)인 경우
String dlvyGroupDvCd = (String) shippingGrouping.get("dlvyGroupDvCd"); String dlvyGroupDvCd = (String) shippingGrouping.get("dlvyGroupDvCd");
BigDecimal dftDlvyAmt = (BigDecimal) shippingGrouping.get("dftDlvyAmt"); // 기본배송비 BigDecimal dftDlvyAmt = (BigDecimal) shippingGrouping.get("dftDlvyAmt"); // 기본배송비
BigDecimal dlvyAmt = dftDlvyAmt; // 배송비 BigDecimal dlvyAmt = dftDlvyAmt; // 배송비
String dlvyAreaAditAt = (String) shippingGrouping.get("dlvyAreaAditAt"); // 도서산간 추가 배송비 조건 String dlvyAreaAditAt = (String) shippingGrouping.get("dlvyAreaAditAt"); // 도서산간 추가 배송비 조건
BigDecimal areaAditDlvyAmt = (BigDecimal) shippingGrouping.get("areaAditDlvyAmt"); // 도서산간 추가 배송비 BigDecimal areaAditDlvyAmt = (BigDecimal) shippingGrouping.get("areaAditDlvyAmt"); // 도서산간 추가 배송비
String amtCndUseAt = (String) shippingGrouping.get("amtCndUseAt"); // 금액조건
BigDecimal amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt");
String cntCndUseAt = (String) shippingGrouping.get("cntCndUseAt"); // 수량조건
BigDecimal cntCndAditAmt = (BigDecimal) shippingGrouping.get("cntCndAditAmt"); // 수량
if("JP".equals(dlvylcAreaCd)){
// dlvyGroupDvCd = (String) shippingGrouping.get("dlvyGroupDvCd2");
dftDlvyAmt = (BigDecimal) shippingGrouping.get("dftDlvyAmt2"); // 기본배송비
dlvyAmt = dftDlvyAmt; // 배송비
dlvyAreaAditAt = (String) shippingGrouping.get("dlvyAreaAditAt2"); // 도서산간 추가 배송비 조건
areaAditDlvyAmt = (BigDecimal) shippingGrouping.get("areaAditDlvyAmt2"); // 도서산간 추가 배송비
amtCndUseAt = (String) shippingGrouping.get("amtCndUseAt2"); // 금액조건
amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt");
cntCndUseAt = (String) shippingGrouping.get("cntCndUseAt2"); // 수량조건
cntCndAditAmt = (BigDecimal) shippingGrouping.get("cntCndAditAmt2"); // 수량
}
// 무료배송(조건부) // 무료배송(조건부)
if ("01".equals(dlvyGroupDvCd)) { if ("01".equals(dlvyGroupDvCd)) {
// 조건(적용상품이 1건일 경우) // 조건(적용상품이 1건일 경우)
String amtCndUseAt = (String) shippingGrouping.get("amtCndUseAt"); // 금액조건 // String amtCndUseAt = (String) shippingGrouping.get("amtCndUseAt"); // 금액조건
String cntCndUseAt = (String) shippingGrouping.get("cntCndUseAt"); // 수량조건 // String cntCndUseAt = (String) shippingGrouping.get("cntCndUseAt"); // 수량조건
for (DataMap goodsMap : goodsByDlvyGroupList) { for (DataMap goodsMap : goodsByDlvyGroupList) {
// BigDecimal qy = (BigDecimal) goodsMap.get("qy"); // 수량
// 금액 조건 // 금액 조건
if ("Y".equals(amtCndUseAt)) { if ("Y".equals(amtCndUseAt)) {
BigDecimal amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt"); // 금액조건 추가금액 // BigDecimal amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt"); // 금액조건 추가금액
BigDecimal slepric = (BigDecimal) goodsMap.get("subSlepric"); // 판매가 * 수량 BigDecimal slepric = (BigDecimal) goodsMap.get("subSlepric"); // 판매가 * 수량
if (slepric.compareTo(amtCndAditAmt) > 0) { if (slepric.compareTo(amtCndAditAmt) > 0) {
dlvyAmt = new BigDecimal(0); dlvyAmt = new BigDecimal(0);
} }
// else {
// //배송비 합(같은상품 수량당 배송비 책정)
// dlvyAmt = dlvyAmt.multiply(qy);
// }
} }
// 수량 조건 // 수량 조건
if ("Y".equals(cntCndUseAt)) { if ("Y".equals(cntCndUseAt)) {
BigDecimal cntCndAditAmt = (BigDecimal) shippingGrouping.get("cntCndAditAmt"); // 금액조건 추가금액 // BigDecimal cntCndAditAmt = (BigDecimal) shippingGrouping.get("cntCndAditAmt"); // 금액조건 추가금액
BigDecimal qy = (BigDecimal) goodsMap.get("qy"); // 수량 BigDecimal qy = (BigDecimal) goodsMap.get("qy"); // 수량
if (qy.compareTo(cntCndAditAmt) > 0) { if (qy.compareTo(cntCndAditAmt) > 0) {
dlvyAmt = new BigDecimal(0); dlvyAmt = new BigDecimal(0);
} }
// else {
// //배송비 합(같은상품 수량당 배송비 책정)
// dlvyAmt = dlvyAmt.multiply(qy);
// }
} }
} }
@@ -2258,20 +2292,66 @@ public class BOPurchsService {
} else if ("03".equals(dlvyGroupDvCd)) { // 유료배송 } else if ("03".equals(dlvyGroupDvCd)) { // 유료배송
paidDlvyAmt = paidDlvyAmt.add(dlvyAmt); // 유료배송비 합 if("KR".equals(dlvylcAreaCd) || "JP".equals(dlvylcAreaCd)) {
if (!StringUtils.isEmpty(dlvyAreaAditAt) && "Y".equals(dlvyAreaAditAt)) { BigDecimal goodsQy = new BigDecimal(0);
if (!StringUtils.isEmpty(defaultAdressAt) && "Y".equals(defaultAdressAt)) {
addPaidDlvyAmt = addPaidDlvyAmt.add(areaAditDlvyAmt); // 유료 배송 도서산간 추가 배송비 for (DataMap goodsMap : goodsByDlvyGroupList) {
}
BigDecimal qy = (BigDecimal) goodsMap.get("qy"); // 수량
// 수량 조건
if ("Y".equals(cntCndUseAt)) {
qy = (BigDecimal) goodsMap.get("qy"); // 수량
if (qy.compareTo(cntCndAditAmt) > 0) {
goodsQy = qy.divide(cntCndAditAmt, 0, RoundingMode.CEILING);
//배송비 합(같은상품 수량당 배송비 책정)
BigDecimal multidlvyAmt = dlvyAmt.multiply(goodsQy);
paidDlvyAmt = paidDlvyAmt.add(multidlvyAmt);
// 추가배송비 계산 (MUL)
if (!StringUtils.isEmpty(dlvyAreaAditAt) && "Y".equals(dlvyAreaAditAt)) {
if (!StringUtils.isEmpty(defaultAdressAt) && "Y".equals(defaultAdressAt)) {
addPaidDlvyAmt = addPaidDlvyAmt.add(areaAditDlvyAmt.multiply(goodsQy)); // 유료 배송 도서산간 추가 배송비
}
}
} else {
// 수량당 배송비가 1인경우
paidDlvyAmt = paidDlvyAmt.add(dlvyAmt);
// 추가배송비 계산
if (!StringUtils.isEmpty(dlvyAreaAditAt) && "Y".equals(dlvyAreaAditAt)) {
if (!StringUtils.isEmpty(defaultAdressAt) && "Y".equals(defaultAdressAt)) {
addPaidDlvyAmt = addPaidDlvyAmt.add(areaAditDlvyAmt); // 유료 배송 도서산간 추가 배송비
}
}
}
} else {
//수량 조건 없는 경우
paidDlvyAmt = paidDlvyAmt.add(dlvyAmt); // 유료배송비 합
// 추가배송비 계산
if (!StringUtils.isEmpty(dlvyAreaAditAt) && "Y".equals(dlvyAreaAditAt)) {
if (!StringUtils.isEmpty(defaultAdressAt) && "Y".equals(defaultAdressAt)) {
addPaidDlvyAmt = addPaidDlvyAmt.add(areaAditDlvyAmt); // 유료 배송 도서산간 추가 배송비
}
}
}
} //for
} else {
dlvyAmt = new BigDecimal(0);
dftDlvyAmt = new BigDecimal(0);
} }
} }
BigDecimal finalDlvyAmt = dlvyAmt; BigDecimal finalDlvyAmt = dlvyAmt;
BigDecimal amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt"); // 금액조건 추가금액 BigDecimal finalDftDlvyAmt = dftDlvyAmt;
// BigDecimal amtCndAditAmt = (BigDecimal) shippingGrouping.get("amtCndAditAmt"); // 금액조건 추가금액
DataMap dlvyGroupMap = new DataMap(){{ DataMap dlvyGroupMap = new DataMap(){{
put("dlvyGroupInnb", dlvyGroupInnb); put("dlvyGroupInnb", dlvyGroupInnb);
put("dftDlvyAmt", dftDlvyAmt); put("dftDlvyAmt", finalDftDlvyAmt);
put("dlvyAmt", finalDlvyAmt); put("dlvyAmt", finalDlvyAmt);
}}; }};
@@ -2281,7 +2361,7 @@ public class BOPurchsService {
log.debug("@@@ 유료배송비 합 : {}", paidDlvyAmt); log.debug("@@@ 유료배송비 합 : {}", paidDlvyAmt);
dlvyAmtByDlvyGroupList.add(dlvyGroupMap); // 배송그룹별 배송비 목록 dlvyAmtByDlvyGroupList.add(dlvyGroupMap); // 배송그룹별 배송비 목록
} } // for
// TODO : 도서산간 추가배송비 정채 :: 무료일 경우 무조건 무료인지 추가배송비는 발생 시킬건지 정의 필요 ( 2024-10-01 ) // TODO : 도서산간 추가배송비 정채 :: 무료일 경우 무조건 무료인지 추가배송비는 발생 시킬건지 정의 필요 ( 2024-10-01 )
addFreeDlvyAmt = addFreeDlvyAmt.compareTo(addBundleDlvyAmtY) > 0 ? addFreeDlvyAmt : addBundleDlvyAmtY; // 무료배송 추가 배송비와 조건부 무료배송 묶음 O 의 추가 배송비 중 큰 배송비 addFreeDlvyAmt = addFreeDlvyAmt.compareTo(addBundleDlvyAmtY) > 0 ? addFreeDlvyAmt : addBundleDlvyAmtY; // 무료배송 추가 배송비와 조건부 무료배송 묶음 O 의 추가 배송비 중 큰 배송비

View File

@@ -89,4 +89,11 @@ public class BOPurchsrVO extends AbstractVO {
/** 기본배송지 여부 */ /** 기본배송지 여부 */
private String dftDlvylcAt; private String dftDlvylcAt;
/** 도도부현 코드(일본) */
private String prefcd;
/**배송지역코드*/
private String dlvylcAreaCd;
} }

View File

@@ -0,0 +1,33 @@
package com.wb.domainserver.domain.gcone.goods.subsvc.mapper;
import com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO;
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 BOSubsvcMapper {
/** 구독서비스 목록 조회*/
List<DataMap> selectBOSubsvcList(BOSubsvcVO vo);
/** 구독서비스 상세 조회 (관리자에서 사용함)*/
DataMap selectBOSubsvcDetail(BOSubsvcVO vo);
/** 관리자 구독서비스 목록 조회*/
List<DataMap> selectBOMngrSubsvcList(BOSubsvcVO vo);
/** 관리자 구독서비스 조회조건 구독서비스*/
List<DataMap> selectBOMngrSrchSubsvcList(BOSubsvcVO vo);
/** 관리자 구독서비스 조회조건 구독서비스별 기수*/
List<DataMap> selectBOMngrSrchSubsvcGnrList(BOSubsvcVO vo);
/** 관리자 구독서비스 선택 삭제*/
int deleteBOMngrSubsvc(BOSubsvcVO vo);
/** 관리자 구독서비스 수정*/
int updateBOMngrSubsvc(BOSubsvcVO vo);
/** 관리자 구둑서비스 등록 */
void insertBOMngrSubsvc(BOSubsvcVO vo);
/** 관리자 구독서비스 명 중복체크*/
int selectBOMngrSubsvcNmDupCheck(BOSubsvcVO vo);
}

View File

@@ -0,0 +1,140 @@
package com.wb.domainserver.domain.gcone.goods.subsvc.service;
import com.wb.domainserver.domain.gcone.goods.goodsinfo.vo.BOGoodsInfoVO;
import com.wb.domainserver.domain.gcone.goods.subsvc.mapper.BOSubsvcMapper;
import com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO;
import com.wb.domainserver.util.dataaccess.DataMap;
import io.micrometer.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class BOSubsvcService {
@Autowired
private BOSubsvcMapper mapper;
/**
* 구독서비스 목록 조회
* @param vo
* @return
*/
public List<DataMap> selectBOSubsvcList(BOSubsvcVO vo) {
List<DataMap> dataList = new ArrayList<>();
dataList = mapper.selectBOSubsvcList(vo);
return dataList;
}
/**
* 구독서비스 상세 조회
* @param vo
* @return
*/
public DataMap selectBOSubsvcDetail(BOSubsvcVO vo) {
DataMap dataMap = new DataMap();
dataMap = mapper.selectBOSubsvcDetail(vo);
return dataMap;
}
/**
* 관리자 구독서비스 목록 조회
* */
public List<DataMap> selectBOMngrSubsvcList(BOSubsvcVO vo) {
List<DataMap> dataList = new ArrayList<>();
dataList = mapper.selectBOMngrSubsvcList(vo);
if(dataList == null || dataList.isEmpty()){
vo.getPaginationInfo().setTotalRecordCount(0);
}else{
vo.getPaginationInfo().setTotalRecordCount(((Long)dataList.get(0).get("totCnt")).intValue());
}
return dataList;
}
/**
* 관리자 구독서비스 조회조건 구독서비스
* */
public List<DataMap> selectBOMngrSrchSubsvcList(BOSubsvcVO vo) {
List<DataMap> dataList = new ArrayList<>();
dataList = mapper.selectBOMngrSrchSubsvcList(vo);
return dataList;
}
/**
* 관리자 구독서비스 조회조건 구독서비스별 기수
* */
public List<DataMap> selectBOMngrSrchSubsvcGnrList(BOSubsvcVO vo) {
List<DataMap> dataList = new ArrayList<>();
dataList = mapper.selectBOMngrSrchSubsvcGnrList(vo);
return dataList;
}
/**
* 관리자 구독서비스 선택 삭제(여러건 삭제)
* */
public String deleteBOMngrSubsvc(BOSubsvcVO vo) {
String message = "fail";
int result = mapper.deleteBOMngrSubsvc(vo);
if (result > 0) {
message = "success";
}
return message;
}
/**
* 관리자 구독서비스명 중복체크
* */
public String selectBOMngrSubsvcNmDupCheck(BOSubsvcVO vo) {
String message = "success";
int result = mapper.selectBOMngrSubsvcNmDupCheck(vo);
if (result > 0) {
message = "fail";
}
return message;
}
/**
* 관리자 구독서비스 수정
* */
public String updateBOMngrSubsvc(BOSubsvcVO vo) {
String message = "fail";
int result = mapper.updateBOMngrSubsvc(vo);
if (result > 0) {
message = "success";
}
return message;
}
/**
* 관리자 구독서비스 등록
* */
public String insertBOMngrSubsvc(BOSubsvcVO vo) {
String message = "success";
try{
mapper.insertBOMngrSubsvc(vo);
if(StringUtils.isEmpty(vo.getSubsvcInnb())){
message = "fail";
}
}catch(Exception e){
log.error(e.getMessage());
message = "fail";
}
return message;
}
}

View File

@@ -0,0 +1,102 @@
package com.wb.domainserver.domain.gcone.goods.subsvc.vo;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
public class BOSubsvcVO extends AbstractVO {
private static final long serialVersionUID = 1L;
/** 구독서비스고유번호 */
private String subsvcInnb;
/** 쇼핑몰코드 */
private String sopmalCd;
/** 구독서비스명 */
private String subsvcNm;
/** 구독기간 */
private String subPd;
/** 구독서비스기수 */
private String subsvcGnr;
/** 구독서비스명 다음기수 */
private String subsvcNextGnr;
/** 구독서비스기수명 */
private String subsvcGnrNm;
/** 배송횟수 */
private String dlvyCnt;
/** 배송주기 */
private String dlvyCycle;
/** 구독료 */
private String subsvcCt;
/** 1회 배송비 */
private String tmeDlvyAmt;
/** 소비자가 */
private String cnsmrpric;
/** 판매가 */
private String slepric;
/** 재고수량 */
private String invntryQy;
/** 판매재고수량 */
private String usefulInvntryQy;
/** 재고정책 */
private String invntryPolicyCd;
/** 가용재고제한수량 */
private String avlinvLmttQy;
/** 구독서비스상태 */
private String subsvcSttusCd;
/** 노출구분 */
private String expsrDvCd;
/** 노출시작일시 */
private String expsrBgnDt;
/** 노출종료일시 */
private String expsrEndDt;
/** 노출설정앞문구 */
private String expsrSetupFwords;
/** 구매수량제한구분코드 */
private String purchsQyLmttDvCd;
/** 구매수량 유형 */
private String purchsQyTyCd;
/** 최소구매수량 */
private String mummPurchsQy;
/** 최대구매수량 */
private String mxmmPurchsQy;
/** 구독서비스설명 */
private String subsvcDc;
/** 모바일구독서비스설명 */
private String mblSubsvcDc;
/** 모바일구독서비스설명 PC 동일여부 */
private String mblSubsvcDcPcSameAt;
/** 섬네일이미지경로 */
private String img;
/** 청약철회가능여부 */
private String subscrptWthdrawPosblAt;
/** 기본상품옵션고유번호 */
private String dftGoodsOptnInnb;
/** 최종처리차수 */
private String lastProcsOdr;
/** 삭제섬네일이미지경로 */
private String delImg;
/** 검색조건 */
/** 구독서비스명 selectbox*/
private String srchSelSubsvcNm;
/** 구독서비스명 */
private String srchSubsvcNm;
/** 구독서비스기수 select */
private String srchSelSubsvcGnr;
/** 구독서비스기수명 */
private String srchSubsvcGnrNm;
/** 구독서비스상태 */
private List<String> srchArrSubsvcSttusCd;
/** 노출구분 */
private String srchExpsrDvCd;
/** 정렬구분 */
private String sortDv;
/** 배열 구독서비스고유번호 */
private List<String> arrSubsvcInnb;
}

View File

@@ -291,6 +291,11 @@ public interface BOMbrMapper {
*/ */
public Integer selectBOMbrMbtlnbCompare(BOMbrVO mbrVO); public Integer selectBOMbrMbtlnbCompare(BOMbrVO mbrVO);
/**
* 회원 이메일 비교
* @param mbrVO
*/
public Integer selectBOMbrEmailCompare(BOMbrVO mbrVO);
/** /**
* 회원 이메일 수정 * 회원 이메일 수정

View File

@@ -500,6 +500,18 @@ public class BOMbrService {
return changeAt; return changeAt;
} }
/**
* 회원 정보 수정 전 이메일 변경 여부 체크
*
* @param mbrVO
* @return
* @author
*/
public Integer selectBOMbrEmailCompare(BOMbrVO mbrVO) {
Integer changeAt = mapper.selectBOMbrMbtlnbCompare(mbrVO);
return changeAt;
}
/** /**
* 회원 아이디 수정 * 회원 아이디 수정
* *

View File

@@ -206,7 +206,11 @@ public class BOAtmcRcpmnyCnfirmVO extends AbstractVO {
/** 입금여부3 */ /** 입금여부3 */
private String srchOrdrSttusCd3; private String srchOrdrSttusCd3;
private String srchDatePick;
/** 회원 구분 코드 */ /** 회원 구분 코드 */
private String mbrDvCd; private String mbrDvCd;
} }

View File

@@ -767,6 +767,8 @@ public interface BOOrdrMapper {
*/ */
public String selectBODefaultAdressAtInqire(DataMap vo); public String selectBODefaultAdressAtInqire(DataMap vo);
public String selectBODefaultAdressAtInqire2(DataMap vo);
/** /**
* 주문 상품 옵션별 정보와 배송그룹 정보 * 주문 상품 옵션별 정보와 배송그룹 정보
@@ -972,6 +974,14 @@ public interface BOOrdrMapper {
* @return * @return
*/ */
public String commonOrderSttusCdCheckCurrent(DataMap vo); public String commonOrderSttusCdCheckCurrent(DataMap vo);
/**
* 사용자 > 마이페이지 > 구독서비스 주문/배송 목록 조회
* @param ordrDlvyVO
* @return List<DataMap>
*/
public List<DataMap> selectMbrSubsvcOrdrList(BOOrdrDlvyVO ordrDlvyVO);
} }

View File

@@ -1810,6 +1810,25 @@ public class BOOrdrService{
return resultList; return resultList;
} }
/**
* 사용자 > 마이페이지 > MY쇼핑 > 구독서비스 주문/배송조회 > 구독서비스 주문/배송 목록 조회
* @param ordrDlvyVO
* @return List<DataMap>
*/
public List<DataMap> selectMbrSubsvcOrdrListInqireAjax(BOOrdrDlvyVO ordrDlvyVO) {
List<DataMap> resultList = null;
resultList = mapper.selectMbrSubsvcOrdrList(ordrDlvyVO);
if(resultList == null || resultList.size() == 0){
ordrDlvyVO.getPaginationInfo().setTotalRecordCount(0);
}else{
ordrDlvyVO.getPaginationInfo().setTotalRecordCount(Integer.parseInt(String.valueOf(resultList.get(0).get("totCnt"))));
}
return resultList;
}
/** /**
* 사용자 > 마이페이지 > MY쇼핑 > 주문/배송조회 > 주문 취소 상태 수정 * 사용자 > 마이페이지 > MY쇼핑 > 주문/배송조회 > 주문 취소 상태 수정
* @param ordrDlvyVO * @param ordrDlvyVO
@@ -2805,7 +2824,7 @@ public class BOOrdrService{
cashVO.setSopmalCd(ordrVO.getSopmalCd()); cashVO.setSopmalCd(ordrVO.getSopmalCd());
cashVO.setMbrDvCd(ordrVO.getMbrDvCd()); cashVO.setMbrDvCd(ordrVO.getMbrDvCd());
cashVO.setMbrInnb(String.valueOf(ordrVO.getMbrInnb())); cashVO.setMbrInnb(String.valueOf(ordrVO.getMbrInnb()));
//구매자조회
DataMap purchsrMap = purchsService.selectPurchsr(purchsrVO); DataMap purchsrMap = purchsService.selectPurchsr(purchsrVO);
if (!CollectionUtils.isEmpty(purchsrMap)) { if (!CollectionUtils.isEmpty(purchsrMap)) {
@@ -2984,6 +3003,8 @@ public class BOOrdrService{
public Map<String, Object> selectSetleExpectAmt(DataMap param) throws Exception { public Map<String, Object> selectSetleExpectAmt(DataMap param) throws Exception {
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
log.debug("selectSetleExpectAmt-param : {}", param);
LinkedHashMap setleExpectAmtMap = new LinkedHashMap() {{ LinkedHashMap setleExpectAmtMap = new LinkedHashMap() {{
put("goodsAmt", 0); put("goodsAmt", 0);
put("dlvyAmt", 0); put("dlvyAmt", 0);
@@ -3041,6 +3062,7 @@ public class BOOrdrService{
LinkedHashMap<String, Object> enuriMap = (LinkedHashMap) param.get("enuri"); // 애누리 ( 장바구니 쿠폰, 마일리지, 애누리 ) LinkedHashMap<String, Object> enuriMap = (LinkedHashMap) param.get("enuri"); // 애누리 ( 장바구니 쿠폰, 마일리지, 애누리 )
List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList"); List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList");
log.debug("goodsList : {}", goodsList);
if (!CollectionUtils.isEmpty(goodsList)) { if (!CollectionUtils.isEmpty(goodsList)) {
for (LinkedHashMap goods : goodsList) { for (LinkedHashMap goods : goodsList) {
@@ -3356,10 +3378,16 @@ public class BOOrdrService{
// ############################################## 배송지별 배송비 계산 START ############################################## // ############################################## 배송지별 배송비 계산 START ##############################################
String ordrAdressZip = StringUtil.isNullToString(param.get("dlvylcZip")); LinkedHashMap<String, Object> shippingMap = (LinkedHashMap) param.get("shipping");
// String ordrAdressZip = StringUtil.isNullToString(param.get("dlvylcZip"));
String ordrAdressZip = StringUtil.isNullToString(shippingMap.get("dlvylcZip"));
String dlvylcAreaCd = (String) shippingMap.get("dlvylcAreaCd");
String prefcd = (String) shippingMap.get("prefcd");
DataMap defaultAdressVO = new DataMap() {{ // DataMap defaultAdressVO = new DataMap() {{ //
put("sopmalCd", sopmalCd); // 쇼핑몰 코드 put("sopmalCd", sopmalCd); // 쇼핑몰 코드
put("zip", ordrAdressZip); // 우편번호 put("zip", ordrAdressZip); // 우편번호
put("prefcd", prefcd); // 도도부현코드
}}; }};
String defaultAdressAt = "N"; // 내가 제2권역 주소인지 여부 String defaultAdressAt = "N"; // 내가 제2권역 주소인지 여부
@@ -3391,15 +3419,21 @@ public class BOOrdrService{
dlvyCouponDscntAmt = dlvyCouponDscntAmt.add(new BigDecimal(applyDlvylcCouponDscntAmt)); dlvyCouponDscntAmt = dlvyCouponDscntAmt.add(new BigDecimal(applyDlvylcCouponDscntAmt));
} }
if("KR".equals(dlvylcAreaCd)){
defaultAdressVO.put("zip", StringUtil.isNullToString(dlvylcMapMulti.get("dlvylcZip"))); defaultAdressVO.put("zip", StringUtil.isNullToString(dlvylcMapMulti.get("dlvylcZip")));
log.debug("defaultAdressVO : {}", defaultAdressVO); log.debug("defaultAdressVO-KR : {}", defaultAdressVO);
defaultAdressAt = mapper.selectBODefaultAdressAtInqire(defaultAdressVO); defaultAdressAt = mapper.selectBODefaultAdressAtInqire(defaultAdressVO);
}
if("JP".equals(dlvylcAreaCd)){
defaultAdressVO.put("prefcd", StringUtil.isNullToString(dlvylcMapMulti.get("prefcd")));
log.debug("defaultAdressVO-JP : {}", defaultAdressVO);
defaultAdressAt = mapper.selectBODefaultAdressAtInqire2(defaultAdressVO);
}
List<LinkedHashMap> goodsListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("goodsList"); List<LinkedHashMap> goodsListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("goodsList");
log.debug("goodsListMulti : {}", goodsListMulti); log.debug("goodsListMulti : {}", goodsListMulti);
if (!CollectionUtils.isEmpty(goodsListMulti)) { if (!CollectionUtils.isEmpty(goodsListMulti)) {
dlvyAmtMapMulti = purchsService.getDlvyAmt(goodsListMulti, sopmalCd, defaultAdressAt); dlvyAmtMapMulti = purchsService.getDlvyAmt(goodsListMulti, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMapMulti)) { if (!CollectionUtils.isEmpty(dlvyAmtMapMulti)) {
if (dlvylcMapMulti.get("mngrFreeDlvyUseAt") != null && "Y".equals(dlvylcMapMulti.get("mngrFreeDlvyUseAt").toString())) { if (dlvylcMapMulti.get("mngrFreeDlvyUseAt") != null && "Y".equals(dlvylcMapMulti.get("mngrFreeDlvyUseAt").toString())) {
@@ -3423,8 +3457,68 @@ public class BOOrdrService{
} }
} else { // 일반 주문 } else { // 일반 주문
// DataMap dlvyAmtMapMulti = null;
//
// LinkedHashMap<String, Object> multiOrdrDlvylcMap = (LinkedHashMap) param.get("multiOrdrDlvylc");
//
// log.debug("multiOrdrDlvylcMap : {}", multiOrdrDlvylcMap);
// if (!CollectionUtils.isEmpty(multiOrdrDlvylcMap)) {
//
// List<LinkedHashMap<String, Object>> dlvylcListMulti = (List<LinkedHashMap<String, Object>>) multiOrdrDlvylcMap.get("dlvylc");
//
// if (!CollectionUtils.isEmpty(dlvylcListMulti)) {
//
// int dlvyAmtIndex = 0; // 배송지 rownum 체크
// for (LinkedHashMap<String, Object> dlvylcMapMulti : dlvylcListMulti) {
// int dlvyAmtBydlvylc = 0;
//
// LinkedHashMap dlvylcDscntDtlsMulti = (LinkedHashMap) dlvylcMapMulti.get("dlvylcDscntDtls");
//
// if (!CollectionUtils.isEmpty(dlvylcDscntDtlsMulti)) {
// int applyDlvylcCouponDscntAmt = (int) dlvylcDscntDtlsMulti.get("dscntAmt");
//
// dlvyCouponDscntAmt = dlvyCouponDscntAmt.add(new BigDecimal(applyDlvylcCouponDscntAmt));
// }
//
//
// defaultAdressVO.put("zip", StringUtil.isNullToString(dlvylcMapMulti.get("dlvylcZip")));
// log.debug("defaultAdressVO : {}", defaultAdressVO);
// defaultAdressAt = mapper.selectBODefaultAdressAtInqire(defaultAdressVO);
//
// List<LinkedHashMap> goodsListMulti = (List<LinkedHashMap>) dlvylcMapMulti.get("goodsList");
// log.debug("goodsListMulti : {}", goodsListMulti);
// if (!CollectionUtils.isEmpty(goodsListMulti)) {
// dlvyAmtMapMulti = purchsService.getDlvyAmt(goodsListMulti, sopmalCd, defaultAdressAt, dlvylcAreaCd);
//
// if (!CollectionUtils.isEmpty(dlvyAmtMapMulti)) {
// if (dlvylcMapMulti.get("mngrFreeDlvyUseAt") != null && "Y".equals(dlvylcMapMulti.get("mngrFreeDlvyUseAt").toString())) {
// log.debug("관리자 무료배송 체크 'Y'");
// dlvyAmt = dlvyAmt.add(new BigDecimal(0));
// } else {
// dlvyAmt = dlvyAmt.add((BigDecimal) dlvyAmtMapMulti.get("dlvyAmt"));
// }
// dlvyAmtMulti.put("shippingDlvyAmt" + dlvyAmtIndex, new BigDecimal(String.valueOf(dlvyAmtMapMulti.get("dlvyAmt"))));
//
// dftDlvyAmt = dftDlvyAmt.add((BigDecimal) dlvyAmtMapMulti.get("dftDlvyAmt"));
// dlvyAmtMulti.put("shippingDftDlvyAmt" + dlvyAmtIndex, new BigDecimal(String.valueOf(dlvyAmtMapMulti.get("dftDlvyAmt"))));
//
// dlvyAmtIndex += 1; // 배송지 rownum ++
// }
// }
// }
//
// }
//
// }
defaultAdressAt = mapper.selectBODefaultAdressAtInqire(defaultAdressVO); if("KR".equals(dlvylcAreaCd)){
log.debug("defaultAdressVO-KR : {}", defaultAdressVO);
defaultAdressAt = mapper.selectBODefaultAdressAtInqire(defaultAdressVO);
}
if("JP".equals(dlvylcAreaCd)){
log.debug("defaultAdressVO-JP : {}", defaultAdressVO);
defaultAdressAt = mapper.selectBODefaultAdressAtInqire2(defaultAdressVO);
}
LinkedHashMap<String, Object> dlvylcMap = (LinkedHashMap) param.get("dlvylc"); LinkedHashMap<String, Object> dlvylcMap = (LinkedHashMap) param.get("dlvylc");
@@ -3452,18 +3546,18 @@ public class BOOrdrService{
if (dlvylcMap.get("dlvyAmt") != null) { if (dlvylcMap.get("dlvyAmt") != null) {
log.debug("배송비 객체 : {}", dlvylcMap); log.debug("배송비 객체 : {}", dlvylcMap);
if (dlvylcMap.get("mngrFreeDlvyUseAt") != null && "N".equals(dlvylcMap.get("mngrFreeDlvyUseAt").toString())) { if (dlvylcMap.get("mngrFreeDlvyUseAt") != null && "N".equals(dlvylcMap.get("mngrFreeDlvyUseAt").toString())) {
dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
} else if (dlvylcMap.get("mngrFreeDlvyUseAt") != null && "Y".equals(dlvylcMap.get("mngrFreeDlvyUseAt").toString())) { } else if (dlvylcMap.get("mngrFreeDlvyUseAt") != null && "Y".equals(dlvylcMap.get("mngrFreeDlvyUseAt").toString())) {
log.debug("관리자 무료배송 체크 'Y'"); log.debug("관리자 무료배송 체크 'Y'");
} else { } else {
dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
} }
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue(); dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue();
} }
} else { } else {
dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue(); dlvyAmtBydlvylc = ((BigDecimal) dlvyAmtMap.get("dlvyAmt")).intValue();
@@ -3472,7 +3566,7 @@ public class BOOrdrService{
dlvyAmt = new BigDecimal(dlvyAmtBydlvylc); dlvyAmt = new BigDecimal(dlvyAmtBydlvylc);
} else { } else {
dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt); dlvyAmtMap = purchsService.getDlvyAmt(goodsList, sopmalCd, defaultAdressAt, dlvylcAreaCd);
if (!CollectionUtils.isEmpty(dlvyAmtMap)) { if (!CollectionUtils.isEmpty(dlvyAmtMap)) {
dlvyAmt = (BigDecimal) dlvyAmtMap.get("dlvyAmt"); dlvyAmt = (BigDecimal) dlvyAmtMap.get("dlvyAmt");

View File

@@ -26,6 +26,8 @@ public class BOCrmDlvylcVO extends AbstractVO{
@NotBlank(message = "배송지 설명") @NotBlank(message = "배송지 설명")
@Length(min=1, max=67) @Length(min=1, max=67)
private String dlvylcDcCn; private String dlvylcDcCn;
/**배송지역코드*/
private String dlvylcAreaCd;
/** 받는사람명 */ /** 받는사람명 */
@NotBlank(message = "받으시는 분") @NotBlank(message = "받으시는 분")
@Length(min=1, max=13) @Length(min=1, max=13)
@@ -38,7 +40,7 @@ public class BOCrmDlvylcVO extends AbstractVO{
private String telnb; private String telnb;
/** 우편번호 */ /** 우편번호 */
@NotBlank(message = "우편번호") @NotBlank(message = "우편번호")
@Length(min=1, max=5) @Length(min=1, max=7)
private String zip; private String zip;
/** 도로명,지번 구분*/ /** 도로명,지번 구분*/
private String adresDv; private String adresDv;
@@ -50,6 +52,10 @@ public class BOCrmDlvylcVO extends AbstractVO{
private String rnmAdres = ""; private String rnmAdres = "";
/** 상세주소 */ /** 상세주소 */
private String dtlAdres; private String dtlAdres;
/** 개인통관부호(개인통관번호) */
private String cstmclerCd;
/** 도도부현 코드(일본) */
private String prefcd;
/** 기본배송지여부 */ /** 기본배송지여부 */
private String dftDlvylcAt = "N"; private String dftDlvylcAt = "N";
/** 최근배송지여부 */ /** 최근배송지여부 */

View File

@@ -16,7 +16,7 @@ public class BODwldItmVO extends AbstractVO {
private String sopmalCd; // 쇼핑몰 코드 private String sopmalCd; // 쇼핑몰 코드
private long excelDwldFormSnb; // 엑셀다운로드양식순번 private String excelDwldFormSnb; // 엑셀다운로드양식순번
private String excelFormDvCd; // 코드그룹 : formDvCd 코드 : 주문, 회원 private String excelFormDvCd; // 코드그룹 : formDvCd 코드 : 주문, 회원

View File

@@ -76,7 +76,7 @@ public class BOOrdrSrchVO extends AbstractVO{
private String srchMemorSetleAt; // 수기결제여부 private String srchMemorSetleAt; // 수기결제여부
private long srchExcelDwldFormSnb; // 엑셀다운로드양식순번 private String srchExcelDwldFormSnb; // 엑셀다운로드양식순번
private String srchExcelDwldDvCd; // 엑셀다운로드 대상 구분 코드 private String srchExcelDwldDvCd; // 엑셀다운로드 대상 구분 코드

View File

@@ -0,0 +1,57 @@
package com.wb.domainserver.domain.gcone.ordr.subsvc.mapper;
import com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO;
import com.wb.domainserver.util.dataaccess.DataMap;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
*
* 구독서비스 주문 BO mapper
* @author jazz
* @since 2026-02-04
* @version 1.0
* @see
*
* <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-02-04 jazz 최초 생성
*
* </pre>
*/
@Mapper
@Repository
public interface BOSubsvcOrdrMapper {
/** 구독서비스 상품준비 관리 목록*/
List<DataMap> selectBOSubsvcOrderList(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 목록 배송내역 팝업 배송내역목록*/
List<DataMap> selectBOSubsvcOrderDlvyList(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 상품매칭 - 1. GC_ORDER update*/
int updateBOSubsvcGoodsMappgOrdr(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 상품매칭 - 2. GC_ORDER_ITEM update*/
int updateBOSubsvcGoodsMappgOrdrItem(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 상품매칭 - 3. GC_ORDER_ITEM_OPTION update*/
int updateBOSubsvcGoodsMappgOrdrItemOptn(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 상품매칭 - 4. GC_ORDER_SHIPPING update*/
int updateBOSubsvcGoodsMappgShipping(BOSubsvcOrderVO vo);
/** 구독서비스 상품준비 관리 상품매칭 - 5. GC_SUBSVC update*/
int updateBOSubsvcGoodsMappgSubsvc(BOSubsvcOrderVO vo);
/** 구독서비스 상품변경 관리 목록*/
List<DataMap> selectBOSubsvcOrderMappedList(BOSubsvcOrderVO vo);
/** 구독서비스 구독자조회 목록*/
List<DataMap> selectBOSubsvcOrderMbrList(BOSubsvcOrderVO vo);
/** 구독서비스 구독자조회 - 구독자목록 팝업 - 구독서비스 정보*/
DataMap selectBOSubsvcInfo(BOSubsvcOrderVO vo);
/** 구독서비스 구독자조회 - 구독자목록 팝업 - 구독자목록 조회*/
List<DataMap> selectBOSubsvcOrderMbrInfoList(BOSubsvcOrderVO vo);
/** 구독서비스 구독자조회 - 배송상품 목록팝업 - 배송상품목록 조회*/
List<DataMap> selectBOSubsvcOrderGoodsInfoList(BOSubsvcOrderVO vo);
}

View File

@@ -0,0 +1,247 @@
package com.wb.domainserver.domain.gcone.ordr.subsvc.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jose.shaded.gson.Gson;
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;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOPurchsService;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.*;
import com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO;
import com.wb.domainserver.domain.gcone.mbr.mbr.mapper.BOMbrMapper;
import com.wb.domainserver.domain.gcone.mbr.mbr.service.BOMbrService;
import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrAppnVO;
import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO;
import com.wb.domainserver.domain.gcone.mbr.mlg.service.BOMlgService;
import com.wb.domainserver.domain.gcone.mbr.mlg.vo.BOCashVO;
import com.wb.domainserver.domain.gcone.mbr.mlg.vo.BOMlgVO;
import com.wb.domainserver.domain.gcone.ntcn.mssage.service.BOMssageService;
import com.wb.domainserver.domain.gcone.ordr.ordr.mapper.BOOrdrMapper;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrderCommonService;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrLogService;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.*;
import com.wb.domainserver.domain.gcone.ordr.pay.service.BOPayService;
import com.wb.domainserver.domain.gcone.ordr.pay.vo.BOPayVO;
import com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.mapper.BORtngudrefndMapper;
import com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.service.BORtngudrefndService;
import com.wb.domainserver.domain.gcone.ordr.rtngudrefnd.vo.BORtngudrefndVO;
import com.wb.domainserver.domain.gcone.ordr.selngpruf.service.BOSelngprufService;
import com.wb.domainserver.domain.gcone.ordr.selngpruf.vo.BOSelngprufVO;
import com.wb.domainserver.domain.gcone.ordr.subsvc.mapper.BOSubsvcOrdrMapper;
import com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO;
import com.wb.domainserver.domain.gcone.promtn.coupon.service.BOCouponService;
import com.wb.domainserver.domain.gcone.promtn.coupon.vo.BODwldCouponVO;
import com.wb.domainserver.domain.gcone.setup.site.service.BOSiteService;
import com.wb.domainserver.domain.gcone.setup.site.vo.BOGoodsgrpVO;
import com.wb.domainserver.domain.gcone.setup.site.vo.BOSiteVO;
import com.wb.domainserver.exception.WnbtException;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
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.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 구독서비스주문 BO service
* @author jazz
* @since 2026-02-05
* @version 1.0
* @see
*
* <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-02-05 jazz 최초 생성
*
* </pre>
*/
@Service
@Slf4j
public class BOSubsvcOrdrService {
@Autowired
private BOSubsvcOrdrMapper mapper;
/**
* 구독서비스 상품준비 관리 목록
* @param
* @return List<DataMap>
*/
public List<DataMap> selectBOSubsvcOrderList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<>();
try {
dataList = mapper.selectBOSubsvcOrderList(vo);
}catch(Exception e){
e.printStackTrace();
throw e;
}
if(dataList == null || dataList.isEmpty()){
vo.getPaginationInfo().setTotalRecordCount(0);
}else{
vo.getPaginationInfo().setTotalRecordCount(((Long)dataList.get(0).get("totCnt")).intValue());
}
return dataList;
}
/**
* 구독서비스 상품준비 관리 목록 배송내역 팝업 배송내역목록
* @param
* @return List<DataMap>
*/
public List<DataMap> selectBOSubsvcOrderDlvyList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<>();
dataList = mapper.selectBOSubsvcOrderDlvyList(vo);
return dataList;
}
/**
* 선택대상 상품준비 일괄처리
* 구독서비스 상품준비 일괄처리
* 1. GC_ORDER 주문상태를 결제확인(25)만 상품준비중(35)로 변경(25가 아니면 UPDT_DT만 변경)
* 2. GC_ORDER_ITEM의 상품고유번호(GOODS_INNB), 상품이지지경로(GOODS_IMG_COURS), 상품명(GOODS_NM)를 변경
* 3. GC_ORDER_ITEM_OPTION의 상품옵셥 고유번호(GOODS_OPTN_INNB), 주문상태(GOODS_STTUS_CD)를 결제확인(25)=>상품준비중(35), 옵션명1(OPTN_NM_1) 부터 GC_GOODS_OPTION과 동일한 컬럼 매칭
* 4. GC_ORDER_SHIPPING의 주문배송고유번호(ORDR_DLVY_INNB)가 같은 대상의 주문상태(GOODS_STTUS_CD)를 결제확인(25)=>상품준비중(35)
* 5. GC_SUBSVC의 최종처리차수(LAST_PROCS_DGR)를 수정 (주문상품옵션에 주문별 처리차수중 가능 큰처리차수(35~75까지 COUNT해서 가장 큰수)를 등록)
* */
@Transactional(rollbackFor = Exception.class)
public String updateSubsvcOrdrReady(BOSubsvcOrderVO vo) {
String message = "success";
/*1. GC_ORDER*/
int result = mapper.updateBOSubsvcGoodsMappgOrdr(vo);
if (!(result > 0)) {
log.error("GC_ORDER UPDATE 오류");
throw new WnbtException("500","GC_ORDER UPDATE 오류");
}
result = mapper.updateBOSubsvcGoodsMappgOrdrItem(vo);
if (!(result > 0)) {
log.error("GC_ORDER_ITEM UPDATE 오류");
throw new WnbtException("500","GC_ORDER_ITEM UPDATE 오류");
}
result = mapper.updateBOSubsvcGoodsMappgOrdrItemOptn(vo);
if (!(result > 0)) {
log.error("GC_ORDER_ITEM_OPTION UPDATE 오류");
throw new WnbtException("500","GC_ORDER_ITEM_OPTION UPDATE 오류");
}
result = mapper.updateBOSubsvcGoodsMappgShipping(vo);
if (!(result > 0)) {
log.error("GC_ORDER_SHIPPING UPDATE 오류");
throw new WnbtException("500","GC_ORDER_SHIPPING UPDATE 오류");
}
result = mapper.updateBOSubsvcGoodsMappgSubsvc(vo);
if (!(result > 0)) {
log.error("GC_SUBSVC 처리중 오류");
throw new WnbtException("500","GC_SUBSVC 처리중 오류");
}
return message;
}
/**
* 구독서비스 상품변경 관리 목록
* @param vo
* @return List<DataMap>
*/
public List<DataMap> selectBOSubsvcOrderMappedList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<>();
try {
dataList = mapper.selectBOSubsvcOrderMappedList(vo);
}catch(Exception e){
e.printStackTrace();
throw e;
}
if(dataList == null || dataList.isEmpty()){
vo.getPaginationInfo().setTotalRecordCount(0);
}else{
vo.getPaginationInfo().setTotalRecordCount(((Long)dataList.get(0).get("totCnt")).intValue());
}
return dataList;
}
/**
* 구독서비스 구독자조회 목록
* @param vo
* @return List<DataMap>
*/
public List<DataMap> selectBOSubsvcOrderMbrList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<>();
try {
dataList = mapper.selectBOSubsvcOrderMbrList(vo);
}catch(Exception e){
e.printStackTrace();
throw e;
}
if(dataList == null || dataList.isEmpty()){
vo.getPaginationInfo().setTotalRecordCount(0);
}else{
vo.getPaginationInfo().setTotalRecordCount(((Long)dataList.get(0).get("totCnt")).intValue());
}
return dataList;
}
/**
* 구독서비스 구독자조회 - 구독자목록 팝업 - 구독서비스 정보
* @param vo
* @return DataMap
*/
public DataMap selectBOSubsvcInfo(BOSubsvcOrderVO vo) {
DataMap data = new DataMap();
data = mapper.selectBOSubsvcInfo(vo);
return data;
}
/**
* 구독서비스 구독자조회 - 구독자목록 팝업 - 구독자목록 조회
* @param vo
* @return DataMap
*/
public List<DataMap> selectBOSubsvcOrderMbrInfoList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<DataMap>();
dataList = mapper.selectBOSubsvcOrderMbrInfoList(vo);
return dataList;
}
/**
* 구독서비스 구독자조회 - 배송상품 목록팝업 - 배송상품목록 조회
* @param vo
* @return DataMap
*/
public List<DataMap> selectBOSubsvcOrderGoodsInfoList(BOSubsvcOrderVO vo) {
List<DataMap> dataList = new ArrayList<DataMap>();
dataList = mapper.selectBOSubsvcOrderGoodsInfoList(vo);
return dataList;
}
}

View File

@@ -0,0 +1,78 @@
package com.wb.domainserver.domain.gcone.ordr.subsvc.vo;
import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
public class BOSubsvcOrderVO extends AbstractVO {
private static final long serialVersionUID = 1L;
/** 구독서비스고유번호 */
private String subsvcInnb;
/** 쇼핑몰코드 */
private String sopmalCd;
/** 구독서비스명 */
private String subsvcNm;
/** 구독기간 */
private String subPd;
/** 구독서비스기수 */
private String subsvcGnr;
/** 구독서비스명 다음기수 */
private String subsvcNextGnr;
/** 구독서비스기수명 */
private String subsvcGnrNm;
/** 주문고유번호 */
private String ordrInnb;
/** 주문상품고유번호 */
private String ordrGoodsInnb;
/** 주문상품옵션고유번호 */
private String ordrGoodsOptnInnb;
/** 출고상품고유번호*/
private String goodsInnb;
/** 출고상품옵션고유번호*/
private String goodsOptnInnb;
/** 출고상품옵션구분*/
private String optnTy;
/** 상품준비대상*/
private List<String> arrCheck;
/** 상품준비대상 주문고유번호*/
private List<String> arrOrdrInnb;
/** 상품준비대상 주문상품고유번호*/
private List<String> arrOrdrGoodsInnb;
/** 상품준비대상 주문상품옵션고유번호*/
private List<String> arrOrdrGoodsOptnInnb;
/** 상품준비대상 주문고유번호*/
private List<String> arrOrdrDlvyInnb;
/** 검색조건 */
/** 구독서비스명 selectbox*/
private String srchSelSubsvcNm;
/** 구독서비스명 */
private String srchSubsvcNm;
/** 구독서비스기수 select */
private String srchSelSubsvcGnr;
/** 구독서비스기수명 */
private String srchSubsvcGnrNm;
/** 정렬구분 */
private String sortDv;
/** 배열 구독서비스고유번호 */
private List<String> arrSubsvcInnb;
/**당월제외*/
private String srchCurMonExclude;
/**주문번호*/
private String srchOrdrInnb;
/**주문자명*/
private String srchMbrNm;
/**주문자ID*/
private String srchMbrId;
/**구독종료여부*/
private String srchSubEndAt;
}

View File

@@ -88,18 +88,21 @@ public interface BODlvygrpMapper {
* @param dlvyGroup * @param dlvyGroup
*/ */
void updateBODlvyGroupRtnlc(BODlvygrpVO dlvyGroup); void updateBODlvyGroupRtnlc(BODlvygrpVO dlvyGroup);
void updateBODlvyGroupRtnlc2(BODlvygrpVO dlvyGroup);
/** /**
* 배송그룹 반송지 등록 * 배송그룹 반송지 등록
* @param dlvyGroup * @param dlvyGroup
*/ */
void insertBODlvyGroupAddress(BODlvygrpVO dlvyGroup); void insertBODlvyGroupAddress(BODlvygrpVO dlvyGroup);
void insertBODlvyGroupAddress2(BODlvygrpVO dlvyGroup);
/** /**
* 배송그룹 반송지 삭제 (Y -> N) * 배송그룹 반송지 삭제 (Y -> N)
* @param dlvyGroup * @param dlvyGroup
*/ */
void deleteBODlvyGroupRtnlc(BODlvygrpVO dlvyGroup); void deleteBODlvyGroupRtnlc(BODlvygrpVO dlvyGroup);
void deleteBODlvyGroupRtnlc2(BODlvygrpVO dlvyGroup);
/** /**
* 배송 반송지 조회 * 배송 반송지 조회

View File

@@ -76,9 +76,11 @@ public class BODlvygrpService {
public Map<String, Object> insertBODlvyGroup(BODlvygrpVO dlvyGroup) { public Map<String, Object> insertBODlvyGroup(BODlvygrpVO dlvyGroup) {
Map<String, Object> message = new HashMap<>(); Map<String, Object> message = new HashMap<>();
try { try {
// KR 반송지 등록
mapper.insertBODlvyGroupAddress(dlvyGroup); mapper.insertBODlvyGroupAddress(dlvyGroup);
// JP 반송지 등록
mapper.insertBODlvyGroupAddress2(dlvyGroup);
// 배송그룹 등록
mapper.insertBODlvyGroup(dlvyGroup); mapper.insertBODlvyGroup(dlvyGroup);
message.put("dlvyGroupInnb", dlvyGroup.getDlvyGroupInnb()); message.put("dlvyGroupInnb", dlvyGroup.getDlvyGroupInnb());
message.put("result", "success"); message.put("result", "success");
@@ -113,6 +115,7 @@ public class BODlvygrpService {
try { try {
mapper.updateBODlvyGroupRtnlc(dlvyGroup); mapper.updateBODlvyGroupRtnlc(dlvyGroup);
mapper.updateBODlvyGroupRtnlc2(dlvyGroup);
int result = mapper.updateBODlvyGroupDtl(dlvyGroup); int result = mapper.updateBODlvyGroupDtl(dlvyGroup);
message.put("result", "success"); message.put("result", "success");
message.put("dlvyGroupInnb", dlvyGroup.getDlvyGroupInnb()); message.put("dlvyGroupInnb", dlvyGroup.getDlvyGroupInnb());
@@ -137,7 +140,9 @@ public class BODlvygrpService {
int goodsEa = mapper.isIncludeGoods(dlvyGroup); int goodsEa = mapper.isIncludeGoods(dlvyGroup);
if(goodsEa < 1) { if(goodsEa < 1) {
try { try {
dlvyGroup = mapper.selectBODlvyGroupDtlForm(dlvyGroup);
mapper.deleteBODlvyGroupRtnlc(dlvyGroup);
mapper.deleteBODlvyGroupRtnlc2(dlvyGroup);
int result = mapper.deleteBODlvyGroup(dlvyGroup); int result = mapper.deleteBODlvyGroup(dlvyGroup);
message.put("result", "success"); message.put("result", "success");
} catch (WnbtRestException wre){ } catch (WnbtRestException wre){

View File

@@ -73,12 +73,66 @@ public class BODlvygrpVO extends AbstractVO {
private String rtnlcTelnb; private String rtnlcTelnb;
/*반품배송비왕복금액적용여부*/ /** 반품배송비왕복금액적용여부 */
private String returnDlvyApplcAt; private String returnDlvyApplcAt;
/*반품배송비금액*/ /** 반품배송비금액 */
private String returnDlvyAmt; private String returnDlvyAmt;
/*왕복배송비금액*/ /** 왕복배송비금액 */
private String exchngDlvyAmt; private String exchngDlvyAmt;
/** 반송지2(JP) 고유번호 */
private Integer rtnlcInnb2;
/** 반송지 우편번호2(JP) */
private String rtnlcZip2;
/** 반송지 주소2(JP) */
private String rtnlcAdres2;
/** 반송지 상세주소2(JP) */
@Length(min=0, max=100, message = "반송지(JP상세주소)")
private String rtnlcDtlAdres2;
/** 반송지 전화번호2(JP) */
private String rtnlcTelnb2;
/** 기본배송비2(JP) */
private String dftDlvyAmt2;
/** 금액조건2(JP) */
private String amtCndUseAt2;
/** 금액조건 추가금액2(JP) */
private String amtCndAditAmt2;
/** 개수조건2(JP) */
private String cntCndUseAt2;
/** 개수조건 추가금액2(JP) */
private String cntCndAditAmt2;
/** 배송지역추가여부2(JP) */
private String dlvyAreaAditAt2;
/** 지역추가배송비2(JP) */
private String areaAditDlvyAmt2;
/** 묶음배송 사용여부2(JP) */
private String bundleDlvyUseAt2;
/** 묶음배송 조건금액2(JP) */
private String bundleDlvyCndAmt2;
/** 반품배송비왕복금액적용여부2(JP) */
private String returnDlvyApplcAt2;
/** 반품배송비금액2(JP) */
private String returnDlvyAmt2;
/** 왕복배송비금액2(JP) */
private String exchngDlvyAmt2;
} }

View File

@@ -4,6 +4,7 @@ import java.util.List;
import com.wb.domainserver.domain.comm.vo.AbstractVO; import com.wb.domainserver.domain.comm.vo.AbstractVO;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 주문 설정 VO * 주문 설정 VO
@@ -23,6 +24,7 @@ import lombok.Data;
* </pre> * </pre>
*/ */
@Data @Data
@EqualsAndHashCode(callSuper=true)
public class BOSetupOrdrVO extends AbstractVO { public class BOSetupOrdrVO extends AbstractVO {
/** 쇼핑몰 코드 */ /** 쇼핑몰 코드 */
private String sopmalCd; private String sopmalCd;

View File

@@ -0,0 +1,441 @@
package com.wb.domainserver.domain.mngr.goods.subsvc.controller;
import com.google.j2objc.annotations.Property;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.common.mvc.tags.ui.pagination.PaginationInfo;
import com.wb.domainserver.common.prop.PaginationProperties;
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.common.service.BOCommonService;
import com.wb.domainserver.domain.gcone.goods.cmnuse.vo.BOCmnuseVO;
import com.wb.domainserver.domain.gcone.goods.goods.vo.BOGoodsVO;
import com.wb.domainserver.domain.gcone.goods.goodsinfo.vo.BOGoodsInfoVO;
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.setup.dlvygrp.vo.BODlvygrpVO;
import com.wb.domainserver.domain.mngr.goods.goodsinfo.vo.GoodsInfoVO;
import com.wb.domainserver.exception.WnbtRestException;
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.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.file.service.FileStorageService;
import com.wb.domainserver.util.file.vo.FileVo;
import io.micrometer.common.util.StringUtils;
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.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* SubsvcController Controller Class
*
* @author
* @since 2026-01-23
* @version 1.0
* @see
*
* <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-01-23 jazz 최초 생성
*
* </pre>
*/
@Slf4j
@Controller
@RequestMapping("/mngr/goods/subsvc")
public class SubsvcController {
/** WebClient 호출을 위한 wrapper */
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
/** 파일 업로드 */
@Autowired
private FileStorageService filestore;
@Value("${mngrfo.common.fileupload.uploaddirs.web}")
private String uploadWebFilePath;
@Value("${mngrfo.common.subsvc.dft-goods-optn-innb}")
private String dftGoodsOptnInnb;
@Autowired
private BOSubsvcService boSubsvcService;
@Autowired
private BOCommonService commonService;
@Autowired
private BOMaComncdService boMaComncdService;
@Autowired
private PaginationProperties paginationProperties;
/**
* 구독서비스 목록 조회 폼
* @param vo
* @return SubsvcListForm.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcListForm")
public String selectSubsvcListForm(BOSubsvcVO vo, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", vo);
// 조회조건 구독서비스
List<?> SrchSubsvcList = boSubsvcService.selectBOMngrSrchSubsvcList(vo);
content.put("srchSubsvcList", SrchSubsvcList);
//조회조건 판매상태
BOMaComncdVO param = new BOMaComncdVO();
param.setGroupCd("GOODS_STTUS");
List<?> srchSubsvcSttusList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("srchSubsvcSttusList", srchSubsvcSttusList);
//조회조건 노출구분
param.setGroupCd("EXPSR_DV");
List<?> srchExpsrDvList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("srchExpsrDvList", srchExpsrDvList);
model.addAttribute("resultMap", content);
return "mngr/goods/subsvc/SubsvcListForm";
}
/**
* 구독서비스 수정화면
* @param vo
* @return SubsvcDtlU.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcDtlForm")
public String selectSubsvcDtlForm(BOSubsvcVO vo, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", vo);
// 구독서비스 상세조회
DataMap subsvcDtl = boSubsvcService.selectBOSubsvcDetail(vo);
content.put("subsvcDtl", subsvcDtl);
//판매상태
BOMaComncdVO param = new BOMaComncdVO();
param.setGroupCd("GOODS_STTUS");
List<?> subsvcSttusList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("subsvcSttusList", subsvcSttusList);
//노출구분
param.setGroupCd("EXPSR_DV");
List<?> expsrDvList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("expsrDvList", expsrDvList);
//가용재고정책
param.setGroupCd("INVNTRY_POLICY");
List<?> invntryPolicyList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("invntryPolicyList", invntryPolicyList);
model.addAttribute("resultMap", content);
return "mngr/goods/subsvc/SubsvcU";
}
/**
* 구독서비스 수정
* @param vo
* @param request
* @return
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/updateSubsvc", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateSubsvc(BOSubsvcVO vo, HttpServletRequest request, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
vo.setUpdusr(user.getUserInnb());
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
//파일 업로드 관련 START
List<HashMap<String, Object>> uploadFileMap = new ArrayList<HashMap<String, Object>>();
request.setAttribute("shopCd", vo.getSopmalCd());
request.setAttribute("pathGubun", "GDIG"); //이미지구분코드 - 상품
try {
/*파일 업로드 후 경로 추출하여 vo에 셋팅*/
uploadFileMap = filestore.fileUpload(request);
if(uploadFileMap.size() == 1){
FileVo thumbNail = (FileVo) uploadFileMap.get(0).get("thumbNail");
vo.setImg( uploadFileMap.get(0).get("filePath")+ File.separator + thumbNail.getFileName());
}
} catch (WnbtRestException wre) {
log.error(wre.getMessage(), wre);
throw new WnbtRestException("파일 업로드에 실패했습니다." + wre.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException("파일 업로드에 실패했습니다." + e.getMessage());
}
//파일 업로드 관련 END
Map<String, Object> message = new HashMap<>();
String result = boSubsvcService.updateBOMngrSubsvc(vo);
message.put("message",result);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/**
* 구독서비스 등록(복사)품
* @param vo
* @return SubsvcC.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcRegistForm")
public String selectSubsvcRegistForm(BOSubsvcVO vo, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", vo);
// 구독서비스 상세조회
DataMap subsvcDtl = boSubsvcService.selectBOSubsvcDetail(vo);
content.put("subsvcDtl", subsvcDtl);
//판매상태
BOMaComncdVO param = new BOMaComncdVO();
param.setGroupCd("GOODS_STTUS");
List<?> subsvcSttusList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("subsvcSttusList", subsvcSttusList);
//노출구분
param.setGroupCd("EXPSR_DV");
List<?> expsrDvList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("expsrDvList", expsrDvList);
//가용재고정책
param.setGroupCd("INVNTRY_POLICY");
List<?> invntryPolicyList = boMaComncdService.selectBOCommcdDetailList(param);
content.put("invntryPolicyList", invntryPolicyList);
model.addAttribute("resultMap", content);
return "mngr/goods/subsvc/SubsvcC";
}
/**
* 구독서비스 등록
* @param vo
* @param request
* @return
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/insertSubsvc", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> insertSubsvc(BOSubsvcVO vo, HttpServletRequest request, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
vo.setRegusr(user.getUserInnb());
if ("01".equals(user.getSysDvCd())) {
vo.setSopmalCd(user.getSopmalCd());
}
//파일 업로드 관련 START
List<HashMap<String, Object>> uploadFileMap = new ArrayList<HashMap<String, Object>>();
request.setAttribute("shopCd", vo.getSopmalCd());
request.setAttribute("pathGubun", "GDIG"); //이미지구분코드 - 상품
try {
/*파일 업로드 후 경로 추출하여 vo에 셋팅*/
uploadFileMap = filestore.fileUpload(request);
if(uploadFileMap.size() == 1){
FileVo thumbNail = (FileVo) uploadFileMap.get(0).get("thumbNail");
vo.setImg( uploadFileMap.get(0).get("filePath")+ File.separator + thumbNail.getFileName());
}
} catch (WnbtRestException wre) {
log.error(wre.getMessage(), wre);
throw new WnbtRestException("파일 업로드에 실패했습니다." + wre.getMessage());
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new WnbtRestException("파일 업로드에 실패했습니다." + e.getMessage());
}
//파일 업로드 관련 END
//기본상품옵션번호셋팅
vo.setDftGoodsOptnInnb(dftGoodsOptnInnb);
Map<String, Object> message = new HashMap<>();
String result = boSubsvcService.insertBOMngrSubsvc(vo);
message.put("message",result);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/**
* 구독서비스 목록 조회 리스트
* @param vo
* @param model
* @return SubsvcList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcList")
public String selectSubsvcList(BOSubsvcVO vo,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
}
// 페이징 객체 생성 & 페이징정보 할당
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(vo.getPageIndex());
paginationInfo.setRecordCountPerPage(vo.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
vo.setPaginationInfo(paginationInfo);
vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
vo.setLastIndex(paginationInfo.getLastRecordIndex());
vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(StringUtils.isEmpty(vo.getSortDv())){
//정렬기준 초기값 셋팅
vo.setSortDv("subsvcGnrAsc");
}
// 목록 조회
List<DataMap> list = boSubsvcService.selectBOMngrSubsvcList(vo);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", vo);
content.put("list", list);
content.put("paginationInfo", vo.getPaginationInfo());
model.addAttribute("resultMap", content);
return "mngr/goods/subsvc/SubsvcList";
}
/**
* 구독서비스명 중복체크
* @param vo
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcNmDupCheck", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> selectSubsvcNmDupCheck(BOSubsvcVO vo, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
}
DataMap message = new DataMap();
String result = boSubsvcService.selectBOMngrSubsvcNmDupCheck(vo);
message.put("message", result);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/**
* 구독서비스 선택삭제
* @param vo
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/deleteSubsvc", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> deleteSubsvc(BOSubsvcVO vo, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
vo.setUpdusr(user.getUserInnb()); //수정자
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
}
DataMap message = new DataMap();
String result = boSubsvcService.deleteBOMngrSubsvc(vo);
message.put("message", result);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/**
* 구독서비스 목록 조회 리스트
* @param vo
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSrchSubsvcGnrListAjax", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> selectSrchSubsvcGnrListAjax(BOSubsvcVO vo, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
vo.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
vo.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
// 조회조건 구독서비스
List<DataMap> SrchSubsvcGnrList = boSubsvcService.selectBOMngrSrchSubsvcGnrList(vo);
content.put("srchSubsvcGnrList", SrchSubsvcGnrList);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(content))
.build()
);
}
}

View File

@@ -0,0 +1,453 @@
package com.wb.domainserver.domain.mngr.ordr.subsvc.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wb.domainserver.common.msg.GconeMessageSource;
import com.wb.domainserver.common.mvc.tags.ui.pagination.PaginationInfo;
import com.wb.domainserver.common.prop.PaginationProperties;
import com.wb.domainserver.domain.admin.store.sopmal.service.BOMaSopmalService;
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.common.service.BOCommonService;
import com.wb.domainserver.domain.gcone.goods.purchs.service.BOOrderService;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderLogVO;
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.service.BOOrdrService;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.*;
import com.wb.domainserver.domain.gcone.ordr.pay.vo.BOPayVO;
import com.wb.domainserver.domain.gcone.ordr.subsvc.service.BOSubsvcOrdrService;
import com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO;
import com.wb.domainserver.domain.gcone.setup.dlvygrp.service.BODlvygrpService;
import com.wb.domainserver.domain.gcone.setup.nbkk.service.BONbkkService;
import com.wb.domainserver.domain.gcone.setup.nbkk.vo.BOSetupNbkkVO;
import com.wb.domainserver.domain.mngr.ordr.ordrmngr.vo.DwldItmVO;
import com.wb.domainserver.domain.mngr.ordr.ordrmngr.vo.OrdrShippingVO;
import com.wb.domainserver.domain.mngr.ordr.ordrmngr.vo.OrdrSrchVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.exception.code.ErrorCode;
import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.communicate.ValidateResultConverter;
import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.excel.ExcelDownloadUtil;
import io.micrometer.common.util.StringUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.IOException;
import java.math.BigInteger;
import java.util.*;
/**
* 구독서비스 주문 관리 Controller
*
* @author jazz
* @since 2026-02-05
* @version 1.0
* @see
*
* <pre>
* == (Modification Information) == 개정이력
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2026-02-05 jazz 최초 생성
*
* </pre>
*/
@Controller
@RequestMapping("/mngr/ordr/subsvc")
@Slf4j
public class SubsvcOrdrController {
/** WebClient 호출을 위한 wrapper */
@Autowired
private WnbtWebClientResponseHandler responseHandler;
/** WebClient 호출을 위한 wrapper */
@Autowired
private SendToResrc sendToResrc;
/** 공통 메시지 처리를 위한 메시지 객체 */
@Autowired
private GconeMessageSource gconeMessageSource;
@Autowired
private BOSubsvcOrdrService boSubsvcOrdrService;
@Autowired
private BOSubsvcService boSubsvcService;
@Autowired
private PaginationProperties paginationProperties;
/**
* 구독서비스 상품준비 조회 폼
* @param subsvcVO,subsvcOrderVO,model,authSopmalCd
* @return SubsvcOrdrListForm.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcOrdrListForm")
public String selectSubsvcOrdrListForm(BOSubsvcVO subsvcVO, BOSubsvcOrderVO subsvcOrderVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcVO.setSopmalCd(authSopmalCd);
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcVO.setSopmalCd(user.getSopmalCd());
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
// 조회조건 구독서비스
List<?> SrchSubsvcList = boSubsvcService.selectBOMngrSrchSubsvcList(subsvcVO);
content.put("srchSubsvcList", SrchSubsvcList);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrListForm";
}
/**
* 구독서비스 상품준비 목록 조회 리스트
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrdrList")
public String selectSubsvcOrdrList(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
// 페이징 객체 생성 & 페이징정보 할당
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(subsvcOrderVO.getPageIndex());
paginationInfo.setRecordCountPerPage(subsvcOrderVO.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
subsvcOrderVO.setPaginationInfo(paginationInfo);
subsvcOrderVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
subsvcOrderVO.setLastIndex(paginationInfo.getLastRecordIndex());
subsvcOrderVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(StringUtils.isEmpty(subsvcOrderVO.getSortDv())){
//정렬기준 초기값 셋팅
subsvcOrderVO.setSortDv("subsvcGnrAsc");
}
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("list", list);
content.put("paginationInfo", subsvcOrderVO.getPaginationInfo());
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrList";
}
/**
* 구독서비스 상품준비 일괄처리
* @param subsvcOrderVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/updateSubsvcOrdrReady", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> updateSubsvcOrdrReady(BOSubsvcOrderVO subsvcOrderVO, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
/**
* 체크대상정보 파싱
* 형태 : 주문고유번호@주문상품고유번호@주문상품옵션고유번호@주문배송고유번호
* */
subsvcOrderVO.setArrOrdrInnb(new ArrayList<String>());
subsvcOrderVO.setArrOrdrGoodsInnb(new ArrayList<String>());
subsvcOrderVO.setArrOrdrGoodsOptnInnb(new ArrayList<String>());
subsvcOrderVO.setArrOrdrDlvyInnb(new ArrayList<String>());
ArrayList<String> arrCheck = (ArrayList<String>)subsvcOrderVO.getArrCheck();
((ArrayList<String>)subsvcOrderVO.getArrCheck()).forEach(check -> {
String[] innb = check.split("@");
subsvcOrderVO.getArrOrdrInnb().add(innb[0]);
subsvcOrderVO.getArrOrdrGoodsInnb().add(innb[1]);
subsvcOrderVO.getArrOrdrGoodsOptnInnb().add(innb[2]);
subsvcOrderVO.getArrOrdrDlvyInnb().add(innb[3]);
});
DataMap message = new DataMap();
String result = "";
try{
result = boSubsvcOrdrService.updateSubsvcOrdrReady(subsvcOrderVO);
}catch(Exception e){
log.error(e.getMessage());
result = "fail";
}
message.put("message", result);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/**
* 구독서비스 상품준비 배송내역 목록 팝업
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrdrDlvyListPop")
public String selectSubsvcOrdrDlvyListPop(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderDlvyList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("list", list);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrDlvyListPop";
}
/**
* 구독서비스 상품변경 조회 폼
* @param subsvcVO,subsvcOrderVO,model,authSopmalCd
* @return SubsvcOrdrMappedListForm.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcOrdrMappedListForm")
public String selectSubsvcOrdrMappedListForm(BOSubsvcVO subsvcVO, BOSubsvcOrderVO subsvcOrderVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcVO.setSopmalCd(authSopmalCd);
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcVO.setSopmalCd(user.getSopmalCd());
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
// 조회조건 구독서비스
List<?> SrchSubsvcList = boSubsvcService.selectBOMngrSrchSubsvcList(subsvcVO);
content.put("srchSubsvcList", SrchSubsvcList);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrMappedListForm";
}
/**
* 구독서비스 상품변경 목록 조회 리스트
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrMappedList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrdrMappedList")
public String selectSubsvcOrdrMappedList(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
// 페이징 객체 생성 & 페이징정보 할당
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(subsvcOrderVO.getPageIndex());
paginationInfo.setRecordCountPerPage(subsvcOrderVO.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
subsvcOrderVO.setPaginationInfo(paginationInfo);
subsvcOrderVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
subsvcOrderVO.setLastIndex(paginationInfo.getLastRecordIndex());
subsvcOrderVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(StringUtils.isEmpty(subsvcOrderVO.getSortDv())){
//정렬기준 초기값 셋팅
subsvcOrderVO.setSortDv("subsvcGnrAsc");
}
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderMappedList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("list", list);
content.put("paginationInfo", subsvcOrderVO.getPaginationInfo());
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrMappedList";
}
/**
* 구독서비스 구독자 조회 폼
* @param subsvcVO,subsvcOrderVO,model,authSopmalCd
* @return SubsvcOrdrMbrListForm.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSubsvcOrdrMbrListForm")
public String selectSubsvcOrdrMbrListForm(BOSubsvcVO subsvcVO, BOSubsvcOrderVO subsvcOrderVO, ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcVO.setSopmalCd(authSopmalCd);
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcVO.setSopmalCd(user.getSopmalCd());
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
// 조회조건 구독서비스
List<?> SrchSubsvcList = boSubsvcService.selectBOMngrSrchSubsvcList(subsvcVO);
content.put("srchSubsvcList", SrchSubsvcList);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrMbrListForm";
}
/**
* 구독서비스 구독자 목록 조회 리스트
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrMbrList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrdrMbrList")
public String selectSubsvcOrdrMbrList(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
// 페이징 객체 생성 & 페이징정보 할당
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(subsvcOrderVO.getPageIndex());
paginationInfo.setRecordCountPerPage(subsvcOrderVO.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
subsvcOrderVO.setPaginationInfo(paginationInfo);
subsvcOrderVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
subsvcOrderVO.setLastIndex(paginationInfo.getLastRecordIndex());
subsvcOrderVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
if(StringUtils.isEmpty(subsvcOrderVO.getSortDv())){
//정렬기준 초기값 셋팅
subsvcOrderVO.setSortDv("subsvcGnrAsc");
}
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderMbrList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("list", list);
content.put("paginationInfo", subsvcOrderVO.getPaginationInfo());
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrdrMbrList";
}
/**
* 구독서비스 구독자 조회 - 구독자 목록 팝업
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrderMbrInfoListPop")
public String selectSubsvcOrderMbrInfoListPop(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
//구독서비스 정보 조회
DataMap subsvcInfo = boSubsvcOrdrService.selectBOSubsvcInfo(subsvcOrderVO);
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderMbrInfoList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("subsvcInfo", subsvcInfo);
content.put("list", list);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrderMbrInfoListPop";
}
/**
* 구독서비스 구독자 조회 - 배송상품 목록 팝업
* @param subsvcOrderVO
* @param model
* @return SubsvcOrdrList.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value = "/selectSubsvcOrderGoodsInfoListPop")
public String selectSubsvcOrderGoodsInfoListPop(BOSubsvcOrderVO subsvcOrderVO,ModelMap model, @CookieValue(value = "authSopmalCd") String authSopmalCd) {
subsvcOrderVO.setSopmalCd(authSopmalCd);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if("01".equals(user.getSysDvCd())){
subsvcOrderVO.setSopmalCd(user.getSopmalCd());
}
//구독서비스 정보 조회
DataMap subsvcInfo = boSubsvcOrdrService.selectBOSubsvcInfo(subsvcOrderVO);
// 목록 조회
List<DataMap> list = boSubsvcOrdrService.selectBOSubsvcOrderGoodsInfoList(subsvcOrderVO);
Map<String, Object> content = new HashMap<>();
content.put("paramVO", subsvcOrderVO);
content.put("subsvcInfo", subsvcInfo);
content.put("list", list);
model.addAttribute("resultMap", content);
return "mngr/ordr/subsvc/SubsvcOrderGoodsInfoListPop";
}
}

View File

@@ -151,11 +151,15 @@ public class SetupDlvygrpController {
if(bindingResult.hasErrors()) { if(bindingResult.hasErrors()) {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource)); throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
} }
// VO Param setting // VO Param setting
// 기본배송비 null 일때 0으로 기본값 셋팅 // 기본배송비 null 일때 0으로 기본값 셋팅
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) {
dlvyGroup.setDftDlvyAmt("0"); dlvyGroup.setDftDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt2())) {
dlvyGroup.setDftDlvyAmt2("0");
}
// 금액조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 금액조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getAmtCndUseAt() == null || dlvyGroup.getAmtCndUseAt().equals("N")) { if(dlvyGroup.getAmtCndUseAt() == null || dlvyGroup.getAmtCndUseAt().equals("N")) {
dlvyGroup.setAmtCndAditAmt("0"); dlvyGroup.setAmtCndAditAmt("0");
@@ -164,6 +168,13 @@ public class SetupDlvygrpController {
dlvyGroup.setAmtCndUseAt("N"); dlvyGroup.setAmtCndUseAt("N");
} }
} }
if(dlvyGroup.getAmtCndUseAt2() == null || dlvyGroup.getAmtCndUseAt2().equals("N")) {
dlvyGroup.setAmtCndAditAmt2("0");
// 금액조건2 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getAmtCndUseAt2() == null) {
dlvyGroup.setAmtCndUseAt2("N");
}
}
// 개수조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 개수조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getCntCndUseAt() == null || dlvyGroup.getCntCndUseAt().equals("N")) { if(dlvyGroup.getCntCndUseAt() == null || dlvyGroup.getCntCndUseAt().equals("N")) {
dlvyGroup.setCntCndAditAmt("0"); dlvyGroup.setCntCndAditAmt("0");
@@ -172,6 +183,13 @@ public class SetupDlvygrpController {
dlvyGroup.setCntCndUseAt("N"); dlvyGroup.setCntCndUseAt("N");
} }
} }
if(dlvyGroup.getCntCndUseAt2() == null || dlvyGroup.getCntCndUseAt2().equals("N")) {
dlvyGroup.setCntCndAditAmt2("0");
// 개수조건2 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getCntCndUseAt2() == null){
dlvyGroup.setCntCndUseAt2("N");
}
}
// 묶음배송 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 묶음배송 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getBundleDlvyUseAt() == null || dlvyGroup.getBundleDlvyUseAt().equals("N")){ if(dlvyGroup.getBundleDlvyUseAt() == null || dlvyGroup.getBundleDlvyUseAt().equals("N")){
dlvyGroup.setBundleDlvyCndAmt("0"); dlvyGroup.setBundleDlvyCndAmt("0");
@@ -180,23 +198,42 @@ public class SetupDlvygrpController {
dlvyGroup.setBundleDlvyUseAt("N"); dlvyGroup.setBundleDlvyUseAt("N");
} }
} }
if(dlvyGroup.getBundleDlvyUseAt2() == null || dlvyGroup.getBundleDlvyUseAt2().equals("N")){
dlvyGroup.setBundleDlvyCndAmt2("0");
// 묶음배송 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getBundleDlvyUseAt2() == null) {
dlvyGroup.setBundleDlvyUseAt2("N");
}
}
// 배송권역 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 배송권역 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getDlvyAreaAditAt().equals("N")) { if(dlvyGroup.getDlvyAreaAditAt().equals("N")) {
dlvyGroup.setAreaAditDlvyAmt("0"); dlvyGroup.setAreaAditDlvyAmt("0");
} }
if(dlvyGroup.getDlvyAreaAditAt2().equals("N")) {
dlvyGroup.setAreaAditDlvyAmt2("0");
}
// 반품배송비 편도 null 일때 0으로 기본값 셋팅 // 반품배송비 편도 null 일때 0으로 기본값 셋팅
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyAmt())) {
dlvyGroup.setReturnDlvyAmt("0"); dlvyGroup.setReturnDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyAmt2())) {
dlvyGroup.setReturnDlvyAmt2("0");
}
// 반품배송비 왕복 null 일때 0으로 기본값 셋팅 // 반품배송비 왕복 null 일때 0으로 기본값 셋팅
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getExchngDlvyAmt())) {
dlvyGroup.setExchngDlvyAmt("0"); dlvyGroup.setExchngDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getExchngDlvyAmt2())) {
dlvyGroup.setExchngDlvyAmt2("0");
}
//반품 배송비 왕복금액 적용여부 null 일 경우 N 처리 //반품 배송비 왕복금액 적용여부 null 일 경우 N 처리
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt())) { if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt())) {
dlvyGroup.setReturnDlvyApplcAt("N"); dlvyGroup.setReturnDlvyApplcAt("N");
} }
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt2())) {
dlvyGroup.setReturnDlvyApplcAt2("N");
}
// 숫자(금액&갯수) ',' 제거 // 숫자(금액&갯수) ',' 제거
dlvyGroup.setDftDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt())); dlvyGroup.setDftDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt()));
dlvyGroup.setAmtCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt())); dlvyGroup.setAmtCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt()));
@@ -206,6 +243,14 @@ public class SetupDlvygrpController {
dlvyGroup.setReturnDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt())); dlvyGroup.setReturnDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt()));
dlvyGroup.setExchngDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt())); dlvyGroup.setExchngDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt()));
dlvyGroup.setDftDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt2()));
dlvyGroup.setAmtCndAditAmt2(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt2()));
dlvyGroup.setCntCndAditAmt2(StringUtil.removeCommaChar(dlvyGroup.getCntCndAditAmt2()));
dlvyGroup.setAreaAditDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getAreaAditDlvyAmt2()));
dlvyGroup.setBundleDlvyCndAmt2(StringUtil.removeCommaChar(dlvyGroup.getBundleDlvyCndAmt2()));
dlvyGroup.setReturnDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt2()));
dlvyGroup.setExchngDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt2()));
//사용자 정보 추출 및 적용 //사용자 정보 추출 및 적용
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
dlvyGroup.setRegusr(user.getUserInnb()); dlvyGroup.setRegusr(user.getUserInnb());
@@ -369,6 +414,9 @@ public class SetupDlvygrpController {
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) {
dlvyGroup.setDftDlvyAmt("0"); dlvyGroup.setDftDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt2())) {
dlvyGroup.setDftDlvyAmt2("0");
}
// 금액조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 금액조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getAmtCndUseAt() == null || dlvyGroup.getAmtCndUseAt().equals("N")) { if(dlvyGroup.getAmtCndUseAt() == null || dlvyGroup.getAmtCndUseAt().equals("N")) {
dlvyGroup.setAmtCndAditAmt("0"); dlvyGroup.setAmtCndAditAmt("0");
@@ -377,6 +425,13 @@ public class SetupDlvygrpController {
dlvyGroup.setAmtCndUseAt("N"); dlvyGroup.setAmtCndUseAt("N");
} }
} }
if(dlvyGroup.getAmtCndUseAt2() == null || dlvyGroup.getAmtCndUseAt2().equals("N")) {
dlvyGroup.setAmtCndAditAmt2("0");
// 금액조건2 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getAmtCndUseAt2() == null) {
dlvyGroup.setAmtCndUseAt2("N");
}
}
// 개수조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 개수조건 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getCntCndUseAt() == null || dlvyGroup.getCntCndUseAt().equals("N")) { if(dlvyGroup.getCntCndUseAt() == null || dlvyGroup.getCntCndUseAt().equals("N")) {
dlvyGroup.setCntCndAditAmt("0"); dlvyGroup.setCntCndAditAmt("0");
@@ -385,6 +440,13 @@ public class SetupDlvygrpController {
dlvyGroup.setCntCndUseAt("N"); dlvyGroup.setCntCndUseAt("N");
} }
} }
if(dlvyGroup.getCntCndUseAt2() == null || dlvyGroup.getCntCndUseAt2().equals("N")) {
dlvyGroup.setCntCndAditAmt2("0");
// 개수조건2 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getCntCndUseAt2() == null){
dlvyGroup.setCntCndUseAt2("N");
}
}
// 묶음배송 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 묶음배송 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getBundleDlvyUseAt() == null || dlvyGroup.getBundleDlvyUseAt().equals("N")){ if(dlvyGroup.getBundleDlvyUseAt() == null || dlvyGroup.getBundleDlvyUseAt().equals("N")){
dlvyGroup.setBundleDlvyCndAmt("0"); dlvyGroup.setBundleDlvyCndAmt("0");
@@ -393,26 +455,43 @@ public class SetupDlvygrpController {
dlvyGroup.setBundleDlvyUseAt("N"); dlvyGroup.setBundleDlvyUseAt("N");
} }
} }
if(dlvyGroup.getBundleDlvyUseAt2() == null || dlvyGroup.getBundleDlvyUseAt2().equals("N")){
dlvyGroup.setBundleDlvyCndAmt2("0");
// 묶음배송 여부가 null 일 때 N으로 기본값 셋팅
if(dlvyGroup.getBundleDlvyUseAt2() == null) {
dlvyGroup.setBundleDlvyUseAt2("N");
}
}
// 배송권역 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅 // 배송권역 여부가 Null 이거나 N 일때, 금액값 기본값 셋팅
if(dlvyGroup.getDlvyAreaAditAt().equals("N")) { if(dlvyGroup.getDlvyAreaAditAt().equals("N")) {
dlvyGroup.setAreaAditDlvyAmt("0"); dlvyGroup.setAreaAditDlvyAmt("0");
} }
if(dlvyGroup.getDlvyAreaAditAt2().equals("N")) {
dlvyGroup.setAreaAditDlvyAmt2("0");
}
// 반품배송비 편도 null 일때 0으로 기본값 셋팅 // 반품배송비 편도 null 일때 0으로 기본값 셋팅
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyAmt())) {
dlvyGroup.setReturnDlvyAmt("0"); dlvyGroup.setReturnDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyAmt2())) {
dlvyGroup.setReturnDlvyAmt2("0");
}
// 반품배송비 왕복 null 일때 0으로 기본값 셋팅 // 반품배송비 왕복 null 일때 0으로 기본값 셋팅
if(StringUtil.isEmpty(dlvyGroup.getDftDlvyAmt())) { if(StringUtil.isEmpty(dlvyGroup.getExchngDlvyAmt())) {
dlvyGroup.setExchngDlvyAmt("0"); dlvyGroup.setExchngDlvyAmt("0");
} }
if(StringUtil.isEmpty(dlvyGroup.getExchngDlvyAmt2())) {
dlvyGroup.setExchngDlvyAmt2("0");
}
//반품 배송비 왕복금액 적용여부 null 일 경우 N 처리 //반품 배송비 왕복금액 적용여부 null 일 경우 N 처리
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt())) { if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt())) {
dlvyGroup.setReturnDlvyApplcAt("N"); dlvyGroup.setReturnDlvyApplcAt("N");
} }
if(StringUtil.isEmpty(dlvyGroup.getReturnDlvyApplcAt2())) {
dlvyGroup.setReturnDlvyApplcAt2("N");
}
// 숫자(금액&갯수) , 제거 // 숫자(금액&갯수) ',' 제거
dlvyGroup.setDftDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt())); dlvyGroup.setDftDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt()));
dlvyGroup.setAmtCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt())); dlvyGroup.setAmtCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt()));
dlvyGroup.setCntCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getCntCndAditAmt())); dlvyGroup.setCntCndAditAmt(StringUtil.removeCommaChar(dlvyGroup.getCntCndAditAmt()));
@@ -421,6 +500,14 @@ public class SetupDlvygrpController {
dlvyGroup.setReturnDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt())); dlvyGroup.setReturnDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt()));
dlvyGroup.setExchngDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt())); dlvyGroup.setExchngDlvyAmt(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt()));
dlvyGroup.setDftDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getDftDlvyAmt2()));
dlvyGroup.setAmtCndAditAmt2(StringUtil.removeCommaChar(dlvyGroup.getAmtCndAditAmt2()));
dlvyGroup.setCntCndAditAmt2(StringUtil.removeCommaChar(dlvyGroup.getCntCndAditAmt2()));
dlvyGroup.setAreaAditDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getAreaAditDlvyAmt2()));
dlvyGroup.setBundleDlvyCndAmt2(StringUtil.removeCommaChar(dlvyGroup.getBundleDlvyCndAmt2()));
dlvyGroup.setReturnDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getReturnDlvyAmt2()));
dlvyGroup.setExchngDlvyAmt2(StringUtil.removeCommaChar(dlvyGroup.getExchngDlvyAmt2()));
//배송그룹 등록처리 결과 메시지(JSON) 처리 //배송그룹 등록처리 결과 메시지(JSON) 처리
//사용자 정보 추출 및 적용 //사용자 정보 추출 및 적용
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();

View File

@@ -126,6 +126,8 @@ public class CscController {
private PaginationProperties paginationProperties; private PaginationProperties paginationProperties;
@Autowired @Autowired
private BOCmService boCmService; private BOCmService boCmService;
@Autowired
private BOMaSopmalService boMaSopmalService;
/************************************************************ /************************************************************
고객센터 목록 폼 고객센터 목록 폼
@@ -1681,6 +1683,13 @@ public class CscController {
regusrInfo.setRegusrDvCd("99");//비회원 regusrInfo.setRegusrDvCd("99");//비회원
} }
// 약관정보
BOMaSopmalVO sopmalVO = new BOMaSopmalVO();
sopmalVO.setStplatDvCd("11");
sopmalVO.setSopmalCd(bbsctt.getSopmalCd());
List<DataMap> clauseList = new ArrayList<>();
clauseList = boMaSopmalService.selectBOClauseInformation(sopmalVO);
// 게시판 설정 정보 // 게시판 설정 정보
BOBbsVO bbsVO = new BOBbsVO(); BOBbsVO bbsVO = new BOBbsVO();
// bbsVO에 쇼핑몰코드, 해당 게시판 set // bbsVO에 쇼핑몰코드, 해당 게시판 set
@@ -1736,6 +1745,7 @@ public class CscController {
content.put("regusrInfo", regusrInfo); content.put("regusrInfo", regusrInfo);
content.put("bbscttVO", bbsctt); content.put("bbscttVO", bbsctt);
content.put("itmList", itmList); content.put("itmList", itmList);
content.put("clauseList", clauseList);
content.put("bbsInfo", bbsInfo); content.put("bbsInfo", bbsInfo);
content.put("qesitmList", qesitmList); content.put("qesitmList", qesitmList);
content.put("rvwQesitmList", rvwQesitmList); content.put("rvwQesitmList", rvwQesitmList);

View File

@@ -9,6 +9,8 @@ import com.wb.domainserver.domain.admin.store.sopmal.vo.BOMaSopmalVO;
import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService; import com.wb.domainserver.domain.admin.sys.comncd.service.BOMaComncdService;
import com.wb.domainserver.domain.admin.sys.comncd.vo.BOMaComncdVO; import com.wb.domainserver.domain.admin.sys.comncd.vo.BOMaComncdVO;
import com.wb.domainserver.domain.gcone.common.service.BOCommonService; import com.wb.domainserver.domain.gcone.common.service.BOCommonService;
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.mbr.mbr.service.BOMbrService; import com.wb.domainserver.domain.gcone.mbr.mbr.service.BOMbrService;
import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO; import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrService; import com.wb.domainserver.domain.gcone.ordr.ordr.service.BOOrdrService;
@@ -20,15 +22,11 @@ import com.wb.domainserver.domain.gcone.setup.site.vo.BOPrevewVO;
import com.wb.domainserver.domain.gcone.setup.site.vo.BOSiteVO; import com.wb.domainserver.domain.gcone.setup.site.vo.BOSiteVO;
import com.wb.domainserver.domain.itrnt.str.service.BOItrntStrService; import com.wb.domainserver.domain.itrnt.str.service.BOItrntStrService;
import com.wb.domainserver.domain.itrnt.str.vo.BOItrntStrVO; import com.wb.domainserver.domain.itrnt.str.vo.BOItrntStrVO;
import com.wb.domainserver.domain.sample.vo.PrevewVO;
import com.wb.domainserver.domain.sopmal.main.vo.BrandVO; import com.wb.domainserver.domain.sopmal.main.vo.BrandVO;
import com.wb.domainserver.domain.sopmal.main.vo.MaSopmalVO;
import com.wb.domainserver.domain.sopmal.main.vo.MainVO;
import com.wb.domainserver.domain.sopmal.main.vo.StrVO; import com.wb.domainserver.domain.sopmal.main.vo.StrVO;
import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyOrdrDlvyVO; import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyOrdrDlvyVO;
import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyRefundVO; import com.wb.domainserver.domain.sopmal.mpage.ordr.vo.MyRefundVO;
import com.wb.domainserver.exception.WnbtRestException; import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.response.ApiResponse;
import com.wb.domainserver.response.WnbtResponse; import com.wb.domainserver.response.WnbtResponse;
import com.wb.domainserver.response.WnbtResponseBody; import com.wb.domainserver.response.WnbtResponseBody;
import com.wb.domainserver.response.WnbtWebClientResponseHandler; import com.wb.domainserver.response.WnbtWebClientResponseHandler;
@@ -36,7 +34,9 @@ import com.wb.domainserver.security.authentication.AnonymousUser;
import com.wb.domainserver.security.authentication.MemberJwtContextHolder; import com.wb.domainserver.security.authentication.MemberJwtContextHolder;
import com.wb.domainserver.security.authorization.annotation.AuthPolicy; import com.wb.domainserver.security.authorization.annotation.AuthPolicy;
import com.wb.domainserver.security.authorization.annotation.Policy; import com.wb.domainserver.security.authorization.annotation.Policy;
import com.wb.domainserver.util.communicate.*; import com.wb.domainserver.util.communicate.KakaoProperties;
import com.wb.domainserver.util.communicate.MultiValueMapConverter;
import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.dataaccess.DataMap; import com.wb.domainserver.util.dataaccess.DataMap;
import com.wb.domainserver.util.util.Util; import com.wb.domainserver.util.util.Util;
import jakarta.servlet.http.Cookie; import jakarta.servlet.http.Cookie;
@@ -45,14 +45,12 @@ import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import java.math.BigInteger; import java.math.BigInteger;
@@ -99,6 +97,8 @@ public class MainController {
private BOMaSopmalService boMaSopmalService; private BOMaSopmalService boMaSopmalService;
@Autowired @Autowired
private BOMbrService boMbrService; private BOMbrService boMbrService;
@Autowired
private BOSubsvcService boSubsvcService;
@Policy(AuthPolicy.PUBLIC) @Policy(AuthPolicy.PUBLIC)
@RequestMapping(value= {"/","/index", "/sopmal/index","/sopmal/main"}) @RequestMapping(value= {"/","/index", "/sopmal/index","/sopmal/main"})
@@ -793,6 +793,54 @@ public class MainController {
return url; return url;
} }
/**
* 구독서비스 폼 이동
* @param model
* @param request
* @return String
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value = "/sopmal/main/selectSubscribeForm")
public String selectSubscribeForm(ModelMap model, HttpServletRequest request) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
DataMap content = new DataMap();
BOSubsvcVO subsvcVo = new BOSubsvcVO();
subsvcVo.setSopmalCd(user.getSopmalCd());
content.put("subsvcList", boSubsvcService.selectBOSubsvcList(subsvcVo));
BOMaSopmalVO sopmalVO = new BOMaSopmalVO();
sopmalVO.setSopmalCd(user.getSopmalCd());
content.put("sopmalInfo", boMaSopmalService.selectBOSopmalUpdtForm(sopmalVO));
model.addAttribute("resultMap", content);
return Util.getDeviceType(request) + "/main/SubscribeR";
}
/**
* 구독서비스 상세 조회
* @param subsvcVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.PUBLIC)
@RequestMapping(value = "/sopmal/main/selectSubscribeDetail", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> selectSubscribeDetail(BOSubsvcVO subsvcVO) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
Map<String, Object> message = new HashMap<>();
subsvcVO.setSopmalCd(user.getSopmalCd());
message.put("resultMap", boSubsvcService.selectBOSubsvcDetail(subsvcVO));
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(message))
.build()
);
}
/** /**
* 자담유 > 네가지약속 (모바일) * 자담유 > 네가지약속 (모바일)
* *

View File

@@ -62,6 +62,8 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static com.wb.domainserver.util.string.StringUtil.isEmpty;
/** /**
* *
* 마이페이지 회원 * 마이페이지 회원
@@ -746,7 +748,10 @@ public class MyMbrController {
throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource)); throw new WnbtRestException(ValidateResultConverter.convert(bindingResult, gconeMessageSource));
} }
vo.setMbtlnb(vo.getMbtlnb().replace("-","")); if(!isEmpty(vo.getMbtlnb())){
vo.setMbtlnb(vo.getMbtlnb().replace("-",""));
}
//모바일일 시 진행 //모바일일 시 진행
if("mobile".equals(mymbrVO.getUtilDv())){ if("mobile".equals(mymbrVO.getUtilDv())){
if("01".equals(user.getSysDvCd())){ if("01".equals(user.getSysDvCd())){
@@ -762,11 +767,15 @@ public class MyMbrController {
// Map<String, Object> resultMap = responseHandler.handleResponseAsMap( // Map<String, Object> resultMap = responseHandler.handleResponseAsMap(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMbrMbtlnbCompare", mymbrVO) // sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMbrMbtlnbCompare", mymbrVO)
// ); // );
int result = service.selectBOMbrMbtlnbCompare(vo); // int result = service.selectBOMbrMbtlnbCompare(vo);
int result = service.selectBOMbrEmailCompare(vo);
if(result == 0){ if(result == 0){
if(!"Y".equals(mymbrVO.getMbtlnbChngAt())){ if(!"Y".equals(mymbrVO.getEmailChngAt())){
throw new WnbtRestException("휴대폰 인증이 필요합니다."); throw new WnbtRestException("이메일 인증이 필요합니다.");
} }
// if(!"Y".equals(mymbrVO.getMbtlnbChngAt())){
// throw new WnbtRestException("휴대폰 인증이 필요합니다.");
// }
} }
} }
@@ -854,7 +863,7 @@ public class MyMbrController {
bowithdrawalVO.setRegistIp(ip); bowithdrawalVO.setRegistIp(ip);
AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if (StringUtil.isEmpty(bowithdrawalVO.getSopmalCd())) {//사용자 if (isEmpty(bowithdrawalVO.getSopmalCd())) {//사용자
bowithdrawalVO.setSopmalCd(user.getSopmalCd()); bowithdrawalVO.setSopmalCd(user.getSopmalCd());
} }
bowithdrawalVO.setRegusr(user.getUserInnb()); bowithdrawalVO.setRegusr(user.getUserInnb());

View File

@@ -19,6 +19,8 @@ public class DlvylcVO extends AbstractVO{
/** 배송지설명내용 */ /** 배송지설명내용 */
@NotBlank(message = "배송지 설명") @NotBlank(message = "배송지 설명")
private String dlvylcDcCn; private String dlvylcDcCn;
/**배송지역코드*/
private String dlvylcAreaCd;
/** 받는사람명 */ /** 받는사람명 */
@NotBlank(message = "받으시는 분") @NotBlank(message = "받으시는 분")
private String recpntNm; private String recpntNm;
@@ -30,7 +32,7 @@ public class DlvylcVO extends AbstractVO{
private String telnb; private String telnb;
/** 우편번호 */ /** 우편번호 */
@NotBlank(message = "우편번호") @NotBlank(message = "우편번호")
@Length(min=1, max=5) @Length(min=1, max=7)
private String zip; private String zip;
/** 도로명,지번 구분 */ /** 도로명,지번 구분 */
private String adresDv; private String adresDv;
@@ -43,6 +45,10 @@ public class DlvylcVO extends AbstractVO{
/** 상세주소 */ /** 상세주소 */
@NotBlank(message = "상세주소") @NotBlank(message = "상세주소")
private String dtlAdres; private String dtlAdres;
/** 개인통관부호(개인통관번호) */
private String cstmclerCd;
/** 도도부현 코드(일본) */
private String prefcd;
/** 기본배송지여부 */ /** 기본배송지여부 */
private String dftDlvylcAt = "N"; private String dftDlvylcAt = "N";
/** 최근배송지여부 */ /** 최근배송지여부 */

View File

@@ -61,6 +61,9 @@ public class MyMbrVO extends AbstractVO {
/** 휴대폰 번호 변경 여부*/ /** 휴대폰 번호 변경 여부*/
private String mbtlnbChngAt; private String mbtlnbChngAt;
/** 이메일 변경 여부*/
private String emailChngAt;
/** SMS수신여부 */ /** SMS수신여부 */
private String smsRecptnAt; private String smsRecptnAt;
@@ -68,7 +71,7 @@ public class MyMbrVO extends AbstractVO {
private String telnb; private String telnb;
/** 우편번호 */ /** 우편번호 */
@NotBlank(message = "우편번호") // @NotBlank(message = "우편번호")
private String zip; private String zip;
/** 도로명; 지번 */ /** 도로명; 지번 */
@@ -82,7 +85,7 @@ public class MyMbrVO extends AbstractVO {
private String rnmAdres; private String rnmAdres;
/** 상세주소 */ /** 상세주소 */
@NotBlank(message = "상세주소") // @NotBlank(message = "상세주소")
private String dtlAdres; private String dtlAdres;
/** 성별 */ /** 성별 */

View File

@@ -155,6 +155,93 @@ public class MyOrdrController {
} }
/**
* 마이 페이지 > MY쇼핑 > 구독서비스 주문/배송 > 구독서비스 목록 조회 화면 이동
* @return SubsvcOrdrDlvyListRForm.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectMbrSubsvcOrdrListInqireRForm")
public String selectMbrSubsvcOrdrListInqireForm(HttpServletRequest request, ModelMap model, MyOrdrDlvyVO ordrDlvyVO, BOMbrVO vo) throws Exception {
model.addAttribute("paramVO", new ObjectMapper().writeValueAsString(ordrDlvyVO));
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content);
return Util.getDeviceType(request) + "/mpage/ordr/SubsvcOrdrDlvyListRForm";
}
/**
* 마이 페이지 > MY쇼핑 > 구독서비스 주문/배송 > 구독서비스 주문/배송 목록 조회
* @param ordrDlvyVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectMbrSubsvcOrdrListInqireAjax")
public String selectMbrSubsvcOrdrListInqireAjax(ModelMap model, BOOrdrDlvyVO ordrDlvyVO) {
Map<String, Object> content = selectBOMbrSubsvcOrdrListInqireAjax(ordrDlvyVO);
model.addAttribute("data", content);
return "sopmal/mpage/ordr/SubsvcOrdrDlvyListR";
}
/**
* 마이 페이지 > MY쇼핑 > 구독서비스 주문/배송조회 > 구독서비스 주문/배송 목록 조회 (스크롤)
* @param ordrDlvyVO
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectMbrSubsvcOrdrListInqireScrollAjax", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> selectMbrSubsvcOrdrListInqireScrollAjax(ModelMap model, BOOrdrDlvyVO ordrDlvyVO) {
Map<String, Object> content = selectBOMbrSubsvcOrdrListInqireAjax(ordrDlvyVO);
return ResponseEntity.ok(
WnbtResponse.builder()
.resBody(new WnbtResponseBody(content))
.build()
);
}
/**
* 마이 페이지 > MY쇼핑 > 구독서비스 주문/배송조회 > 주문/배송 상세 조회 화면 이동
* @return OrdrDtlR.jsp
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectMbrSubsvcOrdrDtlInqire")
public String selectMbrSubsvcOrdrDtlInqire(HttpServletRequest request, ModelMap model, BOOrdrDlvyVO ordrDlvyVO, BOMbrVO vo) throws Exception {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {
ordrDlvyVO.setSopmalCd(user.getSopmalCd());
}
Map<String, Object> message = boOrdrService.selectMbrOrdrDtlInqire(ordrDlvyVO);
/**발급대상구분코드*/
BOMaComncdVO bOMaComncdVO = new BOMaComncdVO();
bOMaComncdVO.setGroupCd("ISSU_TRGET_DV");
List<?> issuTrgetDv = bOMaComncdService.selectBOCommcdDetailList(bOMaComncdVO);
message.put("issuTrgetDv", issuTrgetDv);
model.addAttribute("data", message);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/ordr/ordr/selectBOMbrOrdrDtlInqire", ordrDlvyVO),
// model,
// "data"
// );
model.addAttribute("paramVO", new ObjectMapper().writeValueAsString(ordrDlvyVO));
model.addAttribute("vo", ordrDlvyVO);
// 마이페이지 > 상단 회원 정보 ( 등금, 이름, 마일리지, 쿠폰, 위시리스트, 배송중, 등급산정기준 )
Map<String, Object> content = selectBOMpageInfoInqire(vo);
model.addAttribute("mpageResultMap", content);
// responseHandler.handleResponse(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/mbr/mbr/selectBOMpageInfoInqire", ordrDlvyVO),
// model,
// "mpageResultMap"
// );
return Util.getDeviceType(request) + "/mpage/ordr/SubsvcOrdrDtlR";
}
/** /**
* 마이 페이지 > MY쇼핑 > 주문/배송조회 > 주문/배송 목록 조회 * 마이 페이지 > MY쇼핑 > 주문/배송조회 > 주문/배송 목록 조회
* @param ordrDlvyVO * @param ordrDlvyVO
@@ -1466,6 +1553,39 @@ public class MyOrdrController {
return content; return content;
} }
/**
* 사용자 > 마이페이지 > 구독서비스 주문/배송 조회
*/
public Map<String, Object> selectBOMbrSubsvcOrdrListInqireAjax(BOOrdrDlvyVO ordrDlvyVO) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
if ("01".equals(user.getSysDvCd())) {
ordrDlvyVO.setSopmalCd(user.getSopmalCd());
}
ordrDlvyVO.setMbrInnb(BigInteger.valueOf(user.getUserInnb()));
ordrDlvyVO.setMbrDvCd(user.getMbrDvCd());
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(ordrDlvyVO.getPageIndex());
paginationInfo.setRecordCountPerPage(ordrDlvyVO.getPageUnit());
paginationInfo.setPageSize(paginationProperties.getPageSize());
ordrDlvyVO.setPaginationInfo(paginationInfo);
ordrDlvyVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
ordrDlvyVO.setLastIndex(paginationInfo.getLastRecordIndex());
ordrDlvyVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
ordrDlvyVO.setMbrInnb(BigInteger.valueOf(MemberJwtContextHolder.getMemberInfo().getUserInnb()));
List<DataMap> resultList = boOrdrService.selectMbrSubsvcOrdrListInqireAjax(ordrDlvyVO);
Map<String, Object> content = new HashMap<>();
content.put("resultList", resultList);
content.put("paginationInfo", ordrDlvyVO.getPaginationInfo());
return content;
}
/** /**
* bo로직 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문상세 조회 > 결제취소/환불신청 정보 조회 * bo로직 관리자 > 주문 > 주문관리 > 전체 주문 조회 > 전체주문상세 조회 > 결제취소/환불신청 정보 조회
*/ */

View File

@@ -362,6 +362,7 @@ public class OrdrController {
param.put("mbrDvCd", user.getMbrDvCd()); param.put("mbrDvCd", user.getMbrDvCd());
param.put("mbrInnb", user.getUserInnb()); param.put("mbrInnb", user.getUserInnb());
} }
log.debug("CONselectSetleExpectAmt-param : {}", param);
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
try { try {
DataMap datamap = new DataMap(); DataMap datamap = new DataMap();
@@ -1723,6 +1724,7 @@ public class OrdrController {
@Policy(AuthPolicy.RESTRICTED) @Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSpbk") @RequestMapping(value="/selectSpbk")
public String selectSpbk(HttpServletRequest request, ModelMap model, BOSpbkVO spbkVO) throws Exception { public String selectSpbk(HttpServletRequest request, ModelMap model, BOSpbkVO spbkVO) throws Exception {
log.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/selectSpbk 시작");
String sesionId =""; String sesionId ="";
Cookie[] cookies = request.getCookies(); Cookie[] cookies = request.getCookies();
if(cookies != null){ if(cookies != null){
@@ -1808,6 +1810,7 @@ public class OrdrController {
model.addAttribute("commonCertiKey", naverMap.getCommonCertiKey()); model.addAttribute("commonCertiKey", naverMap.getCommonCertiKey());
// 네이버 페이 BUTTON_KEY // 네이버 페이 BUTTON_KEY
model.addAttribute("buttonKey", naverMap.getButtonKey()); model.addAttribute("buttonKey", naverMap.getButtonKey());
log.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/selectSpbk 끝");
return Util.getDeviceType(request) + "/ordr/SpbkPtinR"; return Util.getDeviceType(request) + "/ordr/SpbkPtinR";
} }
@@ -1818,6 +1821,7 @@ public class OrdrController {
@Policy(AuthPolicy.RESTRICTED) @Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectSpbkGoodsList") @RequestMapping(value="/selectSpbkGoodsList")
public String selectSpbkGoodsList(HttpServletRequest request, ModelMap model, @RequestBody BOSpbkVO spbkVO) throws Exception { public String selectSpbkGoodsList(HttpServletRequest request, ModelMap model, @RequestBody BOSpbkVO spbkVO) throws Exception {
log.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/selectSpbkGoodsList 시작");
String sesionId =""; String sesionId ="";
Cookie[] cookies = request.getCookies(); Cookie[] cookies = request.getCookies();
if(cookies != null){ if(cookies != null){
@@ -1837,6 +1841,7 @@ public class OrdrController {
model.addAttribute("data", resultMap); model.addAttribute("data", resultMap);
model.addAttribute("jsonData", new Gson().toJson(resultMap)); model.addAttribute("jsonData", new Gson().toJson(resultMap));
log.debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/selectSpbkGoodsList 끝");
return Util.getDeviceType(request) + "/ordr/SpbkPtinRList"; return Util.getDeviceType(request) + "/ordr/SpbkPtinRList";
} }
@@ -3004,6 +3009,13 @@ public class OrdrController {
return content; return content;
} }
} else { } else {
// if (CollectionUtils.isEmpty(multiOrdrDlvylc)) {
// log.info("배송지 정보를 찾을 수 없습니다.");
// content.put("result","Y");
// content.put("message", "배송지 정보를 찾을 수 없습니다.");
// // throw new WnbtRestException("주문유형 정보를 찾을 수 없습니다.");
// return content;
// }
if (CollectionUtils.isEmpty(shipping)) { if (CollectionUtils.isEmpty(shipping)) {
log.info("배송지 정보를 찾을 수 없습니다."); log.info("배송지 정보를 찾을 수 없습니다.");
content.put("result","Y"); content.put("result","Y");
@@ -3040,6 +3052,70 @@ public class OrdrController {
String[] receptMbtlnbArray = null; // 배송지 받는이 휴대폰번호 String[] receptMbtlnbArray = null; // 배송지 받는이 휴대폰번호
if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송 if ("01".equals(ordrTyCd) || "03".equals(ordrTyCd) || "06".equals(ordrTyCd)) { // 일반주문, 회원개인결제, 정기배송
// if (!CollectionUtils.isEmpty(multiOrdrDlvylc)) {
//
// // 배송지 리스트
// List<LinkedHashMap<String, Object>> dlvylcListMulti = (List<LinkedHashMap<String, Object>>) multiOrdrDlvylc.get("dlvylc");
//
// /** ----------------------------------------------- 배송지별 주문 상품 수량 검사 START ----------------------------------------------- */
// content = checkDistributedQyMatchesOrder(goodsList, dlvylcListMulti);
// if (!"0".equals(content.get("status"))) {
// return content;
// }
// /** ----------------------------------------------- 배송지별 주문 상품 수량 검사 END ----------------------------------------------- */
//
// // 부정판매 체크를 위한 배송지 정렬
// if (!CollectionUtils.isEmpty(dlvylcListMulti)) {
//
// boolean hasInvalidAddress = dlvylcListMulti.stream().anyMatch(map -> {
// String dlvylcZip = StringUtil.isNullToString(map.get("dlvylcZip"));
// String adresDvCd = StringUtil.isNullToString(map.get("dlvylcAdresDvCd"));
// String dlvylcLnbAdres = StringUtil.isNullToString(map.get("dlvylcLnbAdres"));
// String dlvylcRnmAdres = StringUtil.isNullToString(map.get("dlvylcRnmAdres"));
// String adresDtl = StringUtil.isNullToString(map.get("dlvylcAdresDtl"));
//
// return StringUtil.isEmpty(dlvylcZip)
// || StringUtil.isEmpty(adresDvCd)
// || ("01".equals(adresDvCd) && StringUtil.isEmpty(dlvylcRnmAdres))
// || ("02".equals(adresDvCd) && StringUtil.isEmpty(dlvylcLnbAdres))
// || StringUtil.isEmpty(adresDtl);
// });
//
// if (hasInvalidAddress) {
// content.put("result","Y");
// content.put("message", "배송지 정보를 찾을 수 없습니다. 다시 시도해 주세요.");
// return content;
// }
//
// List<String> adresList = dlvylcListMulti.stream()
// .map(map -> {
// String adresDvCd = StringUtil.isNullToString(map.get("dlvylcAdresDvCd"));
// String adresDtl = StringUtil.isNullToString(map.get("dlvylcAdresDtl"));
// String dlvylcLnbAdres = StringUtil.isNullToString(map.get("dlvylcLnbAdres"));
// String dlvylcRnmAdres = StringUtil.isNullToString(map.get("dlvylcRnmAdres"));
// String adresMulti;
// if ("01".equals(adresDvCd)) {
// adresMulti = dlvylcRnmAdres + " " + adresDtl;
// } else {
// adresMulti = dlvylcLnbAdres + " " + adresDtl;
// }
//
// return adresMulti;
// })
// .collect(Collectors.toList());
//
// adresArray = adresList.toArray(new String[0]);
//
// List<String> receptMbtlnbList = dlvylcListMulti.stream()
// .map(map -> {
// return StringUtil.isNullToString(map.get("recpntMbtlnb"));
// })
// .collect(Collectors.toList());
//
// receptMbtlnbArray = receptMbtlnbList.toArray(new String[0]);
//
// }
// }
if ( if (
StringUtil.isEmpty((String) shipping.get("dlvylcZip")) || StringUtil.isEmpty((String) shipping.get("dlvylcZip")) ||
StringUtil.isEmpty((String) shipping.get("dlvylcAdresDvCd")) || StringUtil.isEmpty((String) shipping.get("dlvylcAdresDvCd")) ||

View File

@@ -26,7 +26,8 @@ public enum PurchsValidCode {
EVT_TRGET_AT("evtTrgetAt","GC25E03T24A014","이벤트 대상 상품 아님"), EVT_TRGET_AT("evtTrgetAt","GC25E03T24A014","이벤트 대상 상품 아님"),
DPLCT_LMTT_COUPON("dplctLmttCoupon","GC25D03L24C015","이벤트 중복제한 쿠폰 존재"), DPLCT_LMTT_COUPON("dplctLmttCoupon","GC25D03L24C015","이벤트 중복제한 쿠폰 존재"),
PURCHS_TOTAL_AMT("setleAmt","GC25P03T24A016","주문 요청 총 결제금액과 계산된 총 결제금액 불일치"), PURCHS_TOTAL_AMT("setleAmt","GC25P03T24A016","주문 요청 총 결제금액과 계산된 총 결제금액 불일치"),
USE_CASH_MLG_AT("useCashMlgAt","GC25U06C26M017","GC 머니 보유금액 초과 사용") USE_CASH_MLG_AT("useCashMlgAt","GC25U06C26M017","GC 머니 보유금액 초과 사용"),
OPTN_EXPSR_AT("optnExpsrAt","GC25G06C26M018","판매 불가능한 상품 존재 - 변경된 상품옵션이 장바구니에 있음")
; ;

View File

@@ -53,6 +53,8 @@ public class MngrMenuInterceptor implements HandlerInterceptor {
String accessUri = request.getRequestURI(); // 현재 요청된 URI String accessUri = request.getRequestURI(); // 현재 요청된 URI
logger.debug("MenuInterceptor accessUri: {}", accessUri);
AnonymousUser mngr = MemberJwtContextHolder.getMemberInfo(); AnonymousUser mngr = MemberJwtContextHolder.getMemberInfo();
String mngrDv = mngr.getMngrDv(); String mngrDv = mngr.getMngrDv();
@@ -108,7 +110,7 @@ public class MngrMenuInterceptor implements HandlerInterceptor {
} }
} }
if("/mngr/main".equals(accessUri) || "/admin/main".equals(accessUri) || accessUri.contains("/crm") || accessUri.contains("/itrnt")) { if("/mngr/main".equals(accessUri) || "/admin/main".equals(accessUri) || accessUri.contains("/crm") || accessUri.contains("/itrnt") || accessUri.contains("/mngr/bbs")) {
checkMenu = "Y"; checkMenu = "Y";
} }

View File

@@ -1,26 +0,0 @@
package com.wb.domainserver.security.config;
import com.wb.domainserver.realm.RealmResolver;
import com.wb.domainserver.realm.filter.RealmFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
@Configuration
public class RealmFilterConfig {
@Autowired
RealmResolver realmResolver;
@Bean
public FilterRegistrationBean<RealmFilter> realmFilter() {
FilterRegistrationBean<RealmFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new RealmFilter(realmResolver));
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return registrationBean;
}
}

View File

@@ -15,6 +15,7 @@
*/ */
package com.wb.domainserver.security.config; package com.wb.domainserver.security.config;
import com.wb.domainserver.common.prop.PropertyService;
import com.wb.domainserver.domain.sopmal.oauth.service.CustomOAuth2UserService; import com.wb.domainserver.domain.sopmal.oauth.service.CustomOAuth2UserService;
import com.wb.domainserver.exception.response.CustomOauthFailureException; import com.wb.domainserver.exception.response.CustomOauthFailureException;
import com.wb.domainserver.realm.RealmResolver; import com.wb.domainserver.realm.RealmResolver;
@@ -23,6 +24,7 @@ import com.wb.domainserver.response.CustomAuthenticationSuccessHandler;
import com.wb.domainserver.security.authentication.CustomAccessDeniedEntryPoint; import com.wb.domainserver.security.authentication.CustomAccessDeniedEntryPoint;
import com.wb.domainserver.security.authentication.CustomAuthenticationEntryPoint; import com.wb.domainserver.security.authentication.CustomAuthenticationEntryPoint;
import com.wb.domainserver.security.authorization.WnbtAuthorizationManager; import com.wb.domainserver.security.authorization.WnbtAuthorizationManager;
import com.wb.domainserver.security.filter.BatchFilter;
import com.wb.domainserver.security.filter.CustomXssFilter; import com.wb.domainserver.security.filter.CustomXssFilter;
import com.wb.domainserver.security.filter.JwtAuthenticationFilter; import com.wb.domainserver.security.filter.JwtAuthenticationFilter;
import com.wb.domainserver.security.handler.CustomLogoutSuccessHandler; import com.wb.domainserver.security.handler.CustomLogoutSuccessHandler;
@@ -55,7 +57,7 @@ import java.util.stream.Collectors;
import static org.springframework.beans.factory.config.BeanDefinition.ROLE_INFRASTRUCTURE; import static org.springframework.beans.factory.config.BeanDefinition.ROLE_INFRASTRUCTURE;
@EnableWebSecurity(debug = false) @EnableWebSecurity(debug = true)
@Configuration @Configuration
//@EnableMethodSecurity //@EnableMethodSecurity
public class ResourceServerConfig { public class ResourceServerConfig {
@@ -113,7 +115,7 @@ public class ResourceServerConfig {
OrRequestMatcher resourceMatchers = new OrRequestMatcher(resourcePath); OrRequestMatcher resourceMatchers = new OrRequestMatcher(resourcePath);
return http return http
.securityMatcher("/sopmal/**", "/oauth2/**", "/login/oauth2/**","/file/*") .securityMatcher("/*", "/sopmal/**", "/oauth2/**", "/login/oauth2/**","/file/*") ///gcone/** #배치호출처리
.headers((headers)->headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)) .headers((headers)->headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
.csrf(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(authorize -> .authorizeHttpRequests(authorize ->
@@ -205,6 +207,26 @@ public class ResourceServerConfig {
.build(); .build();
} }
@Bean
@Order(3)
SecurityFilterChain batchSecurityFilterChain(HttpSecurity http, SecurityPathProperties securityProperties) throws Exception {
List<RequestMatcher> uriList = securityProperties.getBatch().getUri().stream()
.map(AntPathRequestMatcher::new)
.collect(Collectors.toList());
OrRequestMatcher uri = new OrRequestMatcher(uriList);
return http
.securityMatcher(uri)
.headers((headers)->headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
.csrf(AbstractHttpConfigurer::disable)
.addFilterBefore(new BatchFilter(securityProperties), RequestCacheAwareFilter.class) /*batch 호출된 주소 확인 후 주소가 아니면 제외*/
.exceptionHandling(exceptions -> exceptions
.accessDeniedHandler(accessDeniedEntryPoint)
)
.build();
}
// //
// private String customBearerTokenResolver(HttpServletRequest request) { // private String customBearerTokenResolver(HttpServletRequest request) {
// String authorization = request.getHeader("Authorization"); // String authorization = request.getHeader("Authorization");

View File

@@ -19,6 +19,8 @@ public class SecurityPathProperties {
private Solmal solmal; private Solmal solmal;
private Admin admin; private Admin admin;
private Common common; private Common common;
private Batch batch;
@Getter @Getter
@Setter @Setter
@@ -39,5 +41,12 @@ public class SecurityPathProperties {
public static class Common { public static class Common {
private List<String> resources; private List<String> resources;
} }
@Getter
@Setter
public static class Batch {
private List<String> accessip;
private List<String> uri;
}
} }

View File

@@ -0,0 +1,51 @@
package com.wb.domainserver.security.filter;
import com.wb.domainserver.common.prop.PropertyService;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.security.config.SecurityPathProperties;
import com.wb.domainserver.security.filter.wrapper.XssServletWrapper;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.util.ContentCachingResponseWrapper;
import java.io.IOException;
import java.util.Arrays;
@Slf4j
public class BatchFilter implements Filter {
SecurityPathProperties securityProperties;
public BatchFilter(SecurityPathProperties securityProperties) {
this.securityProperties = securityProperties;
}
/*
* batch서버에서 호출 되었는지 확인하는 필터
* */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String ip = httpRequest.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty()) {
ip = httpRequest.getRemoteAddr();
}
// 여러 프록시를 거친 경우, 콤마로 구분된 여러 IP가 있을 수 있어 첫 번째 IP만 가져오거나 처리 필요 [4, 7].
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0];
}
Object[] whiteIp = securityProperties.getBatch().getAccessip().toArray();
/* 대상 ip가 아닌경우 처리불가*/
if(!Arrays.asList(whiteIp).contains(ip)){
throw new IOException("접근이 허용되지 않은 IP입니다.");
}
chain.doFilter(request, response);
}
}

View File

@@ -58,9 +58,9 @@ spring:
gcone: gcone:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://172.31.16.11:3306/gcone?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&verifyServerCertificate=false jdbc-url: jdbc:mysql://115.68.176.232:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: winbit username: sakeone
password: dnlsqlxm1! password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 1
maximumPoolSize: 10 maximumPoolSize: 10
idleTimeout: 30000 #30초 idleTimeout: 30000 #30초
@@ -70,9 +70,9 @@ spring:
sure: sure:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://172.31.17.11:3306/nutricore jdbc-url: jdbc:mysql://115.68.176.232:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: winbit username: sakeone
password: dnlsqlxm1! password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 1
maximumPoolSize: 10 maximumPoolSize: 10
idleTimeout: 30000 #30초 idleTimeout: 30000 #30초
@@ -358,6 +358,8 @@ mngrfo:
extensions: extensions:
images: .gif,.jpg,.jpeg,.png images: .gif,.jpg,.jpeg,.png
cdnurl: http://dev.img.soju1sake1.com cdnurl: http://dev.img.soju1sake1.com
subsvc:
dft-goods-optn-innb: 5
secret: secret:
@@ -378,9 +380,9 @@ naverpay:
real-url: https://pay.naver.com real-url: https://pay.naver.com
mail: mail:
host: mail.soju1sake1.com host: mail.sake1jan.com
port: 587 port: 587
username: custom@soju1sake1.com username: custom@sake1jan.com
password: mail13@$ password: mail13@$
connectiontimeout: 10000 connectiontimeout: 10000
timeout: 10000 timeout: 10000

View File

@@ -58,7 +58,7 @@ spring:
gcone: gcone:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://sakedb01.sldb.iwinv.net:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&verifyServerCertificate=false jdbc-url: jdbc:mysql://115.68.176.232:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: sakeone username: sakeone
password: dnlfxjtm13@$ password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 1
@@ -70,7 +70,7 @@ spring:
sure: sure:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://sakedb01.sldb.iwinv.net:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&verifyServerCertificate=false jdbc-url: jdbc:mysql://115.68.176.232:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: sakeone username: sakeone
password: dnlfxjtm13@$ password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 1
@@ -359,7 +359,8 @@ mngrfo:
images: .gif,.jpg,.jpeg,.png images: .gif,.jpg,.jpeg,.png
cdnurl: https://19b0bde6dcdc15ad.kinxzone.com cdnurl: https://19b0bde6dcdc15ad.kinxzone.com
upurl: https://www.soju1sake1.com upurl: https://www.soju1sake1.com
subsvc:
dft-goods-optn-innb: 5
secret: secret:
key: 1df5be2f7e90ae36 key: 1df5be2f7e90ae36
@@ -379,9 +380,9 @@ naverpay:
real-url: https://pay.naver.com real-url: https://pay.naver.com
mail: mail:
host: mail.soju1sake1.com host: mail.sake1jan.com
port: 587 port: 587
username: custom@soju1sake1.com username: custom@sake1jan.com
password: mail13@$ password: mail13@$
connectiontimeout: 10000 connectiontimeout: 10000
timeout: 10000 timeout: 10000

View File

@@ -58,11 +58,11 @@ spring:
gcone: gcone:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://sakedb01.sldb.iwinv.net:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&verifyServerCertificate=false jdbc-url: jdbc:mysql://10.2.1.101:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: sakeone username: sakeone
password: dnlfxjtm13@$ password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 10
maximumPoolSize: 10 maximumPoolSize: 50
idleTimeout: 30000 #30초 idleTimeout: 30000 #30초
maxLifetime: 1800000 #30분 maxLifetime: 1800000 #30분
connectionTimeout: 30000 connectionTimeout: 30000
@@ -70,7 +70,7 @@ spring:
sure: sure:
hikari: hikari:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://sakedb01.sldb.iwinv.net:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&verifyServerCertificate=false jdbc-url: jdbc:mysql://10.2.1.101:3306/sake?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=yes&verifyServerCertificate=false
username: sakeone username: sakeone
password: dnlfxjtm13@$ password: dnlfxjtm13@$
minimumIdle: 1 minimumIdle: 1
@@ -358,6 +358,8 @@ mngrfo:
extensions: extensions:
images: .gif,.jpg,.jpeg,.png images: .gif,.jpg,.jpeg,.png
cdnurl: https://19b0bde6dcdc15ad.kinxzone.com cdnurl: https://19b0bde6dcdc15ad.kinxzone.com
subsvc:
dft-goods-optn-innb: 5
secret: secret:
@@ -378,9 +380,9 @@ naverpay:
real-url: https://pay.naver.com real-url: https://pay.naver.com
mail: mail:
host: mail.soju1sake1.com host: 10.2.1.76
port: 587 port: 587
username: custom@soju1sake1.com username: custom@sake1jan.com
password: mail13@$ password: mail13@$
connectiontimeout: 10000 connectiontimeout: 10000
timeout: 10000 timeout: 10000

View File

@@ -428,6 +428,7 @@
END END
END AS EVT_TRGET_AT -- 이벤트 진행여부 이벤트 대상일경우 1을 반환함 = 정상 처리 0 이벤트 대상 아닐경우 1 END AS EVT_TRGET_AT -- 이벤트 진행여부 이벤트 대상일경우 1을 반환함 = 정상 처리 0 이벤트 대상 아닐경우 1
, IFNULL(EVT_DUPL_COUPON.DPLCT_LMTT_COUPON, 0) AS DPLCT_LMTT_COUPON -- 이벤트 중복제한 쿠폰 존재여부 , IFNULL(EVT_DUPL_COUPON.DPLCT_LMTT_COUPON, 0) AS DPLCT_LMTT_COUPON -- 이벤트 중복제한 쿠폰 존재여부
, CASE WHEN OPTN.OPTN_EXPSR_AT = 'Y' THEN 0 ELSE 1 END AS OPTN_EXPSR_AT
FROM (SELECT GG.GOODS_INNB -- 상품 고유번호 FROM (SELECT GG.GOODS_INNB -- 상품 고유번호
, GG.SOPMAL_CD -- 쇼핑몰코드 , GG.SOPMAL_CD -- 쇼핑몰코드
, GG.DLVY_GROUP_INNB -- 배송그룹고유번호 , GG.DLVY_GROUP_INNB -- 배송그룹고유번호
@@ -750,6 +751,7 @@
, EVT.DSCNT_BNEF_DV_CD , EVT.DSCNT_BNEF_DV_CD
, OPTN.COMPNB_DSCNT_AT , OPTN.COMPNB_DSCNT_AT
, OPTN.SCTN_DSCNT_AT , OPTN.SCTN_DSCNT_AT
, OPTN.OPTN_EXPSR_AT
</select> </select>
<!--주문 전 쿠폰번호 재확인--> <!--주문 전 쿠폰번호 재확인-->

View File

@@ -164,6 +164,8 @@
ORDR_CANCL_ATMC_PROCS_PD, ORDR_CANCL_ATMC_PROCS_PD,
ORDR_PURCHSR_DCSN_AT, ORDR_PURCHSR_DCSN_AT,
ORDR_ATMC_PURCHS_DCSN_PD, ORDR_ATMC_PURCHS_DCSN_PD,
BUY_RATE,
SELL_RATE,
FORMAT(MLG_HOLD_USE_AMT, 0) AS MLG_HOLD_USE_AMT, FORMAT(MLG_HOLD_USE_AMT, 0) AS MLG_HOLD_USE_AMT,
FORMAT(MLG_SETLE_AMT_USE_AMT, 0) AS MLG_SETLE_AMT_USE_AMT, FORMAT(MLG_SETLE_AMT_USE_AMT, 0) AS MLG_SETLE_AMT_USE_AMT,
FORMAT(MLG_MUMM_USE_AMT, 0) AS MLG_MUMM_USE_AMT, FORMAT(MLG_MUMM_USE_AMT, 0) AS MLG_MUMM_USE_AMT,
@@ -192,6 +194,7 @@
JOIN_GUIDANCE_WORDS, JOIN_GUIDANCE_WORDS,
JOIN_BNEF, JOIN_BNEF,
JOIN_COMPT_WORDS, JOIN_COMPT_WORDS,
SUBSVC_GUIDANCE_WORDS,
TOP_SYS_FIL_NM, TOP_SYS_FIL_NM,
META_DC, META_DC,
META_KWRD, META_KWRD,
@@ -511,6 +514,8 @@
ORDR_CANCL_ATMC_PROCS_PD, ORDR_CANCL_ATMC_PROCS_PD,
ORDR_PURCHSR_DCSN_AT, ORDR_PURCHSR_DCSN_AT,
ORDR_ATMC_PURCHS_DCSN_PD, ORDR_ATMC_PURCHS_DCSN_PD,
BUY_RATE,
SELL_RATE,
MLG_HOLD_USE_AMT, MLG_HOLD_USE_AMT,
MLG_SETLE_AMT_USE_AMT, MLG_SETLE_AMT_USE_AMT,
MLG_MUMM_USE_AMT, MLG_MUMM_USE_AMT,
@@ -543,6 +548,7 @@
JOIN_GUIDANCE_WORDS, JOIN_GUIDANCE_WORDS,
JOIN_BNEF, JOIN_BNEF,
JOIN_COMPT_WORDS, JOIN_COMPT_WORDS,
SUBSVC_GUIDANCE_WORDS,
REGUSR, REGUSR,
REGIST_DT, REGIST_DT,
UPDUSR, UPDUSR,
@@ -577,6 +583,8 @@
#{ordrCanclAtmcProcsPd }, #{ordrCanclAtmcProcsPd },
#{ordrPurchsrDcsnAt }, #{ordrPurchsrDcsnAt },
#{ordrAtmcPurchsDcsnPd }, #{ordrAtmcPurchsDcsnPd },
#{buyRate },
#{sellRate },
#{mlgHoldUseAmt }, #{mlgHoldUseAmt },
#{mlgSetleAmtUseAmt }, #{mlgSetleAmtUseAmt },
#{mlgMummUseAmt }, #{mlgMummUseAmt },
@@ -609,6 +617,7 @@
#{joinGuidanceWords}, #{joinGuidanceWords},
#{joinBnef}, #{joinBnef},
#{joinComptWords}, #{joinComptWords},
#{subsvcGuidanceWords},
#{regusr}, #{regusr},
SYSDATE(), SYSDATE(),
#{regusr}, #{regusr},
@@ -889,6 +898,8 @@
ORDR_ATMC_PURCHS_DCSN_PD = 0, ORDR_ATMC_PURCHS_DCSN_PD = 0,
</otherwise> </otherwise>
</choose> </choose>
BUY_RATE = #{buyRate},
SELL_RATE = #{sellRate},
MLG_HOLD_USE_AMT = #{mlgHoldUseAmt}, MLG_HOLD_USE_AMT = #{mlgHoldUseAmt},
MLG_SETLE_AMT_USE_AMT = #{mlgSetleAmtUseAmt}, MLG_SETLE_AMT_USE_AMT = #{mlgSetleAmtUseAmt},
MLG_MUMM_USE_AMT = #{mlgMummUseAmt}, MLG_MUMM_USE_AMT = #{mlgMummUseAmt},
@@ -918,6 +929,7 @@
JOIN_GUIDANCE_WORDS = #{joinGuidanceWords}, JOIN_GUIDANCE_WORDS = #{joinGuidanceWords},
JOIN_BNEF = #{joinBnef}, JOIN_BNEF = #{joinBnef},
JOIN_COMPT_WORDS = #{joinComptWords}, JOIN_COMPT_WORDS = #{joinComptWords},
SUBSVC_GUIDANCE_WORDS = #{subsvcGuidanceWords},
UPDUSR = #{updusr}, UPDUSR = #{updusr},
UPDT_DT = SYSDATE(), UPDT_DT = SYSDATE(),
META_DC = #{metaDc}, META_DC = #{metaDc},

View File

@@ -343,6 +343,8 @@
, CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM , CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
FROM ( FROM (
SELECT FG.GOODS_INNB SELECT FG.GOODS_INNB
, FGO.GOODS_OPTN_INNB
, FGO.OPTN_TY
, FG.DLVY_GROUP_INNB , FG.DLVY_GROUP_INNB
, FG.SOPMAL_CD , FG.SOPMAL_CD
, FG.GOODS_NM , FG.GOODS_NM
@@ -378,6 +380,7 @@
, FGO.CNSMRPRIC , FGO.CNSMRPRIC
, FGO.SLEPRIC , FGO.SLEPRIC
, FGO.SOPMAL_CD , FGO.SOPMAL_CD
, FGO.OPTN_TY
FROM GC_GOODS_OPTION FGO FROM GC_GOODS_OPTION FGO
WHERE FGO.OPTN_EXPSR_AT = 'Y' WHERE FGO.OPTN_EXPSR_AT = 'Y'
AND FGO.STDR_DV_AT = 'Y' AND FGO.STDR_DV_AT = 'Y'

View File

@@ -1269,7 +1269,9 @@ FROM (
, FDA.RECPNT_NM , FDA.RECPNT_NM
, REGEXP_REPLACE(CAST(AES_DECRYPT(UNHEX(FDA.TELNB), '1df5be2f7e90ae36') AS CHAR(50)), '(.{2})(.{4})(.{4})', '$1-$2-$3') AS TELNB , REGEXP_REPLACE(CAST(AES_DECRYPT(UNHEX(FDA.TELNB), '1df5be2f7e90ae36') AS CHAR(50)), '(.{2})(.{4})(.{4})', '$1-$2-$3') AS TELNB
, REGEXP_REPLACE(CAST(AES_DECRYPT(UNHEX(FDA.MBTLNB), '1df5be2f7e90ae36') AS CHAR(50)), '(.{3})(.{4})(.{4})', '$1-$2-$3') AS MBTLNB , REGEXP_REPLACE(CAST(AES_DECRYPT(UNHEX(FDA.MBTLNB), '1df5be2f7e90ae36') AS CHAR(50)), '(.{3})(.{4})(.{4})', '$1-$2-$3') AS MBTLNB
, FDA.DLVYLC_AREA_CD
, FDA.ZIP , FDA.ZIP
, FDA.PREFCD
, FDA.ADRES_DV , FDA.ADRES_DV
, FDA.RNM_ADRES , FDA.RNM_ADRES
, FDA.LNB_ADRES , FDA.LNB_ADRES
@@ -1573,6 +1575,15 @@ FROM (
, ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT, 0), '0') AS BUNDLE_DLVY_CND_AMT , ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT, 0), '0') AS BUNDLE_DLVY_CND_AMT
, FSG.DLVY_AREA_ADIT_AT , FSG.DLVY_AREA_ADIT_AT
, ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT, 0), '0') AS AREA_ADIT_DLVY_AMT , ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT, 0), '0') AS AREA_ADIT_DLVY_AMT
, ROUND(IFNULL(FSG.DFT_DLVY_AMT2, 0), '0') AS DFT_DLVY_AMT2
, FSG.AMT_CND_USE_AT2
, ROUND(IFNULL(FSG.AMT_CND_ADIT_AMT2, 0), '0') AS AMT_CND_ADIT_AMT2
, FSG.CNT_CND_USE_AT2
, ROUND(IFNULL(FSG.CNT_CND_ADIT_AMT2, 0), '0') AS CNT_CND_ADIT_AMT2
, FSG.BUNDLE_DLVY_USE_AT2
, ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT2, 0), '0') AS BUNDLE_DLVY_CND_AMT2
, FSG.DLVY_AREA_ADIT_AT2
, ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT2, 0), '0') AS AREA_ADIT_DLVY_AMT2
FROM GC_SHIPPING_GROUPING FSG FROM GC_SHIPPING_GROUPING FSG
WHERE FSG.DLVY_GROUP_INNB = #{dlvyGroupInnb} WHERE FSG.DLVY_GROUP_INNB = #{dlvyGroupInnb}
AND FSG.SOPMAL_CD = #{sopmalCd} AND FSG.SOPMAL_CD = #{sopmalCd}

View File

@@ -0,0 +1,301 @@
<?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.subsvc.mapper.BOSubsvcMapper">
<!-- 구독서비스 목록 조회 -->
<select id="selectBOSubsvcList"
parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO"
resultType="dataMap">
<![CDATA[
SELECT GS.SUBSVC_INNB
, SUBSVC_STTUS_CD
, CONCAT(GS.SUBSVC_NM, ' (', GS.SUBSVC_GNR_NM, ')') AS SUBSVC_CONCAT_NM
FROM GC_SUBSVC GS
WHERE GS.SOPMAL_CD = 'SK'
AND GS.SUBSVC_STTUS_CD != '03'
AND GS.EXPSR_DV_CD IN ('01','03')
AND
CASE
WHEN EXPSR_DV_CD = '03'
THEN NOW() BETWEEN GS.EXPSR_BGN_DT AND GS.EXPSR_END_DT
ELSE 1=1
END
]]>
</select>
<!-- 구독서비스 상세 조회 -->
<select id="selectBOSubsvcDetail"
parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO"
resultType="dataMap">
<![CDATA[
SELECT GS.SUBSVC_INNB
, GS.SOPMAL_CD
, GS.SUBSVC_NM
, GS.SUB_PD /*구독기간*/
, GS.SUBSVC_GNR /*기수*/
, (SELECT MAX(A.SUBSVC_GNR) + 1 FROM GC_SUBSVC A WHERE A.SOPMAL_CD = GS.SOPMAL_CD AND A.SUBSVC_NM = GS.SUBSVC_NM) AS SUBSVC_NEXT_GNR /*다음기수*/
, GS.SUBSVC_GNR_NM /*기수명*/
, CONCAT(GS.SUBSVC_NM, ' (', GS.SUBSVC_GNR_NM, ')') AS SUBSVC_CONCAT_NM
, GS.DLVY_CNT /*배송횟수*/
, GS.DLVY_CYCLE /*배송주기*/
, GS.SUBSVC_CT /*구독료*/
, GS.TME_DLVY_AMT /*1회배송비*/
, GS.CNSMRPRIC /*소비자가*/
, GS.SUBSVC_CT + (TME_DLVY_AMT * DLVY_CNT) as SELPRIC /*실판매가=구독료+(1회배송비X배송횟수)*/
, ROUND((GS.CNSMRPRIC - (GS.SUBSVC_CT + (TME_DLVY_AMT * DLVY_CNT))) / NULLIF(GS.CNSMRPRIC, 0) * 100, 0) AS DSCNT_RAITO
, GS.INVNTRY_QY /*재고수량*/
, GS.USEFUL_INVNTRY_QY /*판매재고수량*/
, GS.INVNTRY_QY - GS.USEFUL_INVNTRY_QY AS AVAIL_QT /*가용제고*/
, GS.SUBSVC_STTUS_CD /*상태코드*/
, FN_GET_COMMCODE_NAME('GOODS_STTUS', GS.SUBSVC_STTUS_CD) AS SUBSVC_STTUS
, FN_GET_COMMCODE_NAME('EXPSR_DV', GS.EXPSR_DV_CD) AS EXPSR_DV
, GS.EXPSR_DV_CD /*노출구분코드*/
, GS.EXPSR_BGN_DT /*노출시작일시*/
, GS.EXPSR_END_DT /*노출종료일시*/
, GS.INVNTRY_POLICY_CD /*재고정책코드*/
, GS.AVLINV_LMTT_QY /*가용재고제한수량*/
, GS.SUBSVC_DC /*구독서비스 설명*/
, GS.IMG /*섬네일 이미지*/
, GS.MBL_SUBSVC_DC /*모바일 구독서비스 설명*/
, GS.MBL_SUBSVC_DC_PC_SAME_AT /*모바일 구독서비스 설명 PC동일여부*/
, GS.LAST_PROCS_ODR /*최종차수*/
, GS.DFT_GOODS_OPTN_INNB /*기본상품옵션고유번호*/
FROM GC_SUBSVC GS
WHERE GS.SOPMAL_CD = #{sopmalCd}
AND GS.SUBSVC_INNB = #{subsvcInnb}
]]>
</select>
<!-- 관리자 구독서비스 목록 조회 -->
<select id="selectBOMngrSubsvcList" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO" resultType="dataMap">
SELECT *
FROM (
SELECT TB.*
, CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
FROM (
SELECT COUNT(*) OVER() AS TOT_CNT
, GC.SUBSVC_INNB
, GC.SOPMAL_CD
, GC.SUBSVC_NM
, GC.SUBSVC_GNR
, GC.SUBSVC_GNR_NM
, GC.DLVY_CNT
, GC.INVNTRY_QY
, GC.INVNTRY_QY - GC.USEFUL_INVNTRY_QY AS AVAIL_QT /*가용제고*/
, GC.SUBSVC_STTUS_CD
, FN_GET_COMMCODE_NAME('GOODS_STTUS', GC.SUBSVC_STTUS_CD) AS SUBSVC_STTUS /*구독서비스 상태*/
, FN_GET_COMMCODE_NAME('EXPSR_DV', GC.EXPSR_DV_CD) AS EXPSR_DV /*노출구분*/
, GC.SUBSVC_CT /*구독료*/
, GC.TME_DLVY_AMT /*1회배송비*/
, GC.CNSMRPRIC /*소비자가*/
, GC.SUBSVC_CT + (TME_DLVY_AMT * DLVY_CNT) as SELPRIC /*실판매가=구독료+(1회배송비X배송횟수)*/
, GC.IMG /*섬네일 이미지*/
, GC.LAST_PROCS_ODR /*최종차수*/
FROM GC_SUBSVC GC
WHERE GC.USE_AT = 'Y'
AND GC.SOPMAL_CD = #{sopmalCd}
<if test="srchSelSubsvcNm != null and srchSelSubsvcNm != ''">
AND GC.SUBSVC_NM = #{srchSelSubsvcNm} /*구독서비스 명*/
</if>
<if test="srchSelSubsvcGnr != null and srchSelSubsvcGnr != ''">
AND GC.SUBSVC_GNR = #{srchSelSubsvcGnr} /*기수*/
</if>
<if test="srchSubsvcNm != null and srchSubsvcNm != ''">
AND GC.SUBSVC_NM LIKE CONCAT('%',#{srchSubsvcNm},'%') /*구독서비스 명*/
</if>
<if test="srchSubsvcGnrNm != null and srchSubsvcGnrNm != ''">
AND GC.SUBSVC_GNR_NM LIKE CONCAT('%',#{srchSubsvcGnrNm},'%') /*기수명*/
</if>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(srchArrSubsvcSttusCd)">
/*판매상태*/
AND GC.SUBSVC_STTUS_CD IN
<foreach collection="srchArrSubsvcSttusCd" item="subsvcSttusCd" open="(" close=")" separator=",">
#{subsvcSttusCd}
</foreach>
</when>
</choose>
<if test="srchExpsrDvCd != null and srchExpsrDvCd != ''">
AND GC.EXPSR_DV_CD = #{srchExpsrDvCd} /*노출여부*/
</if>
ORDER BY
<choose>
<when test="sortDv == 'subsvcGnrAsc'">
GC.SUBSVC_NM ASC, SUBSVC_GNR ASC,
</when>
<otherwise>
GC.SUBSVC_NM DESC, SUBSVC_GNR DESC,
</otherwise>
</choose>
GC.SUBSVC_INNB ASC
) TB
WHERE (@ROWNUM:=0)=0
) PV
WHERE 1=1
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<!-- 관리자 구독서비스 조회조건 구독서비스 -->
<select id="selectBOMngrSrchSubsvcList" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO" resultType="dataMap">
SELECT GC.SUBSVC_NM, MIN(GC.SUBSVC_INNB) SUBSVC_INNB
FROM GC_SUBSVC GC
WHERE GC.SOPMAL_CD = #{sopmalCd}
AND GC.USE_AT = 'Y'
GROUP BY GC.SUBSVC_NM
ORDER BY SUBSVC_INNB ASC
</select>
<!-- 관리자 구독서비스 조회조건 구독서비스별 기수 -->
<select id="selectBOMngrSrchSubsvcGnrList" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO" resultType="dataMap">
<![CDATA[
SELECT GC.SUBSVC_GNR, CONCAT(GC.SUBSVC_GNR , '기 (', GC.SUBSVC_GNR_NM, ')') SUBSVC_GNR_NM
FROM GC_SUBSVC GC
WHERE GC.SUBSVC_NM = #{srchSelSubsvcNm}
AND GC.SOPMAL_CD = #{sopmalCd}
AND GC.USE_AT = 'Y'
GROUP BY GC.SUBSVC_GNR, GC.SUBSVC_GNR_NM
ORDER BY GC.SUBSVC_GNR ASC
]]>
</select>
<!--선택된 구독서비스 삭제(사용여부N처리)-->
<update id="deleteBOMngrSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
UPDATE GC_SUBSVC
SET USE_AT = 'N'
,UPDUSR = #{updusr}
,UPDT_DT = NOW()
WHERE SOPMAL_CD = #{sopmalCd}
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(arrSubsvcInnb)">
AND SUBSVC_INNB IN
<foreach collection="arrSubsvcInnb" item="subsvcInnb" open="(" separator="," close=")">
#{subsvcInnb}
</foreach>
</when>
<otherwise>
AND 1=2
</otherwise>
</choose>
</update>
<!--선택된 구독서비스 수정-->
<update id="updateBOMngrSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
UPDATE GC_SUBSVC
SET SOPMAL_CD = #{sopmalCd}
, SUBSVC_NM = #{subsvcNm}
, SUB_PD = #{subPd}
, SUBSVC_GNR_NM = #{subsvcGnrNm}
, DLVY_CNT = REPLACE(#{dlvyCnt},',','')
, DLVY_CYCLE = #{dlvyCycle}
, SUBSVC_CT = REPLACE(#{subsvcCt},',','')
, TME_DLVY_AMT = REPLACE(#{tmeDlvyAmt},',','')
, CNSMRPRIC = REPLACE(#{cnsmrpric},',','')
, INVNTRY_QY = REPLACE(#{invntryQy},',','')
, INVNTRY_POLICY_CD = #{invntryPolicyCd}
, AVLINV_LMTT_QY = #{avlinvLmttQy}
, SUBSVC_STTUS_CD = #{subsvcSttusCd}
, EXPSR_DV_CD = #{expsrDvCd}
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(expsrBgnDt)">
, EXPSR_BGN_DT = #{expsrBgnDt}
</when>
<otherwise>
, EXPSR_BGN_DT = null
</otherwise>
</choose>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(expsrEndDt)">
, EXPSR_END_DT = #{expsrEndDt}
</when>
<otherwise>
, EXPSR_END_DT = null
</otherwise>
</choose>
, SUBSVC_DC = #{subsvcDc}
, MBL_SUBSVC_DC = #{mblSubsvcDc}
, MBL_SUBSVC_DC_PC_SAME_AT = #{mblSubsvcDcPcSameAt}
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(img)">
, IMG = #{img}
</if>
, UPDUSR = #{updusr}
, UPDT_DT = NOW()
WHERE SUBSVC_INNB = #{subsvcInnb}
</update>
<!-- 구독서비스 등록 -->
<insert id="insertBOMngrSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO" useGeneratedKeys="true" keyProperty="subsvcInnb" keyColumn="SUBSVC_INNB">
INSERT INTO GC_SUBSVC (SOPMAL_CD
, SUBSVC_NM
, SUB_PD
, SUBSVC_GNR
, SUBSVC_GNR_NM
, DLVY_CNT
, DLVY_CYCLE
, SUBSVC_CT
, TME_DLVY_AMT
, CNSMRPRIC
, INVNTRY_QY
, USEFUL_INVNTRY_QY
, INVNTRY_POLICY_CD
, AVLINV_LMTT_QY
, SUBSVC_STTUS_CD
, EXPSR_DV_CD
, EXPSR_BGN_DT
, EXPSR_END_DT
, SUBSVC_DC
, MBL_SUBSVC_DC
, MBL_SUBSVC_DC_PC_SAME_AT
, IMG
, DFT_GOODS_OPTN_INNB
, USE_AT
, REGUSR
, REGIST_DT)
VALUES (#{sopmalCd}
, #{subsvcNm}
, #{subPd}
, #{subsvcGnr}
, #{subsvcGnrNm}
, REPLACE(#{dlvyCnt},',','')
, #{dlvyCycle}
, REPLACE(#{subsvcCt},',','')
, REPLACE(#{tmeDlvyAmt},',','')
, REPLACE(#{cnsmrpric},',','')
, REPLACE(#{invntryQy},',','')
, 0
, #{invntryPolicyCd}
, #{avlinvLmttQy}
, #{subsvcSttusCd}
, #{expsrDvCd}
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(expsrBgnDt)">
, #{expsrBgnDt}
</when>
<otherwise>
, null
</otherwise>
</choose>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(expsrEndDt)">
, #{expsrEndDt}
</when>
<otherwise>
, null
</otherwise>
</choose>
, #{subsvcDc}
, #{mblSubsvcDc}
, #{mblSubsvcDcPcSameAt}
, #{img}
, #{dftGoodsOptnInnb}
, 'Y'
, #{regusr}
, NOW()
)
</insert>
<!-- 구독서비스명 중복체크 -->
<select id="selectBOMngrSubsvcNmDupCheck" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO" resultType="int">
SELECT COUNT(*) CNT
FROM GC_SUBSVC GS
WHERE GS.SOPMAL_CD = #{sopmalCd}
AND GS.SUBSVC_NM = #{subsvcNm}
</select>
</mapper>

View File

@@ -726,6 +726,15 @@
AND MBTLNB = HEX(AES_ENCRYPT(#{mbtlnb}, #{secretKey})) AND MBTLNB = HEX(AES_ENCRYPT(#{mbtlnb}, #{secretKey}))
</select> </select>
<!--회원 핸드폰 번호와 바뀐 핸드폰 번호 비교-->
<select id = "selectBOMbrEmailCompare" parameterType="com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO">
SELECT COUNT(1)
FROM GC_MEMBER MBR
WHERE MBR.MBR_INNB = #{mbrInnb}
AND MBR.MBR_DV_CD = #{mbrDvCd}
AND EMAIL = HEX(AES_ENCRYPT(#{email}, #{secretKey}))
</select>
<!-- 회원 정보 수정 --> <!-- 회원 정보 수정 -->
<update id="updateBOMbrInfoUpdt" parameterType="com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO"> <update id="updateBOMbrInfoUpdt" parameterType="com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrVO">
UPDATE GC_MEMBER SET UPDATE GC_MEMBER SET

View File

@@ -27,6 +27,7 @@
AND OI.GOODS_INNB = G.GOODS_INNB AND OI.GOODS_INNB = G.GOODS_INNB
INNER JOIN GC_ORDER O ON EX.SOPMAL_CD = O.SOPMAL_CD INNER JOIN GC_ORDER O ON EX.SOPMAL_CD = O.SOPMAL_CD
AND EX.ORDR_INNB = O.ORDR_INNB AND EX.ORDR_INNB = O.ORDR_INNB
/*AND O.SUBSVC_AT = 'N'*/ /*구독서비스 제외*/
INNER JOIN GC_ORDER_SHIPPING OSHIP ON EX.SOPMAL_CD = OSHIP.SOPMAL_CD INNER JOIN GC_ORDER_SHIPPING OSHIP ON EX.SOPMAL_CD = OSHIP.SOPMAL_CD
AND EX.ORDR_INNB = OSHIP.ORDR_INNB AND EX.ORDR_INNB = OSHIP.ORDR_INNB
AND EX.ORDR_DLVY_INNB = OSHIP.ORDR_DLVY_INNB AND EX.ORDR_DLVY_INNB = OSHIP.ORDR_DLVY_INNB
@@ -405,6 +406,7 @@
AND OI.GOODS_INNB = G.GOODS_INNB AND OI.GOODS_INNB = G.GOODS_INNB
INNER JOIN GC_ORDER O ON SH.SOPMAL_CD = O.SOPMAL_CD INNER JOIN GC_ORDER O ON SH.SOPMAL_CD = O.SOPMAL_CD
AND SH.ORDR_INNB = O.ORDR_INNB AND SH.ORDR_INNB = O.ORDR_INNB
/*AND O.SUBSVC_AT = 'N'*/ /*구독서비스 제외*/
INNER JOIN GC_ORDER_SETLE ST ON SH.SOPMAL_CD = ST.SOPMAL_CD INNER JOIN GC_ORDER_SETLE ST ON SH.SOPMAL_CD = ST.SOPMAL_CD
AND SH.ORDR_INNB = ST.ORDR_INNB AND SH.ORDR_INNB = ST.ORDR_INNB
LEFT JOIN GC_MEMBER MBR ON O.MBR_DV_CD = MBR.MBR_DV_CD LEFT JOIN GC_MEMBER MBR ON O.MBR_DV_CD = MBR.MBR_DV_CD
@@ -583,8 +585,10 @@
,SUM(OIOP.ORDR_QY) AS ORDR_QY -- 주문수량 ,SUM(OIOP.ORDR_QY) AS ORDR_QY -- 주문수량
,COUNT(OIOP.ORDR_GOODS_OPTN_INNB) AS CNT ,COUNT(OIOP.ORDR_GOODS_OPTN_INNB) AS CNT
,IFNULL(SUM(OIOP.STEP85), 0) AS SETLE_CANCEL_QY -- 취소수량 ,IFNULL(SUM(OIOP.STEP85), 0) AS SETLE_CANCEL_QY -- 취소수량
,SUM(OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량 -- ,SUM(OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량
,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량 -- ,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량
,SUM(OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량
,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량
,CASE -- ,CASE --
WHEN COUNT(OIOP.ORDR_GOODS_OPTN_INNB) > 1 THEN CONCAT(MAX(OI.GOODS_NM) , ' 외 ', COUNT(OIOP.ORDR_GOODS_OPTN_INNB)-1, '종') WHEN COUNT(OIOP.ORDR_GOODS_OPTN_INNB) > 1 THEN CONCAT(MAX(OI.GOODS_NM) , ' 외 ', COUNT(OIOP.ORDR_GOODS_OPTN_INNB)-1, '종')
ELSE MAX(OI.GOODS_NM) ELSE MAX(OI.GOODS_NM)
@@ -662,8 +666,10 @@
,SUM(OIOP.ORDR_QY) AS ORDR_QY -- 주문수량 ,SUM(OIOP.ORDR_QY) AS ORDR_QY -- 주문수량
,COUNT(OIOP.ORDR_GOODS_OPTN_INNB) AS CNT ,COUNT(OIOP.ORDR_GOODS_OPTN_INNB) AS CNT
,IFNULL(SUM(OIOP.STEP85), 0) AS SETLE_CANCEL_QY -- 취소수량 ,IFNULL(SUM(OIOP.STEP85), 0) AS SETLE_CANCEL_QY -- 취소수량
,SUM(OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량 -- ,SUM(OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량
,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량 -- ,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량
,SUM(OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS SNDNG_QY -- 보낸 수량
,SUM((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS REMAIN_QY -- 남은 수량
,CASE -- ,CASE --
WHEN COUNT(OIOP.ORDR_GOODS_OPTN_INNB) > 1 THEN CONCAT(MAX(OI.GOODS_NM) , ' 외 ', COUNT(OIOP.ORDR_GOODS_OPTN_INNB)-1, '종') WHEN COUNT(OIOP.ORDR_GOODS_OPTN_INNB) > 1 THEN CONCAT(MAX(OI.GOODS_NM) , ' 외 ', COUNT(OIOP.ORDR_GOODS_OPTN_INNB)-1, '종')
ELSE MAX(OI.GOODS_NM) ELSE MAX(OI.GOODS_NM)
@@ -755,7 +761,8 @@
OIOP.ORDR_GOODS_OPTN_INNB OIOP.ORDR_GOODS_OPTN_INNB
,OIOP.SOPMAL_CD ,OIOP.SOPMAL_CD
,OIOP.OPTN_TY ,OIOP.OPTN_TY
,((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS QY -- ,((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP35 + OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS QY
,((OIOP.ORDR_QY - OIOP.STEP85) - (OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75)) AS QY /*상품준비(35)는 출고대상으로 지정*/
,OI.GOODS_NM ,OI.GOODS_NM
,( ,(
SELECT SELECT

View File

@@ -79,14 +79,17 @@
MBR_INNB, MBR_INNB,
MBR_DV_CD, MBR_DV_CD,
DLVYLC_DC_CN, DLVYLC_DC_CN,
DLVYLC_AREA_CD,
RECPNT_NM, RECPNT_NM,
CAST(AES_DECRYPT(UNHEX(MBTLNB) , '1df5be2f7e90ae36') AS CHAR(50)) AS MBTLNB, CAST(AES_DECRYPT(UNHEX(MBTLNB) , '1df5be2f7e90ae36') AS CHAR(50)) AS MBTLNB,
ADRES_DV, ADRES_DV,
LNB_ADRES, LNB_ADRES,
RNM_ADRES, RNM_ADRES,
DTL_ADRES, DTL_ADRES,
CSTMCLER_CD,
DFT_DLVYLC_AT, DFT_DLVYLC_AT,
ZIP ZIP,
PREFCD
<include refid="dlvyAdresFrom"/> <include refid="dlvyAdresFrom"/>
<include refid="mbrInnbWhere"/> <include refid="mbrInnbWhere"/>
ORDER BY (CASE WHEN DFT_DLVYLC_AT = 'Y' THEN 1 ELSE 2 END), ADBK_INNB DESC ORDER BY (CASE WHEN DFT_DLVYLC_AT = 'Y' THEN 1 ELSE 2 END), ADBK_INNB DESC
@@ -179,12 +182,15 @@
SELECT SELECT
ADBK_INNB, ADBK_INNB,
MBR_INNB, MBR_INNB,
DLVYLC_AREA_CD,
RECPNT_NM, RECPNT_NM,
ZIP, ZIP,
PREFCD,
DLVYLC_DC_CN, DLVYLC_DC_CN,
LNB_ADRES, LNB_ADRES,
RNM_ADRES, RNM_ADRES,
DTL_ADRES, DTL_ADRES,
CSTMCLER_CD,
CAST(AES_DECRYPT(UNHEX(MBTLNB) , '1df5be2f7e90ae36') AS CHAR(50)) AS MBTLNB, CAST(AES_DECRYPT(UNHEX(MBTLNB) , '1df5be2f7e90ae36') AS CHAR(50)) AS MBTLNB,
DFT_DLVYLC_AT, DFT_DLVYLC_AT,
REGIST_DT, REGIST_DT,
@@ -222,14 +228,17 @@
MBR_DV_CD, MBR_DV_CD,
MBR_INNB, MBR_INNB,
DLVYLC_DC_CN, DLVYLC_DC_CN,
DLVYLC_AREA_CD,
RECPNT_NM, RECPNT_NM,
TELNB, TELNB,
MBTLNB, MBTLNB,
ZIP, ZIP,
PREFCD,
ADRES_DV, ADRES_DV,
LNB_ADRES, LNB_ADRES,
RNM_ADRES, RNM_ADRES,
DTL_ADRES, DTL_ADRES,
CSTMCLER_CD,
DFT_DLVYLC_AT, DFT_DLVYLC_AT,
RECENT_DLVYLC_AT, RECENT_DLVYLC_AT,
REGUSR, REGUSR,
@@ -241,14 +250,17 @@
#{mbrDvCd}, #{mbrDvCd},
#{mbrInnb}, #{mbrInnb},
#{dlvylcDcCn}, #{dlvylcDcCn},
#{dlvylcAreaCd},
#{recpntNm}, #{recpntNm},
#{telnb}, #{telnb},
HEX(AES_ENCRYPT(REPLACE(#{mbtlnb},'-',''), '1df5be2f7e90ae36')), HEX(AES_ENCRYPT(REPLACE(#{mbtlnb},'-',''), '1df5be2f7e90ae36')),
#{zip}, #{zip},
#{prefcd},
#{adresDv}, #{adresDv},
#{lnbAdres}, #{lnbAdres},
#{rnmAdres}, #{rnmAdres},
#{dtlAdres}, #{dtlAdres},
#{cstmclerCd},
#{dftDlvylcAt}, #{dftDlvylcAt},
#{recentDlvylcAt}, #{recentDlvylcAt},
#{regusr}, #{regusr},
@@ -264,13 +276,16 @@
<![CDATA[ <![CDATA[
UPDATE GC_DELIVERY_ADDRESS UPDATE GC_DELIVERY_ADDRESS
SET SET
DLVYLC_AREA_CD= #{dlvylcAreaCd},
RECPNT_NM = #{recpntNm}, RECPNT_NM = #{recpntNm},
MBTLNB = HEX(AES_ENCRYPT(REPLACE(#{mbtlnb},'-',''), '1df5be2f7e90ae36')), MBTLNB = HEX(AES_ENCRYPT(REPLACE(#{mbtlnb},'-',''), '1df5be2f7e90ae36')),
ZIP = #{zip}, ZIP = #{zip},
PREFCD = #{prefcd},
ADRES_DV = #{adresDv}, ADRES_DV = #{adresDv},
RNM_ADRES = #{rnmAdres}, RNM_ADRES = #{rnmAdres},
LNB_ADRES = #{lnbAdres}, LNB_ADRES = #{lnbAdres},
DTL_ADRES = #{dtlAdres}, DTL_ADRES = #{dtlAdres},
CSTMCLER_CD = #{cstmclerCd},
DFT_DLVYLC_AT = #{dftDlvylcAt}, DFT_DLVYLC_AT = #{dftDlvylcAt},
UPDUSR = #{updusr}, UPDUSR = #{updusr},
UPDT_DT = SYSDATE(), UPDT_DT = SYSDATE(),
@@ -482,6 +497,7 @@
AND FOS.ORDR_INNB = FO.ORDR_INNB AND FOS.ORDR_INNB = FO.ORDR_INNB
WHERE FO.USE_AT = 'Y' WHERE FO.USE_AT = 'Y'
AND IFNULL(FOS.ORDR_INNB, '') != '' AND IFNULL(FOS.ORDR_INNB, '') != ''
/*AND FO.SUBSVC_AT = 'N'*/
AND FO.SOPMAL_CD = #{sopmalCd} AND FO.SOPMAL_CD = #{sopmalCd}
<include refid="orderWhere"/> <include refid="orderWhere"/>
</select> </select>
@@ -585,6 +601,7 @@
ON FOS.SOPMAL_CD = FO.SOPMAL_CD ON FOS.SOPMAL_CD = FO.SOPMAL_CD
AND FOS.ORDR_INNB = FO.ORDR_INNB AND FOS.ORDR_INNB = FO.ORDR_INNB
WHERE FO.USE_AT = 'Y' WHERE FO.USE_AT = 'Y'
/*AND FO.SUBSVC_AT = 'N'*/
AND FOS.ORDR_INNB IS NOT NULL -- GC_ORDER_SETLE 에 데이터가 있을 때 조건 AND FOS.ORDR_INNB IS NOT NULL -- GC_ORDER_SETLE 에 데이터가 있을 때 조건
# AND IFNULL(FOS.ORDR_INNB, '') != '' -- 필터조건의 의미가 inner join 을 의미하므로, GC_ORDER_SETLE 테이블과 inner join 으로 변경하였음. # AND IFNULL(FOS.ORDR_INNB, '') != '' -- 필터조건의 의미가 inner join 을 의미하므로, GC_ORDER_SETLE 테이블과 inner join 으로 변경하였음.
AND FO.SOPMAL_CD = #{sopmalCd} AND FO.SOPMAL_CD = #{sopmalCd}
@@ -2690,7 +2707,7 @@
<!-- 다운로드항목 등록 --> <!-- 다운로드항목 등록 -->
<insert id="insertDwldForm" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BODwldItmVO"> <insert id="insertDwldForm" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BODwldItmVO">
<selectKey order="BEFORE" keyProperty="excelDwldFormSnb" resultType="java.lang.Long"> <selectKey order="BEFORE" keyProperty="excelDwldFormSnb" resultType="java.lang.String">
SELECT IFNULL(MAX(EXCEL_DWLD_FORM_SNB), 0) + 1 FROM GC_EXCEL_DWLD_FORM SELECT IFNULL(MAX(EXCEL_DWLD_FORM_SNB), 0) + 1 FROM GC_EXCEL_DWLD_FORM
</selectKey> </selectKey>
@@ -3803,6 +3820,7 @@
LEFT JOIN GC_ORDER_SETLE FOS ON FOS.SOPMAL_CD = FO.SOPMAL_CD LEFT JOIN GC_ORDER_SETLE FOS ON FOS.SOPMAL_CD = FO.SOPMAL_CD
AND FOS.ORDR_INNB = FO.ORDR_INNB AND FOS.ORDR_INNB = FO.ORDR_INNB
WHERE FO.USE_AT = 'Y' WHERE FO.USE_AT = 'Y'
AND FO.SUBSVC_AT = 'N' /*구독서비스 제외*/
AND IFNULL(FOS.ORDR_INNB, '') != '' AND IFNULL(FOS.ORDR_INNB, '') != ''
AND FO.SOPMAL_CD = #{sopmalCd} AND FO.SOPMAL_CD = #{sopmalCd}
AND FO.MBR_DV_CD = #{mbrDvCd} AND FO.MBR_DV_CD = #{mbrDvCd}
@@ -3939,6 +3957,7 @@
AND GOR.SOPMAL_CD = #{sopmalCd} AND GOR.SOPMAL_CD = #{sopmalCd}
AND GOR.MBR_DV_CD = #{mbrDvCd} AND GOR.MBR_DV_CD = #{mbrDvCd}
AND GOR.MBR_INNB = #{mbrInnb} AND GOR.MBR_INNB = #{mbrInnb}
AND GOR.SUBSVC_INNB IS NULL /*구독서비스 제외*/
) )
GROUP BY FOI.ORDR_INNB GROUP BY FOI.ORDR_INNB
) ITEM ON ITEM.SOPMAL_CD = FO.SOPMAL_CD ) ITEM ON ITEM.SOPMAL_CD = FO.SOPMAL_CD
@@ -3946,6 +3965,7 @@
LEFT JOIN GC_ORDER_SETLE FOS ON FOS.SOPMAL_CD = FO.SOPMAL_CD LEFT JOIN GC_ORDER_SETLE FOS ON FOS.SOPMAL_CD = FO.SOPMAL_CD
AND FOS.ORDR_INNB = FO.ORDR_INNB AND FOS.ORDR_INNB = FO.ORDR_INNB
WHERE FO.USE_AT = 'Y' WHERE FO.USE_AT = 'Y'
AND FO.SUBSVC_AT = 'N' /*구독서비스 제외*/
AND ( ( FO.ORDR_STTUS_CD BETWEEN '15' AND '75' ) OR FO.ORDR_STTUS_CD = '95' ) AND ( ( FO.ORDR_STTUS_CD BETWEEN '15' AND '75' ) OR FO.ORDR_STTUS_CD = '95' )
AND FO.SOPMAL_CD = #{sopmalCd} AND FO.SOPMAL_CD = #{sopmalCd}
AND FO.MBR_DV_CD = #{mbrDvCd} AND FO.MBR_DV_CD = #{mbrDvCd}
@@ -4619,7 +4639,7 @@
</select> </select>
<!-- 추가지역별배송비 해당 여부 --> <!-- 추가지역별배송비 해당 여부 (KR) -->
<select id="selectBODefaultAdressAtInqire" <select id="selectBODefaultAdressAtInqire"
resultType="java.lang.String"> resultType="java.lang.String">
<![CDATA[ <![CDATA[
@@ -4637,6 +4657,24 @@
]]> ]]>
</select> </select>
<!-- 추가지역별배송비 해당 여부 (JP) -->
<select id="selectBODefaultAdressAtInqire2"
resultType="java.lang.String">
<![CDATA[
SELECT
CASE
WHEN EXISTS (
SELECT 1
FROM GC_DEFAULT_ADDSHIPPING
WHERE SOPMAL_CD = #{sopmalCd}
AND PREFCD = #{prefcd}
) THEN 'Y'
ELSE 'N'
END AS ADDSHIPPING_AT
FROM DUAL
]]>
</select>
@@ -5247,6 +5285,163 @@
]]> ]]>
</select> </select>
<!-- 사용자 > 마이페이지 > 구독서비스 주문/배송 목록 조회 -->
<select id="selectMbrSubsvcOrdrList" parameterType="com.wb.domainserver.domain.gcone.ordr.ordr.vo.BOOrdrDlvyVO" resultType="dataMap">
<![CDATA[
SELECT *
FROM (
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, TB.*
FROM (
SELECT COUNT(*) OVER() TOT_CNT
, FO.SOPMAL_CD
, CAST(FO.ORDR_INNB AS CHAR) AS ORDR_INNB
, FO.ORDR_RCEPT_DT
, DATE_FORMAT(FO.ORDR_RCEPT_DT, '%Y.%m.%d') AS ORDR_DT
, GS.IMG AS GOODS_IMAGE_URL
, CONCAT(GS.SUBSVC_NM, '[', GS.SUBSVC_GNR_NM, ']') AS GOODS_NM
, FN_GET_ORDER_GOODS_OPTN_NAME(FO.SOPMAL_CD, FO.ORDR_INNB, 0) AS OPTN_NM
, GS.SUBSVC_INNB AS GOODS_INNB
, ITEM.ORDR_DLVY_INNB
, FO.RL_SETLE_AMT AS SETLE_AMT
, FO.ORDR_STTUS_CD
, CASE
WHEN FO.ORDR_STTUS_CD = '95' THEN '주문취소'
ELSE FN_GET_COMMCODE_NAME('ORDR_STTUS', FO.ORDR_STTUS_CD)
END AS ORDR_STTUS_NM
, (
SELECT
FN_GET_COMMCODE_NAME('GIFT_STTUS', SH.GIFT_STTUS_CD) AS GIFT_STTUS_CD
FROM GC_ORDER_SHIPPING SH
WHERE 1 =1
AND SH.SOPMAL_CD = FO.SOPMAL_CD
AND SH.ORDR_INNB = FO.ORDR_INNB
LIMIT 1
) AS GIFT_STTUS_CD_NM
, (
SELECT
SH.GIFT_STTUS_CD
FROM GC_ORDER_SHIPPING SH
WHERE 1 =1
AND SH.SOPMAL_CD = FO.SOPMAL_CD
AND SH.ORDR_INNB = FO.ORDR_INNB
LIMIT 1
) AS GIFT_STTUS_CD
, FO.ORDR_TY_CD
, FO.SKN_ENVRN_CD
, FN_GET_COMMCODE_NAME('ORDR_TY', FO.ORDR_TY_CD) AS ORDR_TY_CD_NM
, FO.MBR_INNB
, FO.MBR_DV_CD
, CASE
WHEN EXISTS (
SELECT 1
FROM GC_ORDER_ITEM_OPTION FOIO
INNER JOIN GC_ORDER_ITEM FOI
ON FOIO.SOPMAL_CD = FOI.SOPMAL_CD
AND FOIO.ORDR_GOODS_INNB = FOI.ORDR_GOODS_INNB
INNER JOIN GC_GOODS FG
ON FOI.GOODS_INNB = FG.GOODS_INNB
AND FOI.SOPMAL_CD = FG.SOPMAL_CD
AND FG.GOODS_KND_CD = '01'
LEFT JOIN LATERAL ( SELECT FBG.ORDR_GOODS_OPTN_INNB
, FBG.SOPMAL_CD
, SUM(CASE WHEN FB.BBS_ID = 'goods_review' THEN 1 ELSE 0 END) RVW_CNT
, SUM(CASE WHEN FB.BBS_ID = 'goods_review_month' THEN 1 ELSE 0 END) MT_RVW_CNT
FROM GC_BOARDDATA_GOODS FBG
INNER JOIN GC_BOARDDATA FB
ON FBG.BBSCTT_INNB = FB.BBSCTT_INNB
AND FBG.SOPMAL_CD = FB.SOPMAL_CD
AND FB.BBS_ID IN ('goods_review','goods_review_month')
WHERE FOIO.ORDR_GOODS_OPTN_INNB = FBG.ORDR_GOODS_OPTN_INNB
GROUP BY FBG.ORDR_GOODS_OPTN_INNB, FBG.SOPMAL_CD
)RVW
ON FOIO.ORDR_GOODS_OPTN_INNB = RVW.ORDR_GOODS_OPTN_INNB
AND FOIO.SOPMAL_CD = RVW.SOPMAL_CD
WHERE 1 = 1
AND FOIO.SOPMAL_CD = FO.SOPMAL_CD
AND FOI.ORDR_INNB = FO.ORDR_INNB
AND FOIO.PURCHS_DCSN_QY > 0
AND FOIO.OPTN_TY <> '04'
AND ((FG.RVW_WRITNG_POSBL_AT = 'Y' AND (CASE WHEN IFNULL(FOIO.PURCHS_DCSN_QY,0) < IFNULL(FOIO.ORDR_QY,0) - IFNULL(STEP85,0) THEN IFNULL(FOIO.PURCHS_DCSN_QY,0)
ELSE IFNULL(FOIO.ORDR_QY,0) - IFNULL(STEP85,0) END) > IFNULL(RVW.RVW_CNT,0) )
OR (FG.MT_RVW_WRITNG_POSBL_AT = 'Y' AND IFNULL(MT_RVW_CNT,0) < 1))
AND FOIO.PURCHS_DCSN_DT > DATE_SUB(SYSDATE(),INTERVAL 6 MONTH)
) THEN 'Y'
ELSE 'N'
END AS REVIEW_AT
, CASE
WHEN EXISTS (
SELECT
1
FROM GC_ORDER_ITEM_OPTION OIOP
INNER JOIN GC_ORDER_SHIPPING SH ON OIOP.SOPMAL_CD = SH.SOPMAL_CD
AND OIOP.ORDR_DLVY_INNB = SH.ORDR_DLVY_INNB
WHERE 1 = 1
AND OIOP.PURCHS_DCSN_AT = 'N'
AND FO.SOPMAL_CD = SH.SOPMAL_CD
AND FO.ORDR_INNB = SH.ORDR_INNB
AND OIOP.ORDR_STTUS_CD BETWEEN '50' AND '75'
) THEN 'Y'
ELSE 'N'
END AS PURCHS_DCSN_AT
,FOS.SETLE_TY_CD
FROM GC_ORDER FO
INNER JOIN GC_SUBSVC GS ON FO.SUBSVC_INNB = GS.SUBSVC_INNB
INNER JOIN (
SELECT FOI.SOPMAL_CD
, FOI.ORDR_INNB
, MAX(FOI.GOODS_INNB) AS GOODS_INNB
, MAX(FOIO.ORDR_DLVY_INNB) AS ORDR_DLVY_INNB
, COUNT(DISTINCT FOI.ORDR_GOODS_INNB) AS CNT
, SUM(FOIO.ORDR_QY) AS ORDR_QY
, MAX(FN_GET_ORDER_INPUT_OPTN(FOI.SOPMAL_CD, FOI.ORDR_INNB, FOI.ORDR_GOODS_INNB, FOIO.ORDR_GOODS_OPTN_INNB)) AS INPUT_OPTN_TEXT
, MAX(FOI.GOODS_IMG_COURS) AS GOODS_IMG_COURS
FROM GC_ORDER_ITEM FOI
INNER JOIN GC_ORDER_ITEM_OPTION FOIO ON FOI.SOPMAL_CD = FOIO.SOPMAL_CD
AND FOI.ORDR_GOODS_INNB = FOIO.ORDR_GOODS_INNB
WHERE FOI.SOPMAL_CD = #{sopmalCd}
AND FOI.GOODS_KND_CD = '01'
AND (FOI.SOPMAL_CD, FOI.ORDR_INNB) IN (
SELECT GOR.SOPMAL_CD
, GOR.ORDR_INNB
FROM GC_ORDER GOR
WHERE GOR.USE_AT = 'Y'
AND GOR.SOPMAL_CD = #{sopmalCd}
AND GOR.MBR_DV_CD = #{mbrDvCd}
AND GOR.MBR_INNB = #{mbrInnb}
AND GOR.SUBSVC_AT = 'Y' /*구독서비스*/
)
GROUP BY FOI.ORDR_INNB
) ITEM ON ITEM.SOPMAL_CD = FO.SOPMAL_CD
AND ITEM.ORDR_INNB = FO.ORDR_INNB
LEFT JOIN GC_ORDER_SETLE FOS ON FOS.SOPMAL_CD = FO.SOPMAL_CD
AND FOS.ORDR_INNB = FO.ORDR_INNB
WHERE FO.USE_AT = 'Y'
AND FO.SUBSVC_AT = 'Y' /*구독서비스*/
AND ( ( FO.ORDR_STTUS_CD BETWEEN '15' AND '75' ) OR FO.ORDR_STTUS_CD = '95' )
AND FO.SOPMAL_CD = #{sopmalCd}
AND FO.MBR_DV_CD = #{mbrDvCd}
AND FO.MBR_INNB = #{mbrInnb}
ORDER BY FO.REGIST_DT DESC
) TB
WHERE (@rownum:=0) = 0
]]>
<include refid="mbrOrdrSubsvcListWhere"/>
) PV
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<sql id="mbrOrdrSubsvcListWhere">
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(srchwrd)">
AND (
TB.ORDR_INNB LIKE CONCAT('%', #{srchwrd}, '%') OR
TB.GOODS_NM LIKE CONCAT('%', #{srchwrd}, '%')
)
</if>
<if test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(bgnDt) and @com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(endDt)">
AND TB.ORDR_RCEPT_DT BETWEEN DATE(#{bgnDt}) AND DATE(#{endDt}) + 1
</if>
</sql>
</mapper> </mapper>

View File

@@ -0,0 +1,470 @@
<?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.ordr.subsvc.mapper.BOSubsvcOrdrMapper">
<!--구독서비스 상품준비 관리 목록-->
<select id="selectBOSubsvcOrderList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT *
FROM (
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, COUNT(*) OVER() AS TOT_CNT
, MAIN.*
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY GO.ORDR_INNB ORDER BY GO.ORDR_INNB ASC, GOIO.ORDR_STTUS_CD ASC, GOI.ORDR_GOODS_INNB ASC, GOIO.ORDR_GOODS_OPTN_INNB ASC) AS LINE
, GO.ORDR_INNB
, GOI.ORDR_GOODS_INNB
, GOIO.ORDR_GOODS_OPTN_INNB /*일괄처리 대상 주문상품옵션고유번호*/
, GOIO.ORDR_DLVY_INNB
, GS.SUBSVC_NM
, GS.SUBSVC_GNR
, GS.SUBSVC_GNR_NM
, GM.MBR_NM
, GM.MBR_ID
, GM.MBR_DV_CD
, GM.MBR_INNB
, fn_get_member_grad_name(GO.SOPMAL_CD, GM.MBR_DV_CD, GM.MBR_INNB) AS GRADE
, SUM(CASE WHEN GOIO.ORDR_STTUS_CD BETWEEN '35' AND '75' THEN 1 ELSE 0 END) OVER(PARTITION BY GO.ORDR_INNB)+1 AS CURT_PROCS_ODR
, SUM(CASE WHEN GOIO.ORDR_STTUS_CD BETWEEN '35' AND '75' THEN 1 ELSE 0 END) OVER(PARTITION BY GO.ORDR_INNB) AS MBR_LAST_PROCS_ODR /*회원별 최종차수 상품준비 ~ 배송완료*/
, MAX(GOIO.UPDT_DT) OVER(PARTITION BY GO.ORDR_INNB) AS LAST_PRCS_DT/*최종처리일*/
, IFNULL(GS.LAST_PROCS_ODR,0) AS LAST_PROCS_ODR /*최종차수*/
, GOIO.ORDR_STTUS_CD
FROM GC_ORDER GO
JOIN GC_SUBSVC GS ON GS.SOPMAL_CD = GO.SOPMAL_CD AND GS.SUBSVC_INNB = GO.SUBSVC_INNB
JOIN GC_MEMBER GM ON GM.MBR_DV_CD = GO.MBR_DV_CD AND GM.MBR_INNB = GO.MBR_INNB
JOIN GC_ORDER_ITEM GOI ON GO.SOPMAL_CD =GOI.SOPMAL_CD AND GO.ORDR_INNB = GOI.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOI.SOPMAL_CD = GOIO.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB AND GOIO.OPTN_TY = '01'
WHERE GO.USE_AT = 'Y'
AND GO.SUBSVC_AT = 'Y'
AND GO.SOPMAL_CD = #{sopmalCd}
<if test='srchSelSubsvcNm != null and srchSelSubsvcNm != ""'>
AND GS.SUBSVC_NM = #{srchSelSubsvcNm} /*구독서비스 명*/
</if>
<if test='srchSelSubsvcGnr != null and srchSelSubsvcGnr != ""'>
AND GS.SUBSVC_GNR = #{srchSelSubsvcGnr} /*기수*/
</if>
<if test='srchSubsvcNm != null and srchSubsvcNm != ""'>
AND GS.SUBSVC_NM LIKE CONCAT('%',#{srchSubsvcNm},'%') /*구독서비스 명*/
</if>
<if test='srchSubsvcGnrNm != null and srchSubsvcGnrNm != ""'>
AND GS.SUBSVC_GNR_NM LIKE CONCAT('%',#{srchSubsvcGnrNm},'%') /*기수명*/
</if>
) MAIN
WHERE (@ROWNUM:=0)=0
AND MAIN.LINE = 1
AND MAIN.ORDR_STTUS_CD = '25'
<if test='srchCurMonExclude!= null and srchCurMonExclude == "Y"'>
<![CDATA[
AND MAIN.LAST_PRCS_DT < CONCAT(DATE_FORMAT(NOW(),'%Y-%m'),'-01') /*당월 처리자 제외*/
]]>
</if>
<choose>
<when test='sortDv == "subsvcGnrAsc"'>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC /*구독서비스명+기수*/
</when>
<when test='sortDv == "subsvcGnrDesc"'>
ORDER BY SUBSVC_NM DESC, SUBSVC_GNR DESC /*구독서비스명+기수*/
</when>
<when test='sortDv == "mbrAsc"'>
ORDER BY MBR_NM ASC, MBR_ID ASC /*주문자순*/
</when>
<when test='sortDv == "mbrDesc"'>
ORDER BY MBR_NM DESC, MBR_ID DESC /*주문자순*/
</when>
<when test='sortDv == "ordrAsc"'>
ORDER BY ORDR_INNB ASC /*주문번호순*/
</when>
<when test='sortDv == "ordrDesc"'>
ORDER BY ORDR_INNB DESC /*주문번호순*/
</when>
<when test='sortDv == "lastPrcsDtAsc"'>
ORDER BY LAST_PRCS_DT ASC /*최종처리일순*/
</when>
<when test='sortDv == "lastPrcsDtDesc"'>
ORDER BY LAST_PRCS_DT ASC /*최종처리일순*/
</when>
<otherwise>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC
</otherwise>
</choose>
) PV
WHERE 1=1
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<!--구독서비스 상품준비 관리 목록 배송내역 팝업 배송내역목록-->
<select id="selectBOSubsvcOrderDlvyList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, GOIO.ORDR_GOODS_OPTN_INNB
, GO.ORDR_INNB
, GM.MBR_NM
, GM.MBR_ID
, GM.MBR_DV_CD
, GM.MBR_INNB
, fn_get_member_grad_name(GO.SOPMAL_CD, GM.MBR_DV_CD, GM.MBR_INNB) AS GRADE
, IFNULL(GOIO.UPDT_DT, GOIO.REGIST_DT) AS PROCS_DT /*발생일자*/
, GOI.GOODS_IMG_COURS
, GOI.GOODS_NM
, GOIO.OPTN_NM_1
, GOIO.OPTN_VAL_1
, GOIO.CNSMRPRIC /*정가*/
, GOIO.SLEPRIC /*판매가*/
, fn_get_commcode_name('ORDR_STTUS', GOIO.ORDR_STTUS_CD) AS ORDR_STTUS
FROM GC_ORDER GO
JOIN GC_MEMBER GM ON GM.MBR_DV_CD = GO.MBR_DV_CD AND GM.MBR_INNB = GO.MBR_INNB
JOIN GC_ORDER_ITEM GOI ON GOI.SOPMAL_CD = GO.SOPMAL_CD AND GOI.ORDR_INNB = GO.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOI.SOPMAL_CD = GOIO.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB AND GOIO.OPTN_TY = '01'
WHERE (@ROWNUM:=0)=0
AND GOI.ORDR_INNB = #{ordrInnb}
AND GOI.SOPMAL_CD = #{sopmalCd}
ORDER BY GOIO.ORDR_GOODS_OPTN_INNB ASC
</select>
<!--구독서비스 상품준비 관리 상품매칭 - 1. GC_ORDER update-->
<update id="updateBOSubsvcGoodsMappgOrdr" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
<foreach collection="arrOrdrInnb" item="ordrInnb" separator=";">
UPDATE GC_ORDER
SET ORDR_STTUS_CD = (CASE WHEN ORDR_STTUS_CD = '25' THEN '35' ELSE ORDR_STTUS_CD END)
, UPDT_DT = NOW()
WHERE SOPMAL_CD = #{sopmalCd}
AND ORDR_INNB = #{ordrInnb}
</foreach>
</update>
<!--구독서비스 상품준비 관리 상품매칭 - 2. GC_ORDER_ITEM update-->
<update id="updateBOSubsvcGoodsMappgOrdrItem" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
<foreach collection="arrOrdrGoodsInnb" item="ordrGoodsInnb" separator=";">
UPDATE GC_ORDER_ITEM GOI, (SELECT GG.GOODS_INNB, GG.GOODS_NM, GGI.IMG
FROM GC_GOODS GG
JOIN GC_GOODS_IMAGE GGI ON GGI.SOPMAL_CD = GG.SOPMAL_CD AND GGI.GOODS_INNB = GG.GOODS_INNB AND GGI.CUT_NB = 1 AND GGI.IMG_KND = '02'
WHERE GG.GOODS_INNB = #{goodsInnb}
LIMIT 1) G
SET GOI.GOODS_INNB = G.GOODS_INNB
, GOI.GOODS_NM = G.GOODS_NM
, GOI.GOODS_IMG_COURS = G.IMG
WHERE SOPMAL_CD = #{sopmalCd}
AND GOI.ORDR_GOODS_INNB = #{ordrGoodsInnb}
</foreach>
</update>
<!--구독서비스 상품준비 관리 상품매칭 - 3. GC_ORDER_ITEM_OPTION update-->
<update id="updateBOSubsvcGoodsMappgOrdrItemOptn" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
<foreach collection="arrOrdrGoodsOptnInnb" item="ordrGoodsOptnInnb" separator=";">
UPDATE GC_ORDER_ITEM_OPTION GOIO, (SELECT GOODS_OPTN_INNB
, OPTN_TY
, OPTN_NM_1
, OPTN_NM_2
, OPTN_NM_3
, OPTN_NM_4
, OPTN_VAL_1
, OPTN_VAL_2
, OPTN_VAL_3
, OPTN_VAL_4
, OPTN_CD_1
, OPTN_CD_2
, OPTN_CD_3
, OPTN_CD_4
, OPTN_INFO
, CNSMRPRIC
, SLEPRIC
, GG.TAX_AT
FROM GC_GOODS_OPTION GGO
JOIN GC_GOODS GG ON GG.SOPMAL_CD = GGO.SOPMAL_CD AND GG.GOODS_INNB = GGO.GOODS_INNB
WHERE GGO.GOODS_OPTN_INNB = #{goodsOptnInnb}
AND GGO.OPTN_TY = #{optnTy}
LIMIT 1) G
SET GOIO.GOODS_OPTN_INNB = G.GOODS_OPTN_INNB
, GOIO.OPTN_TY = G.OPTN_TY
, GOIO.OPTN_NM_1 = G.OPTN_NM_1
, GOIO.OPTN_NM_2 = G.OPTN_NM_2
, GOIO.OPTN_NM_3 = G.OPTN_NM_3
, GOIO.OPTN_NM_4 = G.OPTN_NM_4
, GOIO.OPTN_VAL_1 = G.OPTN_VAL_1
, GOIO.OPTN_VAL_2 = G.OPTN_VAL_2
, GOIO.OPTN_VAL_3 = G.OPTN_VAL_3
, GOIO.OPTN_VAL_4 = G.OPTN_VAL_4
, GOIO.OPTN_CD_1 = G.OPTN_CD_1
, GOIO.OPTN_CD_2 = G.OPTN_CD_2
, GOIO.OPTN_CD_3 = G.OPTN_CD_3
, GOIO.OPTN_CD_4 = G.OPTN_CD_4
, GOIO.OPTN_INFO = G.OPTN_INFO
, GOIO.CNSMRPRIC = G.CNSMRPRIC
, GOIO.SLEPRIC = G.SLEPRIC
, GOIO.TAX_AT = G.TAX_AT
, GOIO.STEP85 = 0
, GOIO.STEP35 = GOIO.ORDR_QY
, GOIO.STEP45 = 0
, GOIO.STEP55 = 0
, GOIO.STEP65 = 0
, GOIO.STEP75 = 0
, GOIO.ORDR_STTUS_CD = '35'
, GOIO.UPDT_DT = NOW()
WHERE GOIO.SOPMAL_CD = #{sopmalCd}
AND GOIO.ORDR_GOODS_OPTN_INNB = #{ordrGoodsOptnInnb}
</foreach>
</update>
<!--구독서비스 상품준비 관리 상품매칭 - 4. GC_ORDER_SHIPPING update-->
<update id="updateBOSubsvcGoodsMappgShipping" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
<foreach collection="arrOrdrDlvyInnb" item="ordrDlvyInnb" separator=";">
UPDATE GC_ORDER_SHIPPING
SET ORDR_STTUS_CD = '35'
, UPDT_DT = NOW()
WHERE SOPMAL_CD = #{sopmalCd}
AND ORDR_DLVY_INNB = #{ordrDlvyInnb}
</foreach>
</update>
<!--구독서비스 상품준비 관리 상품매칭 - 5. GC_SUBSVC update-->
<update id="updateBOSubsvcGoodsMappgSubsvc" parameterType="com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO">
UPDATE GC_SUBSVC GS, ( SELECT SOPMAL_CD, SUBSVC_INNB, MAX(LAST_PROCS_ODR) LAST_PROCS_ODR
FROM (
SELECT GOIO.SOPMAL_CD, GO.SUBSVC_INNB, SUM(CASE WHEN GOIO.ORDR_STTUS_CD BETWEEN '35' AND '75' THEN 1 ELSE 0 END) OVER(PARTITION BY GO.SOPMAL_CD, GO.ORDR_INNB) AS LAST_PROCS_ODR
FROM GC_ORDER GO
JOIN GC_ORDER_ITEM GOI ON GOI.SOPMAL_CD = GO.SOPMAL_CD AND GOI.ORDR_INNB = GO.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOIO.SOPMAL_CD = GOI.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB
WHERE GO.SUBSVC_AT = 'Y'
AND GO.SOPMAL_CD = #{sopmalCd}
AND GO.SUBSVC_INNB IN (SELECT DISTINCT SUBSVC_INNB
FROM GC_ORDER
WHERE SOPMAL_CD = #{sopmalCd}
AND ORDR_INNB IN
<foreach collection="arrOrdrInnb" item="ordrInnb" open="(" close=")" separator=",">
#{ordrInnb}
</foreach>
)
) M
GROUP BY SOPMAL_CD, SUBSVC_INNB
) MAIN
SET GS.LAST_PROCS_ODR = MAIN.LAST_PROCS_ODR
, UPDT_DT = NOW()
WHERE GS.SOPMAL_CD = MAIN.SOPMAL_CD
AND GS.SUBSVC_INNB = MAIN.SUBSVC_INNB
</update>
<!--구독서비스 상품변경 관리 목록-->
<select id="selectBOSubsvcOrderMappedList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT *
FROM (
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, COUNT(*) OVER() AS TOT_CNT
, MAIN.*
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY GO.ORDR_INNB ORDER BY GOI.ORDR_GOODS_INNB ASC, GOIO.ORDR_GOODS_OPTN_INNB ASC) AS CURT_PROCS_ODR /*차수*/
, GO.ORDR_INNB /*주문번호*/
, GOI.ORDR_GOODS_INNB
, GOIO.ORDR_GOODS_OPTN_INNB /*일괄처리 대상 주문상품옵션고유번호*/
, GOIO.ORDR_DLVY_INNB
, GS.SUBSVC_NM
, GS.SUBSVC_GNR
, GS.SUBSVC_GNR_NM
, GM.MBR_NM /*회원명*/
, GM.MBR_ID /*회원ID*/
, GM.MBR_DV_CD /*회원구분코드*/
, GM.MBR_INNB /*회원고유번호*/
, fn_get_member_grad_name(GO.SOPMAL_CD, GM.MBR_DV_CD, GM.MBR_INNB) AS GRADE /*회원등급*/
, MAX(GOIO.UPDT_DT) OVER(PARTITION BY GO.ORDR_INNB) AS LAST_PRCS_DT/*최종처리일*/
, GOIO.ORDR_STTUS_CD
, GOI.GOODS_IMG_COURS /*상품이미지*/
, GOI.GOODS_NM /*상품명*/
, GOIO.OPTN_NM_1 /*상품옵션명*/
, GOIO.OPTN_VAL_1 /*상품옵션값*/
, GOIO.UPDT_DT /*처리일자*/
FROM GC_ORDER GO
JOIN GC_SUBSVC GS ON GS.SOPMAL_CD = GO.SOPMAL_CD AND GS.SUBSVC_INNB = GO.SUBSVC_INNB
JOIN GC_MEMBER GM ON GM.MBR_DV_CD = GO.MBR_DV_CD AND GM.MBR_INNB = GO.MBR_INNB
JOIN GC_ORDER_ITEM GOI ON GO.SOPMAL_CD =GOI.SOPMAL_CD AND GO.ORDR_INNB = GOI.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOI.SOPMAL_CD = GOIO.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB AND GOIO.OPTN_TY = '01'
WHERE GO.USE_AT = 'Y'
AND GO.SUBSVC_AT = 'Y'
AND GO.SOPMAL_CD = #{sopmalCd}
<if test='srchSelSubsvcNm != null and srchSelSubsvcNm != ""'>
AND GS.SUBSVC_NM = #{srchSelSubsvcNm} /*구독서비스 명*/
</if>
<if test='srchSelSubsvcGnr != null and srchSelSubsvcGnr != ""'>
AND GS.SUBSVC_GNR = #{srchSelSubsvcGnr} /*기수*/
</if>
<if test='srchSubsvcNm != null and srchSubsvcNm != ""'>
AND GS.SUBSVC_NM LIKE CONCAT('%',#{srchSubsvcNm},'%') /*구독서비스 명*/
</if>
<if test='srchSubsvcGnrNm != null and srchSubsvcGnrNm != ""'>
AND GS.SUBSVC_GNR_NM LIKE CONCAT('%',#{srchSubsvcGnrNm},'%') /*기수명*/
</if>
<if test='srchOrdrInnb != null and srchOrdrInnb != ""'>
AND GO.ORDR_INNB = #{srchOrdrInnb} /*주문번호*/
</if>
<if test='srchMbrNm != null and srchMbrNm != ""'>
AND GM.MBR_NM LIKE CONCAT('%',#{srchMbrNm},'%') /*주문자명*/
</if>
<if test='srchMbrId != null and srchMbrId != ""'>
AND GM.MBR_ID LIKE CONCAT('%',#{srchMbrId},'%') /*주문자id*/
</if>
) MAIN
WHERE (@ROWNUM:=0)=0
AND MAIN.ORDR_STTUS_CD = '35'
<if test='srchCurMonExclude!= null and srchCurMonExclude == "Y"'>
<![CDATA[
AND MAIN.LAST_PRCS_DT < CONCAT(DATE_FORMAT(NOW(),'%Y-%m'),'-01') /*당월 처리자 제외*/
]]>
</if>
<choose>
<when test='sortDv == "subsvcGnrAsc"'>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC /*구독서비스명+기수*/
</when>
<when test='sortDv == "subsvcGnrDesc"'>
ORDER BY SUBSVC_NM DESC, SUBSVC_GNR DESC /*구독서비스명+기수*/
</when>
<when test='sortDv == "mbrAsc"'>
ORDER BY MBR_NM ASC, MBR_ID ASC /*주문자순*/
</when>
<when test='sortDv == "mbrDesc"'>
ORDER BY MBR_NM DESC, MBR_ID DESC /*주문자순*/
</when>
<when test='sortDv == "ordrAsc"'>
ORDER BY ORDR_INNB ASC /*주문번호순*/
</when>
<when test='sortDv == "ordrDesc"'>
ORDER BY ORDR_INNB DESC /*주문번호순*/
</when>
<when test='sortDv == "lastPrcsDtAsc"'>
ORDER BY UPDT_DT ASC /*처리일순*/
</when>
<when test='sortDv == "lastPrcsDtDesc"'>
ORDER BY UPDT_DT ASC /*처리일순*/
</when>
<otherwise>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC
</otherwise>
</choose>
) PV
WHERE 1=1
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<!--구독서비스 구독자조회 목록-->
<select id="selectBOSubsvcOrderMbrList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT *
FROM (
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, COUNT(*) OVER() AS TOT_CNT
, MAIN.*
FROM (
WITH ORDR AS (SELECT COUNT(DISTINCT GO.ORDR_INNB) AS SUBSCRIBER_CNT
, MAX(GOIO.UPDT_DT) AS LAST_PRCS_DT
, GO.SOPMAL_CD
, GO.SUBSVC_INNB
FROM GC_ORDER GO
JOIN GC_ORDER_ITEM GOI ON GOI.SOPMAL_CD = GO.SOPMAL_CD AND GOI.ORDR_INNB = GO.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOIO.SOPMAL_CD = GOI.SOPMAL_CD AND GOIO.ORDR_GOODS_INNB AND GOI.ORDR_GOODS_INNB
WHERE GO.SUBSVC_AT = 'Y'
AND GO.USE_AT = 'Y'
GROUP BY GO.SOPMAL_CD, GO.SUBSVC_INNB)
SELECT GS.SUBSVC_INNB
, GS.SUBSVC_NM /*구독서비스명*/
, GS.SUBSVC_GNR /*구독서비스명 기수*/
, GS.SUBSVC_GNR_NM /*구독서비스명 기수명*/
, GS.SUBSVC_CT + (GS.TME_DLVY_AMT * GS.DLVY_CNT) as SELPRIC /*실판매가=구독료+(1회배송비X배송횟수)*/
, GS.DLVY_CNT /*배송횟수*/
, IFNULL(GS.LAST_PROCS_ODR, 0) AS LAST_PROCS_ODR /*최종차수*/
, IFNULL(ORDR.SUBSCRIBER_CNT, 0) AS SUBSCRIBER_CNT /*구독자수*/
, ORDR.LAST_PRCS_DT
FROM GC_SUBSVC GS
LEFT JOIN ORDR ON ORDR.SOPMAL_CD = GS.SOPMAL_CD AND ORDR.SUBSVC_INNB = GS.SUBSVC_INNB
WHERE GS.USE_AT = 'Y'
AND GS.SOPMAL_CD = #{sopmalCd}
<if test='srchSelSubsvcNm != null and srchSelSubsvcNm != ""'>
AND GS.SUBSVC_NM = #{srchSelSubsvcNm} /*구독서비스 명*/
</if>
<if test='srchSelSubsvcGnr != null and srchSelSubsvcGnr != ""'>
AND GS.SUBSVC_GNR = #{srchSelSubsvcGnr} /*기수*/
</if>
<if test='srchSubsvcNm != null and srchSubsvcNm != ""'>
AND GS.SUBSVC_NM LIKE CONCAT('%',#{srchSubsvcNm},'%') /*구독서비스 명*/
</if>
<if test='srchSubsvcGnrNm != null and srchSubsvcGnrNm != ""'>
AND GS.SUBSVC_GNR_NM LIKE CONCAT('%',#{srchSubsvcGnrNm},'%') /*기수명*/
</if>
<if test='srchSubEndAt == "Y"'>
<![CDATA[
AND (GS.LAST_PROCS_ODR IS NULL OR GS.LAST_PROCS_ODR < DLVY_CNT) /*구독종료여부*/
]]>
</if>
<choose>
<when test='sortDv == "subsvcGnrAsc"'>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC /*구독서비스명+기수*/
</when>
<when test='sortDv == "subsvcGnrDesc"'>
ORDER BY SUBSVC_NM DESC, SUBSVC_GNR DESC /*구독서비스명+기수*/
</when>
<when test='sortDv == "subscriberAsc"'>
ORDER BY SUBSCRIBER_CNT ASC /*구독자수 정렬*/
</when>
<when test='sortDv == "subscriberDesc"'>
ORDER BY SUBSCRIBER_CNT DESC /*구독자수 정렬*/
</when>
<otherwise>
ORDER BY SUBSVC_NM ASC, SUBSVC_GNR ASC
</otherwise>
</choose>
) MAIN
WHERE (@ROWNUM:=0)=0
) PV
WHERE 1=1
LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
</select>
<!--구독서비스 구독자조회 - 구독자목록 팝업 - 구독서비스 정보-->
<select id="selectBOSubsvcInfo" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT GS.SUBSVC_NM, GS.SUBSVC_GNR, GS.SUBSVC_GNR_NM
FROM GC_SUBSVC GS
WHERE GS.SUBSVC_INNB = #{subsvcInnb}
</select>
<!--구독서비스 구독자조회 - 구독자목록 팝업 - 구독자목록 조회-->
<select id="selectBOSubsvcOrderMbrInfoList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, COUNT(*) OVER() AS TOT_CNT
, MAIN.*
FROM (
SELECT GO.ORDR_INNB
, GM.MBR_NM
, GM.MBR_ID
, GM.MBR_DV_CD
, fn_get_member_grad_name(GO.SOPMAL_CD, GM.MBR_DV_CD, GM.MBR_INNB) AS GRADE
, SUM(CASE WHEN GOIO.ORDR_STTUS_CD BETWEEN '35' AND '75' THEN 1 ELSE 0 END) AS LAST_PROCS_ODR/*최종차수 상품준비 ~ 배송완료*/
, MAX(GOIO.UPDT_DT) AS LAST_PRCS_DT/*최종처리일*/
FROM GC_ORDER GO
JOIN GC_MEMBER GM ON GM.MBR_DV_CD = GO.MBR_DV_CD AND GM.MBR_INNB = GO.MBR_INNB
JOIN GC_ORDER_ITEM GOI ON GO.SOPMAL_CD =GOI.SOPMAL_CD AND GO.ORDR_INNB = GOI.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOI.SOPMAL_CD = GOIO.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB AND GOIO.OPTN_TY = '01'
WHERE GO.USE_AT = 'Y'
AND GO.SUBSVC_AT = 'Y'
AND GO.SUBSVC_INNB = #{subsvcInnb} /*구독서비스 고유번호*/
GROUP BY GO.SOPMAL_CD, GO.ORDR_INNB, GM.MBR_DV_CD, GM.MBR_NM, GM.MBR_ID
ORDER BY GO.ORDR_INNB ASC
)MAIN
WHERE (@ROWNUM:=0)=0
</select>
<!--구독서비스 구독자조회 - 배송상품 목록팝업 - 배송상품목록 조회-->
<select id="selectBOSubsvcOrderGoodsInfoList" parameterType="com.wb.domainserver.domain.gcone.ordr.subsvc.vo.BOSubsvcOrderVO" resultType="dataMap">
SELECT CAST(@ROWNUM:=@ROWNUM + 1 AS UNSIGNED) AS RNUM
, COUNT(*) OVER() AS TOT_CNT
, MAIN.*
FROM (
SELECT GOIO.GOODS_OPTN_INNB
, GOI.GOODS_IMG_COURS
, GOI.GOODS_NM
, GOIO.OPTN_NM_1
, GOIO.OPTN_VAL_1
, COUNT(DISTINCT GO.ORDR_INNB) AS APPLY_CNT/*적용횟수*/
FROM GC_ORDER GO
JOIN GC_ORDER_ITEM GOI ON GO.SOPMAL_CD =GOI.SOPMAL_CD AND GO.ORDR_INNB = GOI.ORDR_INNB
JOIN GC_ORDER_ITEM_OPTION GOIO ON GOI.SOPMAL_CD = GOIO.SOPMAL_CD AND GOI.ORDR_GOODS_INNB = GOIO.ORDR_GOODS_INNB AND GOIO.OPTN_TY = '01'
WHERE GO.USE_AT = 'Y'
AND GO.SUBSVC_AT = 'Y'
AND GOIO.ORDR_STTUS_CD BETWEEN '35' AND '75' /*상품준비 ~ 배송완료*/
AND GO.SUBSVC_INNB = #{subsvcInnb} /*구독서비스 고유번호*/
GROUP BY GOIO.GOODS_OPTN_INNB, GOODS_IMG_COURS, GOI.GOODS_NM, GOIO.OPTN_NM_1, GOIO.OPTN_VAL_1
ORDER BY GOI.GOODS_NM, GOIO.OPTN_NM_1, GOIO.OPTN_VAL_1
) MAIN
WHERE (@ROWNUM:=0)=0
</select>
</mapper>

View File

@@ -129,6 +129,19 @@
,RETURN_DLVY_APPLC_AT ,RETURN_DLVY_APPLC_AT
,RETURN_DLVY_AMT ,RETURN_DLVY_AMT
,EXCHNG_DLVY_AMT ,EXCHNG_DLVY_AMT
,RTNLC_INNB2
,DFT_DLVY_AMT2
,AMT_CND_USE_AT2
,AMT_CND_ADIT_AMT2
,CNT_CND_USE_AT2
,CNT_CND_ADIT_AMT2
,DLVY_AREA_ADIT_AT2
,AREA_ADIT_DLVY_AMT2
,BUNDLE_DLVY_USE_AT2
,BUNDLE_DLVY_CND_AMT2
,RETURN_DLVY_APPLC_AT2
,RETURN_DLVY_AMT2
,EXCHNG_DLVY_AMT2
,USE_AT ,USE_AT
,REGUSR ,REGUSR
,REGIST_DT ,REGIST_DT
@@ -154,6 +167,19 @@
,#{returnDlvyApplcAt} ,#{returnDlvyApplcAt}
,#{returnDlvyAmt} ,#{returnDlvyAmt}
,#{exchngDlvyAmt} ,#{exchngDlvyAmt}
,#{rtnlcInnb2}
,#{dftDlvyAmt2}
,#{amtCndUseAt2}
,#{amtCndAditAmt2}
,#{cntCndUseAt2}
,#{cntCndAditAmt2}
,#{dlvyAreaAditAt2}
,#{areaAditDlvyAmt2}
,#{bundleDlvyUseAt2}
,#{bundleDlvyCndAmt2}
,#{returnDlvyApplcAt2}
,#{returnDlvyAmt2}
,#{exchngDlvyAmt2}
,'Y' ,'Y'
,#{regusr} ,#{regusr}
,now() ,now()
@@ -200,12 +226,50 @@
) )
</insert> </insert>
<!-- 배송 반송지 등록 -->
<insert id="insertBODlvyGroupAddress2" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
<selectKey keyProperty="rtnlcInnb2"
resultType="java.lang.Integer"
order="BEFORE">
SELECT IFNULL(MAX(RTNLC_INNB),0) + 1 FROM GC_SHIPPING_ADDRESS WHERE SOPMAL_CD = #{sopmalCd}
</selectKey>
INSERT INTO GC_SHIPPING_ADDRESS
(
RTNLC_INNB
, SOPMAL_CD
, RTNLC_ZIP
, RTNLC_ADRES
, RTNLC_DTL_ADRES
, RTNLC_TELNB
, USE_AT
, REGUSR
, REGIST_DT
, UPDUSR
, UPDT_DT
)
VALUES
(
#{rtnlcInnb2}
, #{sopmalCd}
, #{rtnlcZip2}
, #{rtnlcAdres2}
, #{rtnlcDtlAdres2}
, #{rtnlcTelnb2}
, 'Y'
, #{regusr}
, now()
, #{regusr}
, now()
)
</insert>
<!-- 배송그룹 정보 조회 --> <!-- 배송그룹 정보 조회 -->
<select id="selectBODlvyGroupDtlForm" <select id="selectBODlvyGroupDtlForm"
parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO"
resultType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO"> resultType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
SELECT SELECT
SG.DLVY_GROUP_INNB SG.DLVY_GROUP_INNB
,SG.SOPMAL_CD
,SG.DLVY_GROUP_DV_CD ,SG.DLVY_GROUP_DV_CD
,SG.DLVY_GROUP_NM ,SG.DLVY_GROUP_NM
,SG.DFT_DLVY_AMT ,SG.DFT_DLVY_AMT
@@ -220,19 +284,41 @@
,SG.RETURN_DLVY_APPLC_AT ,SG.RETURN_DLVY_APPLC_AT
,SG.RETURN_DLVY_AMT ,SG.RETURN_DLVY_AMT
,SG.EXCHNG_DLVY_AMT ,SG.EXCHNG_DLVY_AMT
,SG.DFT_DLVY_AMT2
,SG.AMT_CND_USE_AT2
,SG.AMT_CND_ADIT_AMT2
,SG.CNT_CND_USE_AT2
,SG.CNT_CND_ADIT_AMT2
,SG.DLVY_AREA_ADIT_AT2
,SG.AREA_ADIT_DLVY_AMT2
,SG.BUNDLE_DLVY_USE_AT2
,SG.BUNDLE_DLVY_CND_AMT2
,SG.RETURN_DLVY_APPLC_AT2
,SG.RETURN_DLVY_AMT2
,SG.EXCHNG_DLVY_AMT2
,SG.RTNLC_INNB ,SG.RTNLC_INNB
,SA.RTNLC_ZIP ,SG.RTNLC_INNB2
,SA.RTNLC_ADRES ,SA1.RTNLC_ZIP
,SA.RTNLC_DTL_ADRES ,SA1.RTNLC_ADRES
,SA.RTNLC_TELNB ,SA1.RTNLC_DTL_ADRES
,SA1.RTNLC_TELNB
,SA2.RTNLC_ZIP AS RTNLC_ZIP2
,SA2.RTNLC_ADRES AS RTNLC_ADRES2
,SA2.RTNLC_DTL_ADRES AS RTNLC_DTL_ADRES2
,SA2.RTNLC_TELNB AS RTNLC_TELNB2
,SG.RETURN_DLVY_AMT ,SG.RETURN_DLVY_AMT
,SG.EXCHNG_DLVY_AMT ,SG.EXCHNG_DLVY_AMT
FROM GC_SHIPPING_GROUPING SG FROM GC_SHIPPING_GROUPING SG
LEFT JOIN GC_SHIPPING_ADDRESS SA LEFT JOIN GC_SHIPPING_ADDRESS SA1
ON SG.RTNLC_INNB = SA.RTNLC_INNB ON SG.RTNLC_INNB = SA1.RTNLC_INNB
AND SG.SOPMAL_CD = SA.SOPMAL_CD AND SG.SOPMAL_CD = SA1.SOPMAL_CD
AND SG.USE_AT = 'Y' AND SG.USE_AT = 'Y'
AND SA.USE_AT = 'Y' AND SA1.USE_AT = 'Y'
LEFT JOIN GC_SHIPPING_ADDRESS SA2
ON SG.RTNLC_INNB2 = SA2.RTNLC_INNB
AND SG.SOPMAL_CD = SA2.SOPMAL_CD
AND SG.USE_AT = 'Y'
AND SA2.USE_AT = 'Y'
WHERE 1=1 WHERE 1=1
AND SG.SOPMAL_CD = #{sopmalCd} AND SG.SOPMAL_CD = #{sopmalCd}
AND DLVY_GROUP_INNB = #{dlvyGroupInnb} AND DLVY_GROUP_INNB = #{dlvyGroupInnb}
@@ -257,6 +343,18 @@
,RETURN_DLVY_APPLC_AT = #{returnDlvyApplcAt} ,RETURN_DLVY_APPLC_AT = #{returnDlvyApplcAt}
,RETURN_DLVY_AMT = #{returnDlvyAmt} ,RETURN_DLVY_AMT = #{returnDlvyAmt}
,EXCHNG_DLVY_AMT = #{exchngDlvyAmt} ,EXCHNG_DLVY_AMT = #{exchngDlvyAmt}
,DFT_DLVY_AMT2 = #{dftDlvyAmt2}
,AMT_CND_USE_AT2 = #{amtCndUseAt2}
,AMT_CND_ADIT_AMT2 = #{amtCndAditAmt2}
,CNT_CND_USE_AT2 = #{cntCndUseAt2}
,CNT_CND_ADIT_AMT2 = #{cntCndAditAmt2}
,DLVY_AREA_ADIT_AT2 = #{dlvyAreaAditAt2}
,AREA_ADIT_DLVY_AMT2 = #{areaAditDlvyAmt2}
,BUNDLE_DLVY_USE_AT2 = #{bundleDlvyUseAt2}
,BUNDLE_DLVY_CND_AMT2 = #{bundleDlvyCndAmt2}
,RETURN_DLVY_APPLC_AT2 = #{returnDlvyApplcAt2}
,RETURN_DLVY_AMT2 = #{returnDlvyAmt2}
,EXCHNG_DLVY_AMT2 = #{exchngDlvyAmt2}
,UPDUSR = #{updusr} ,UPDUSR = #{updusr}
,UPDT_DT = NOW() ,UPDT_DT = NOW()
]]> ]]>
@@ -278,11 +376,27 @@
AND SOPMAL_CD = #{sopmalCd} AND SOPMAL_CD = #{sopmalCd}
</update> </update>
<!-- 배송그룹 수정 -->
<update id="updateBODlvyGroupRtnlc2"
parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
UPDATE GC_SHIPPING_ADDRESS
SET RTNLC_ZIP = #{rtnlcZip2}
, RTNLC_ADRES = #{rtnlcAdres2}
, RTNLC_DTL_ADRES = #{rtnlcDtlAdres2}
, RTNLC_TELNB = #{rtnlcTelnb2}
, UPDUSR = #{updusr}
, UPDT_DT = NOW()
WHERE 1=1
AND RTNLC_INNB = #{rtnlcInnb2}
AND SOPMAL_CD = #{sopmalCd}
</update>
<!-- 배송그룹 삭제(사용여부 Update y > n) --> <!-- 배송그룹 삭제(사용여부 Update y > n) -->
<update id="deleteBODlvyGroup" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO"> <update id="deleteBODlvyGroup" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
<![CDATA[ <![CDATA[
UPDATE GC_SHIPPING_GROUPING UPDATE GC_SHIPPING_GROUPING
SET USE_AT = 'N' SET USE_AT = 'N'
, UPDT_DT = NOW()
]]> ]]>
<include refid="selectDlvyKeyWhere"/> <include refid="selectDlvyKeyWhere"/>
</update> </update>
@@ -291,10 +405,20 @@
<update id="deleteBODlvyGroupRtnlc" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO"> <update id="deleteBODlvyGroupRtnlc" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
UPDATE GC_SHIPPING_ADDRESS UPDATE GC_SHIPPING_ADDRESS
SET USE_AT = 'N' SET USE_AT = 'N'
, UPDT_DT = NOW()
WHERE RTNLC_INNB = #{rtnlcInnb} WHERE RTNLC_INNB = #{rtnlcInnb}
AND SOPMAL_CD = #{sopmalCd} AND SOPMAL_CD = #{sopmalCd}
</update> </update>
<!-- 배송그룹 삭제(사용여부 Update y > n) -->
<update id="deleteBODlvyGroupRtnlc2" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO">
UPDATE GC_SHIPPING_ADDRESS
SET USE_AT = 'N'
, UPDT_DT = NOW()
WHERE RTNLC_INNB = #{rtnlcInnb2}
AND SOPMAL_CD = #{sopmalCd}
</update>
<!-- 배송그룹 고유키로 연결 상품의 갯수 검색 --> <!-- 배송그룹 고유키로 연결 상품의 갯수 검색 -->
<select id="isIncludeGoods" <select id="isIncludeGoods"
parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO" parameterType="com.wb.domainserver.domain.gcone.setup.dlvygrp.vo.BODlvygrpVO"

View File

@@ -25,6 +25,14 @@ secured:
- /**/fonts/** - /**/fonts/**
- /favicon.ico - /favicon.ico
- /**/vender/** - /**/vender/**
batch:
accessip:
- 127.0.0.1
- 10.2.1.76
- 115.68.232.36
uri:
- /gcone/mbr/mbr/selectBOJoinGuidanceForm # 셈플로 넣음 사용하는 uri 설정해야함
#secured: #secured:

View File

@@ -105,6 +105,7 @@ const fn_move_dlvylc_manage_full = function (pageIndex, callback, formId = '') {
배송지 등록 팝업 호출 배송지 등록 팝업 호출
***********************************************/ ***********************************************/
const fn_move_dlvylc_regpage_pop = function (isPop, dftDlvylcAt) { const fn_move_dlvylc_regpage_pop = function (isPop, dftDlvylcAt) {
$("#dlvylcUpdate").remove();
$.ajax({ $.ajax({
type: 'post', type: 'post',
url: '/sopmal/mpage/mbr/selectDlvylcRegistForm', url: '/sopmal/mpage/mbr/selectDlvylcRegistForm',
@@ -369,8 +370,90 @@ const fn_update_dlvylc = function (pageIndex,msg,isMobile) {
jibunAddress: $(".lnbAdres").eq(index).val(), jibunAddress: $(".lnbAdres").eq(index).val(),
recpntNm: $(".recpntNmR").eq(index).val(), recpntNm: $(".recpntNmR").eq(index).val(),
dtlAdres: $(".dtlAdres").eq(index).val(), dtlAdres: $(".dtlAdres").eq(index).val(),
dlvylcAreaCd: $(".dlvylcAreaCd").eq(index).val(),
prefcd: $(".prefcd").eq(index).val(),
cstmclerCd: $(".cstmclerCd").eq(index).val(),
mbtlnb: $(".mbtlnb").eq(index).val(), mbtlnb: $(".mbtlnb").eq(index).val(),
extraAddress: extraAddress extraAddress: extraAddress
}, formId); }, formId);
fn_close_modal("dlvylcManage"); fn_close_modal("dlvylcManage");
} }
/**********************************************
배송지 관리 팝업 언어 설정
***********************************************/
const fn_toggle_langHeader = function () {
var id = $('[name=dlvylcAreaCd]:checked').attr('id');
$('.langKr, .langJp').hide();
$('.' + id).show();
if (id == 'langJp') {
$('#zip').prop('readonly', false);
$('#cstmclerCd').prop('disabled', true);
$('#prefcode').prop('disabled', false);
} else {
$('#zip').prop('readonly', true);
$('#cstmclerCd').prop('disabled', false);
$('#prefcode').prop('disabled', true);
$('#postcodeAlert').hide();
}
}
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function () {
$('#postcodeAlert').hide();
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#zip').val(),
dataType: 'jsonp',
success: function(data) {
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
let prefcode = result.prefcode;
$("#adres").val(adres);
$("#dtlAdres").val(dtlAdres);
$("#prefcode").val(prefcode);
$("#adresDv").val("01");
} else {
$('#postcodeAlert').show();
}
},
error: function (xhr, status, error) {
console.error('API 호출 실패:', error);
}
});
}
/**********************************************
배송지 관리 팝업 언어별 form 초기화
***********************************************/
let dlvylcFormPreValues = {};
const fn_clear_dlvylcForm = function () {
const tableInputs = $("#dlvylcFormTable").find("input[name]");
if (Object.keys(dlvylcFormPreValues).length == 0) {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
dlvylcFormPreValues[name] = input.val();
input.val("");
});
} else {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
const currentValue = input.val();
input.val(dlvylcFormPreValues[name] ?? "");
dlvylcFormPreValues[name] = currentValue;
});
}
}

View File

@@ -119,6 +119,7 @@ const fn_move_dlvylc_manage_pop_wrapper = function (pageIndex) {
배송지 등록 팝업 호출 ok 배송지 등록 팝업 호출 ok
***********************************************/ ***********************************************/
const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) { const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) {
$("#dlvylcUpdate").remove();
if (!mbrInnb) { if (!mbrInnb) {
mbrInnb = $("#leftMbrInnb").val(); mbrInnb = $("#leftMbrInnb").val();
} }
@@ -318,8 +319,91 @@ const fn_select_mngrOrdr_postcode = function (callback, index, formId = '') {
jibunAddress: $(".lnbAdres").eq(index).val(), jibunAddress: $(".lnbAdres").eq(index).val(),
recpntNm: $(".recpntNmR").eq(index).val(), recpntNm: $(".recpntNmR").eq(index).val(),
dtlAdres: $(".dtlAdres").eq(index).val(), dtlAdres: $(".dtlAdres").eq(index).val(),
dlvylcAreaCd: $(".dlvylcAreaCd").eq(index).val(),
prefcd: $(".prefcd").eq(index).val(),
cstmclerCd: $(".cstmclerCd").eq(index).val(),
mbtlnb: $(".dlvylcMbtlnb").eq(index).val(), mbtlnb: $(".dlvylcMbtlnb").eq(index).val(),
extraAddress: extraAddress extraAddress: extraAddress
}, formId); }, formId);
fn_close_modal("dlvylcManage"); fn_close_modal("dlvylcManage");
} }
/**********************************************
배송지 관리 팝업 언어 설정
***********************************************/
const fn_toggle_langHeader = function () {
var id = $('[name=dlvylcAreaCd]:checked').attr('id');
$('.langKr, .langJp').hide();
$('.' + id).show();
if (id == 'langJp') {
$('#zip').prop('readonly', false);
$('#cstmclerCd').prop('disabled', true);
$('#prefcode').prop('disabled', false);
} else {
$('#zip').prop('readonly', true);
$('#cstmclerCd').prop('disabled', false);
$('#prefcode').prop('disabled', true);
$('#postcodeAlert').hide();
}
}
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function () {
$('#postcodeAlert').hide();
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#zip').val()
+'&callback=' + 'fn_set_postcodeJp',
dataType: 'jsonp',
success: function(data) {
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
let prefcode = result.prefcode;
$("#adres").val(adres);
$("#dtlAdres").val(dtlAdres);
$("#prefcode").val(prefcode);
$("#adresDv").val("01");
} else {
$('#postcodeAlert').show();
}
},
error: function (xhr, status, error) {
console.error('API 호출 실패:', error);
}
});
}
/**********************************************
배송지 관리 팝업 언어별 form 초기화
***********************************************/
let dlvylcFormPreValues = {};
const fn_clear_dlvylcForm = function () {
const tableInputs = $("#dlvylcFormTable").find("input[name]");
if (Object.keys(dlvylcFormPreValues).length == 0) {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
dlvylcFormPreValues[name] = input.val();
input.val("");
});
} else {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
const currentValue = input.val();
input.val(dlvylcFormPreValues[name] ?? "");
dlvylcFormPreValues[name] = currentValue;
});
}
}

View File

@@ -9112,10 +9112,10 @@ main {
padding: 32px 32px; padding: 32px 32px;
} }
.subList__list__inner { .subList__list__inner {
width: 960px; width: 1080px;
margin-inline: auto; margin-inline: auto;
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 16px; gap: 16px;
} }
.subList__list__item { .subList__list__item {
@@ -14084,7 +14084,7 @@ main {
background-color: #ffffff; background-color: #ffffff;
overflow: hidden; overflow: hidden;
height: 44px; height: 44px;
padding-right: 16px; padding-right: 32px;
border: 1px solid #dee2e6; border: 1px solid #dee2e6;
border-radius: 4px; border-radius: 4px;
text-align: right; text-align: right;

View File

@@ -108,6 +108,7 @@ const fn_move_dlvylc_manage_pop = function (pageIndex, mbrInnb, mbrDvCd, callbac
배송지 등록 팝업 호출 ok 배송지 등록 팝업 호출 ok
***********************************************/ ***********************************************/
const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) { const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) {
$("#dlvylcUpdate").remove();
if (!mbrInnb) { if (!mbrInnb) {
mbrInnb = $("#leftMbrInnb").val(); mbrInnb = $("#leftMbrInnb").val();
} }
@@ -308,8 +309,91 @@ const fn_select_mngrOrdr_postcode = function (callback, index) {
jibunAddress: $(".lnbAdres").eq(index).val(), jibunAddress: $(".lnbAdres").eq(index).val(),
recpntNm: $(".recpntNmR").eq(index).val(), recpntNm: $(".recpntNmR").eq(index).val(),
dtlAdres: $(".dtlAdres").eq(index).val(), dtlAdres: $(".dtlAdres").eq(index).val(),
dlvylcAreaCd: $(".dlvylcAreaCd").eq(index).val(),
prefcd: $(".prefcd").eq(index).val(),
cstmclerCd: $(".cstmclerCd").eq(index).val(),
mbtlnb: $(".dlvylcMbtlnb").eq(index).val(), mbtlnb: $(".dlvylcMbtlnb").eq(index).val(),
extraAddress: extraAddress extraAddress: extraAddress
}); });
fn_close_modal("dlvylcManage"); fn_close_modal("dlvylcManage");
} }
/**********************************************
배송지 관리 팝업 언어 설정
***********************************************/
const fn_toggle_langHeader = function () {
var id = $('[name=dlvylcAreaCd]:checked').attr('id');
$('.langKr, .langJp').hide();
$('.' + id).show();
if (id == 'langJp') {
$('#zip').prop('readonly', false);
$('#cstmclerCd').prop('disabled', true);
$('#prefcode').prop('disabled', false);
} else {
$('#zip').prop('readonly', true);
$('#cstmclerCd').prop('disabled', false);
$('#prefcode').prop('disabled', true);
$('#postcodeAlert').hide();
}
}
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function () {
$('#postcodeAlert').hide();
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#zip').val()
+'&callback=' + 'fn_set_postcodeJp',
dataType: 'jsonp',
success: function(data) {
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
let prefcode = result.prefcode;
$("#adres").val(adres);
$("#dtlAdres").val(dtlAdres);
$("#prefcode").val(prefcode);
$("#adresDv").val("01");
} else {
$('#postcodeAlert').show();
}
},
error: function (xhr, status, error) {
console.error('API 호출 실패:', error);
}
});
}
/**********************************************
배송지 관리 팝업 언어별 form 초기화
***********************************************/
let dlvylcFormPreValues = {};
const fn_clear_dlvylcForm = function () {
const tableInputs = $("#dlvylcFormTable").find("input[name]");
if (Object.keys(dlvylcFormPreValues).length == 0) {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
dlvylcFormPreValues[name] = input.val();
input.val("");
});
} else {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
const currentValue = input.val();
input.val(dlvylcFormPreValues[name] ?? "");
dlvylcFormPreValues[name] = currentValue;
});
}
}

View File

@@ -119,6 +119,7 @@ const fn_move_dlvylc_manage_pop_wrapper = function (pageIndex) {
배송지 등록 팝업 호출 ok 배송지 등록 팝업 호출 ok
***********************************************/ ***********************************************/
const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) { const fn_move_dlvylc_regpage_pop = function (isPop, mbrInnb, mbrDvCd, dftDlvylcAt) {
$("#dlvylcUpdate").remove();
if (!mbrInnb) { if (!mbrInnb) {
mbrInnb = $("#leftMbrInnb").val(); mbrInnb = $("#leftMbrInnb").val();
} }
@@ -318,8 +319,91 @@ const fn_select_mngrOrdr_postcode = function (callback, index, formId = '') {
jibunAddress: $(".lnbAdres").eq(index).val(), jibunAddress: $(".lnbAdres").eq(index).val(),
recpntNm: $(".recpntNmR").eq(index).val(), recpntNm: $(".recpntNmR").eq(index).val(),
dtlAdres: $(".dtlAdres").eq(index).val(), dtlAdres: $(".dtlAdres").eq(index).val(),
dlvylcAreaCd: $(".dlvylcAreaCd").eq(index).val(),
prefcd: $(".prefcd").eq(index).val(),
cstmclerCd: $(".cstmclerCd").eq(index).val(),
mbtlnb: $(".dlvylcMbtlnb").eq(index).val(), mbtlnb: $(".dlvylcMbtlnb").eq(index).val(),
extraAddress: extraAddress extraAddress: extraAddress
}, formId); }, formId);
fn_close_modal("dlvylcManage"); fn_close_modal("dlvylcManage");
} }
/**********************************************
배송지 관리 팝업 언어 설정
***********************************************/
const fn_toggle_langHeader = function () {
var id = $('[name=dlvylcAreaCd]:checked').attr('id');
$('.langKr, .langJp').hide();
$('.' + id).show();
if (id == 'langJp') {
$('#zip').prop('readonly', false);
$('#cstmclerCd').prop('disabled', true);
$('#prefcode').prop('disabled', false);
} else {
$('#zip').prop('readonly', true);
$('#cstmclerCd').prop('disabled', false);
$('#prefcode').prop('disabled', true);
$('#postcodeAlert').hide();
}
}
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function () {
$('#postcodeAlert').hide();
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#zip').val()
+'&callback=' + 'fn_set_postcodeJp',
dataType: 'jsonp',
success: function(data) {
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
let prefcode = result.prefcode;
$("#adres").val(adres);
$("#dtlAdres").val(dtlAdres);
$("#prefcode").val(prefcode);
$("#adresDv").val("01");
} else {
$('#postcodeAlert').show();
}
},
error: function (xhr, status, error) {
console.error('API 호출 실패:', error);
}
});
}
/**********************************************
배송지 관리 팝업 언어별 form 초기화
***********************************************/
let dlvylcFormPreValues = {};
const fn_clear_dlvylcForm = function () {
const tableInputs = $("#dlvylcFormTable").find("input[name]");
if (Object.keys(dlvylcFormPreValues).length == 0) {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
dlvylcFormPreValues[name] = input.val();
input.val("");
});
} else {
tableInputs.each(function () {
const input = $(this);
const name = input.attr("name");
const currentValue = input.val();
input.val(dlvylcFormPreValues[name] ?? "");
dlvylcFormPreValues[name] = currentValue;
});
}
}

View File

@@ -9142,10 +9142,10 @@ main {
padding: 32px 32px; padding: 32px 32px;
} }
.subList__list__inner { .subList__list__inner {
width: 960px; width: 1080px;
margin-inline: auto; margin-inline: auto;
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 16px; gap: 16px;
} }
.subList__list__item { .subList__list__item {
@@ -14175,7 +14175,7 @@ main {
background-color: #ffffff; background-color: #ffffff;
overflow: hidden; overflow: hidden;
height: 44px; height: 44px;
padding-right: 16px; padding-right: 35px;
border: 1px solid #dee2e6; border: 1px solid #dee2e6;
border-radius: 4px; border-radius: 4px;
text-align: right; text-align: right;

View File

@@ -9112,10 +9112,10 @@ main {
padding: 32px 32px; padding: 32px 32px;
} }
.subList__list__inner { .subList__list__inner {
width: 960px; width: 1080px;
margin-inline: auto; margin-inline: auto;
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 16px; gap: 16px;
} }
.subList__list__item { .subList__list__item {
@@ -14083,7 +14083,7 @@ main {
background-color: #ffffff; background-color: #ffffff;
overflow: hidden; overflow: hidden;
height: 44px; height: 44px;
padding-right: 16px; padding-right: 35px;
border: 1px solid #dee2e6; border: 1px solid #dee2e6;
border-radius: 4px; border-radius: 4px;
text-align: right; text-align: right;

View File

@@ -37,6 +37,7 @@
fn_create_ckeditor('#joinGuidanceWords', sopmalCd); fn_create_ckeditor('#joinGuidanceWords', sopmalCd);
fn_create_ckeditor('#joinBnef', sopmalCd); fn_create_ckeditor('#joinBnef', sopmalCd);
fn_create_ckeditor('#joinComptWords', sopmalCd); fn_create_ckeditor('#joinComptWords', sopmalCd);
fn_create_ckeditor('#subsvcGuidanceWords', sopmalCd);
$("#kakaoIntrlckAt-Y").on("change", function () { $("#kakaoIntrlckAt-Y").on("change", function () {
if ($(this).is(":checked")) { if ($(this).is(":checked")) {
@@ -159,6 +160,24 @@
} }
} }
}); });
// 환율 입력 (숫자와 소숫점. 2자리수까지 허용)
$("#buyRate, #sellRate").on("input", function () {
let value = $(this).val();
value = value.replace(/[^0-9.]/g, "");
const dotCount = (value.match(/\./g) || []).length;
if (dotCount > 1) {
value = value.substring(0, value.lastIndexOf("."));
}
const parts = value.split(".");
if (parts[1] && parts[1].length > 2) {
value = parts[0] + "." + parts[1].slice(0, 2);
}
$(this).val(value);
});
}); });
isChkd_Dup = false; isChkd_Dup = false;
@@ -481,6 +500,7 @@
regForm.find("#joinGuidanceWords").val(fn_get_editor_data('#joinGuidanceWords')); regForm.find("#joinGuidanceWords").val(fn_get_editor_data('#joinGuidanceWords'));
regForm.find("#joinBnef").val(fn_get_editor_data('#joinBnef')); regForm.find("#joinBnef").val(fn_get_editor_data('#joinBnef'));
regForm.find("#joinComptWords").val(fn_get_editor_data('#joinComptWords')); regForm.find("#joinComptWords").val(fn_get_editor_data('#joinComptWords'));
regForm.find("#subsvcGuidanceWords").val(fn_get_editor_data('#subsvcGuidanceWords'));
let params = regForm.serialize(); let params = regForm.serialize();
if (isChkd_Dup) { if (isChkd_Dup) {
@@ -1511,6 +1531,26 @@
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<th>환율(살때) 일본 1円(엔)기준</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right number" name="buyRate" id="buyRate" title="1엔 환율(살때)">
<span class="input-unit-text">원</span>
</div>
</div>
</td>
<th>환율(팔때) 일본 1円(엔)기준</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right number" name="sellRate" id="sellRate" title="1엔 환율(팔때)">
<span class="input-unit-text">원</span>
</div>
</div>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -1956,7 +1996,17 @@
<td colspan="3"> <td colspan="3">
<div class="td-inner"> <div class="td-inner">
<textarea class="textarea" id="joinComptWords" name="joinComptWords" <textarea class="textarea" id="joinComptWords" name="joinComptWords"
title="회원가입 주요혜택" rows="2"> title="회원가입 완료문구" rows="2">
</textarea>
</div>
</td>
</tr>
<tr>
<th>구독서비스 안내문구</th>
<td colspan="3">
<div class="td-inner">
<textarea class="textarea" id="subsvcGuidanceWords" name="subsvcGuidanceWords"
title="구독서비스 안내문구" rows="2">
</textarea> </textarea>
</div> </div>
</td> </td>

View File

@@ -51,6 +51,7 @@
fn_create_ckeditor('#joinGuidanceWords', sopmalCd); fn_create_ckeditor('#joinGuidanceWords', sopmalCd);
fn_create_ckeditor('#joinBnef', sopmalCd); fn_create_ckeditor('#joinBnef', sopmalCd);
fn_create_ckeditor('#joinComptWords', sopmalCd); fn_create_ckeditor('#joinComptWords', sopmalCd);
fn_create_ckeditor('#subsvcGuidanceWords', sopmalCd);
// fn_get_join_info(); // fn_get_join_info();
@@ -195,6 +196,24 @@
} }
} }
}); });
// 환율 입력 (숫자와 소숫점. 2자리수까지 허용)
$("#buyRate, #sellRate").on("input", function () {
let value = $(this).val();
value = value.replace(/[^0-9.]/g, "");
const dotCount = (value.match(/\./g) || []).length;
if (dotCount > 1) {
value = value.substring(0, value.lastIndexOf("."));
}
const parts = value.split(".");
if (parts[1] && parts[1].length > 2) {
value = parts[0] + "." + parts[1].slice(0, 2);
}
$(this).val(value);
});
}); });
const fn_get_join_info = function() { const fn_get_join_info = function() {
@@ -210,6 +229,7 @@
fn_set_editor_data("#joinGuidanceWords", resultJson.joinInfo.joinGuidanceWords); fn_set_editor_data("#joinGuidanceWords", resultJson.joinInfo.joinGuidanceWords);
fn_set_editor_data("#joinBnef", resultJson.joinInfo.joinBnef); fn_set_editor_data("#joinBnef", resultJson.joinInfo.joinBnef);
fn_set_editor_data("#joinComptWords", resultJson.joinInfo.joinComptWords); fn_set_editor_data("#joinComptWords", resultJson.joinInfo.joinComptWords);
fn_set_editor_data("#subsvcGuidanceWords", resultJson.joinInfo.subsvcGuidanceWords);
} }
}) })
} }
@@ -679,6 +699,7 @@
updForm.find("#joinGuidanceWords").val(fn_get_editor_data('#joinGuidanceWords')); updForm.find("#joinGuidanceWords").val(fn_get_editor_data('#joinGuidanceWords'));
updForm.find("#joinBnef").val(fn_get_editor_data('#joinBnef')); updForm.find("#joinBnef").val(fn_get_editor_data('#joinBnef'));
updForm.find("#joinComptWords").val(fn_get_editor_data('#joinComptWords')); updForm.find("#joinComptWords").val(fn_get_editor_data('#joinComptWords'));
updForm.find("#subsvcGuidanceWords").val(fn_get_editor_data('#subsvcGuidanceWords'));
let params = updForm.serialize(); let params = updForm.serialize();
if (fn_check_selectStplatBox() > 0) { if (fn_check_selectStplatBox() > 0) {
@@ -1649,7 +1670,26 @@
<input type="text" class="input-text sm right number" name="ordrAtmcPurchsDcsnPd" id="ordrAt" title="자동 구매 확정기간" maxlength="3" value="${resultMap.sopmalDetailList[0].ordrAtmcPurchsDcsnPd }" ${ordrAtmcPurchsDcsnPdDisabled }> <input type="text" class="input-text sm right number" name="ordrAtmcPurchsDcsnPd" id="ordrAt" title="자동 구매 확정기간" maxlength="3" value="${resultMap.sopmalDetailList[0].ordrAtmcPurchsDcsnPd }" ${ordrAtmcPurchsDcsnPdDisabled }>
<span class="input-unit-text">일</span> <span class="input-unit-text">일</span>
</div> </div>
<span class="gray-7">(출고 완료, 배송중, 배송 완료 후 해당기간 경과 시 자동 구매 확정)</span> </div>
</td>
</tr>
<tr>
<th>환율(살때) 일본 1円(엔)기준</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right" name="buyRate" id="buyRate" title="1엔 환율(살때)" value="${resultMap.sopmalDetailList[0].buyRate }">
<span class="input-unit-text">원</span>
</div>
</div>
</td>
<th>환율(팔때) 일본 1円(엔)기준</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right" name="sellRate" id="sellRate" title="1엔 환율(팔때)" value="${resultMap.sopmalDetailList[0].sellRate }">
<span class="input-unit-text">원</span>
</div>
</div> </div>
</td> </td>
</tr> </tr>
@@ -2171,12 +2211,23 @@
<td colspan="3"> <td colspan="3">
<div class="td-inner"> <div class="td-inner">
<textarea class="textarea" id="joinComptWords" name="joinComptWords" <textarea class="textarea" id="joinComptWords" name="joinComptWords"
title="회원가입 주요혜택" rows="2"> title="회원가입 완료문구" rows="2">
${resultMap.sopmalDetailList[0].joinComptWords } ${resultMap.sopmalDetailList[0].joinComptWords }
</textarea> </textarea>
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<th>구독서비스 안내문구</th>
<td colspan="3">
<div class="td-inner">
<textarea class="textarea" id="subsvcGuidanceWords" name="subsvcGuidanceWords"
title="구독서비스 안내문구" rows="2">
${resultMap.sopmalDetailList[0].subsvcGuidanceWords }
</textarea>
</div>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -159,38 +159,46 @@
</div> </div>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<span class="footer-body__text01"> <div style="background-color: mistyrose; text-align: center">
사업자명 : <c:out value="${operBsnmInfo.bsnmNm}"/> <span class="footer-body__text01" style="color: red;">
</span> 술은 만 20세부터, 미성년자의 음주는 법률로 금지되어 있습니다. 만 20세 미만의 분에게는 술을 판매하지 않습니다.<br>
お酒は20歳から、未成年者の飲酒は法律で禁止されています。満20歳未満の方にはお酒を販売していません。
</span>
</div>
<%-- <span class="footer-body__text01">--%>
<%-- 사업자명 : <c:out value="${operBsnmInfo.bsnmNm}"/>--%>
<%-- </span>--%>
<p class="footer-body__text02"> <p class="footer-body__text02">
대표자 : <c:out value="${operBsnmInfo.reprsntvnm}"/> &nbsp; [상호명] <b><c:out value="${operBsnmInfo.bsnmNm}"/> &nbsp;</b>
주소: [주소]
<c:choose> <b>
<c:when test="${not empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}"> <c:choose>
<c:out value="${operBsnmInfo.lnbAdres}"/> <c:when test="${not empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}">
</c:when> <c:out value="${operBsnmInfo.lnbAdres}"/>
<c:when test="${empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}"> </c:when>
<c:out value="${operBsnmInfo.lnbAdres}"/> <c:when test="${empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}">
</c:when> <c:out value="${operBsnmInfo.lnbAdres}"/>
<c:when test="${not empty operBsnmInfo.rnmAdres && empty operBsnmInfo.lnbAdres}"> </c:when>
<c:out value="${operBsnmInfo.rnmAdres}"/> <c:when test="${not empty operBsnmInfo.rnmAdres && empty operBsnmInfo.lnbAdres}">
</c:when> <c:out value="${operBsnmInfo.rnmAdres}"/>
</c:choose> </c:when>
<c:out value="${operBsnmInfo.dtlAdres}"/> &nbsp; </c:choose>
대표전화 : <c:out value="${sopmalInfo.reprsntTelnb}"/> &nbsp; <c:out value="${operBsnmInfo.dtlAdres}"/> &nbsp;
대표이메일 : </b>
<%-- 대표전화 : <c:out value="${sopmalInfo.reprsntTelnb}"/> &nbsp;--%>
[대표이메일]
<a href="mailto:<c:out value='${sopmalInfo.reprsntEmail}'/>"> <a href="mailto:<c:out value='${sopmalInfo.reprsntEmail}'/>">
<c:out value="${sopmalInfo.reprsntEmail}"/> <c:out value="${sopmalInfo.reprsntEmail}"/>
</a> </a>
<br/> <%-- <br/>--%>
개인정보관리책임자 : <c:out value="${operBsnmInfo.indvdlinfoPrtcRspnberNm}"/> &nbsp; <%-- 개인정보관리책임자 : <c:out value="${operBsnmInfo.indvdlinfoPrtcRspnberNm}"/> &nbsp;--%>
사업자 등록번호: <c:out value="${operBsnmInfo.bizrnb}"/> <%-- 사업자 등록번호: <c:out value="${operBsnmInfo.bizrnb}"/>--%>
<a href="javascript:;" onclick="window.open('https://www.ftc.go.kr/bizCommPop.do?wrkr_no=<c:out value='${operBsnmInfo.replaceBizrnb}'/>','communicationViewPopup','width=750,height=700,scrollbars=yes')"> <%-- <a href="javascript:;" onclick="window.open('https://www.ftc.go.kr/bizCommPop.do?wrkr_no=<c:out value='${operBsnmInfo.replaceBizrnb}'/>','communicationViewPopup','width=750,height=700,scrollbars=yes')">--%>
[사업자정보확인] <%-- [사업자정보확인]--%>
</a> &nbsp; <%-- </a> &nbsp;--%>
통신판매업 신고번호 : <c:out value="${sleBsnmInfo.mobDclNb}"/> <%-- 통신판매업 신고번호 : <c:out value="${sleBsnmInfo.mobDclNb}"/>--%>
</p> </p>
<p class="footer-body__text03"> <p class="footer-body__text03 text-center">
Copyright ⓒ<c:out value="${sleBsnmInfo.bsnmNm}"/> All rights reserved. Copyright ⓒ<c:out value="${sleBsnmInfo.bsnmNm}"/> All rights reserved.
</p> </p>
<div class="footer-image-container"> <div class="footer-image-container">

View File

@@ -22,6 +22,10 @@
</c:forEach> </c:forEach>
</c:if> </c:if>
</ul> </ul>
<div class="footer__second" style="color: red;">
술은 만 20세부터, 미성년자의 음주는 법률로 금지되어 있습니다. 만 20세 미만의 분에게는 술을 판매하지 않습니다.<br>
お酒は20歳から、未成年者の飲酒は法律で禁止されています。満20歳未満の方にはお酒を販売していません。
</div>
<div class="footer__second"> <div class="footer__second">
<button type="button" class="footer__second__detailBtn">사업자 정보 확인</button> <button type="button" class="footer__second__detailBtn">사업자 정보 확인</button>
<c:if test = "${not empty footerInfo.footerInfo.familySite}"> <c:if test = "${not empty footerInfo.footerInfo.familySite}">
@@ -117,12 +121,12 @@
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<li> <li>
<span class="footer__third__th">사업자명</span> <span class="footer__third__th">상호명</span>
<span class="footer__third__td"> <span class="footer__third__td">
<c:out value="${operBsnmInfo.bsnmNm}"/> <c:out value="${operBsnmInfo.bsnmNm}"/>
</span> </span>
</li> </li>
<li><span class="footer__third__th">대표자</span><span class="footer__third__td"><c:out value="${operBsnmInfo.reprsntvnm}"/></span></li> <%-- <li><span class="footer__third__th">대표자</span><span class="footer__third__td"><c:out value="${operBsnmInfo.reprsntvnm}"/></span></li>--%>
<li><span class="footer__third__th">주소</span><span class="footer__third__td"> <li><span class="footer__third__th">주소</span><span class="footer__third__td">
<c:choose> <c:choose>
<c:when test = "${not empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}"> <c:when test = "${not empty operBsnmInfo.rnmAdres && not empty operBsnmInfo.lnbAdres}">
@@ -135,21 +139,21 @@
<c:out value="${operBsnmInfo.rnmAdres}"/> <c:out value="${operBsnmInfo.rnmAdres}"/>
</c:when> </c:when>
</c:choose> <c:out value="${operBsnmInfo.dtlAdres}"/></span></li> </c:choose> <c:out value="${operBsnmInfo.dtlAdres}"/></span></li>
<li><span class="footer__third__th">대표전화</span><span class="footer__third__td"><c:out value="${sopmalInfo.reprsntTelnb}"/></span> <%-- <li><span class="footer__third__th">대표전화</span><span class="footer__third__td"><c:out value="${sopmalInfo.reprsntTelnb}"/></span>--%>
</li> <%-- </li>--%>
<li><span class="footer__third__th">대표이메일</span> <li><span class="footer__third__th">대표이메일</span>
<a href="mailto:<c:out value='${sopmalInfo.reprsntEmail}'/>" class="footer__third__td"><strong><c:out value="${sopmalInfo.reprsntEmail}"/></strong></a> <a href="mailto:<c:out value='${sopmalInfo.reprsntEmail}'/>" class="footer__third__td"><strong><c:out value="${sopmalInfo.reprsntEmail}"/></strong></a>
</li> </li>
<li><span class="footer__third__th">사업자 등록번호</span><span <%-- <li><span class="footer__third__th">사업자 등록번호</span><span--%>
class="footer__third__td"><c:out value="${operBsnmInfo.bizrnb}"/></span> <%-- class="footer__third__td"><c:out value="${operBsnmInfo.bizrnb}"/></span>--%>
<a href="javascript:;" onclick="window.open('https://www.ftc.go.kr/bizCommPop.do?wrkr_no=<c:out value="${operBsnmInfo.replaceBizrnb}"/>','communicationViewPopup','width=750,height=700,scrollbars=yes')" class="footer__underLine">사업자정보확인</a> <%-- <a href="javascript:;" onclick="window.open('https://www.ftc.go.kr/bizCommPop.do?wrkr_no=<c:out value="${operBsnmInfo.replaceBizrnb}"/>','communicationViewPopup','width=750,height=700,scrollbars=yes')" class="footer__underLine">사업자정보확인</a>--%>
</li> <%-- </li>--%>
<li><span class="footer__third__th">개인정보관리책임자</span><span class="footer__third__td"><c:out value="${operBsnmInfo.indvdlinfoPrtcRspnberNm}"/></span> <%-- <li><span class="footer__third__th">개인정보관리책임자</span><span class="footer__third__td"><c:out value="${operBsnmInfo.indvdlinfoPrtcRspnberNm}"/></span>--%>
</li> <%-- </li>--%>
<li><span class="footer__third__th">통신판매업 신고번호</span><span class="footer__third__td"><c:out value="${sleBsnmInfo.mobDclNb}"/></span></li> <%-- <li><span class="footer__third__th">통신판매업 신고번호</span><span class="footer__third__td"><c:out value="${sleBsnmInfo.mobDclNb}"/></span></li>--%>
</ul> </ul>
<div class="footer__logo"> <%-- <div class="footer__logo">--%>
</div> <%-- </div>--%>
<p class="footer__copyright">ⓒ<c:out value="${sleBsnmInfo.bsnmNm}"/> All rights reserved.</p> <p class="footer__copyright">ⓒ<c:out value="${sleBsnmInfo.bsnmNm}"/> All rights reserved.</p>
<%--로딩이미지--%> <%--로딩이미지--%>
<img src="/mobile/images/loading.svg" style = "display:none" class = "loadingImg"> <img src="/mobile/images/loading.svg" style = "display:none" class = "loadingImg">

View File

@@ -887,7 +887,7 @@
<c:choose> <c:choose>
<c:when test="${isAuthenticated}"><%--회원일시--%> <c:when test="${isAuthenticated}"><%--회원일시--%>
<a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="textBtns__btn">마이페이지</a> <a href="/sopmal/mpage/mbr/selectMpageMainInqire" class="textBtns__btn">마이페이지</a>
<a href="/logout" class="textBtns__btn">로그아웃</a> <a href="/sopmal/logout" class="textBtns__btn">로그아웃</a>
</c:when> </c:when>
<c:otherwise><%--비회원일시--%> <c:otherwise><%--비회원일시--%>
<a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="textBtns__btn">주문조회</a> <a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="textBtns__btn">주문조회</a>

View File

@@ -79,6 +79,7 @@
</p> </p>
</div> </div>
</a> </a>
<%--
<a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="member-rank-summary__summary-item"> <a href="/sopmal/mpage/ordr/selectMbrOrdrListInqire" class="member-rank-summary__summary-item">
<img src="/pc/images/icon_member-rank-delivery.png" alt=""> <img src="/pc/images/icon_member-rank-delivery.png" alt="">
<div class="member-rank-summary__summary-description"> <div class="member-rank-summary__summary-description">
@@ -89,6 +90,7 @@
</p> </p>
</div> </div>
</a> </a>
--%>
</div> </div>
<c:if test="${sopmallInfo.shopInfo.cashAt eq 'N'}"> <%--충전형마일리지 사용야부에 따라 화면 위치 다름--%> <c:if test="${sopmallInfo.shopInfo.cashAt eq 'N'}"> <%--충전형마일리지 사용야부에 따라 화면 위치 다름--%>
<div class="member-rank-summary__summary-info"> <div class="member-rank-summary__summary-info">

View File

@@ -9,12 +9,12 @@
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/> <spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko"> <html lang="ko">
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<c:choose> <c:choose>
<c:when test = "${empty prevewVO.mainSiteInnb && prevewVO.evtPageAt ne 'Y'}"> <%--이벤트게시글 아님--%> <c:when test = "${empty prevewVO.mainSiteInnb && prevewVO.evtPageAt ne 'Y'}"> <%--이벤트게시글 아님--%>
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<body> <body>
<%-- 공통 Header --%> <%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/> <jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
@@ -1271,13 +1271,13 @@
</div> </div>
</c:if> </c:if>
</div> </div>
<div class="quick-menu__customer-service"> <%-- <div class="quick-menu__customer-service">--%>
<i class="icon icon_quick-customer-service"></i> <%-- <i class="icon icon_quick-customer-service"></i>--%>
<span class="visually-hidden">고객센터</span> <%-- <span class="visually-hidden">고객센터</span>--%>
<span class="quick-menu__customer-service__num"> <%-- <span class="quick-menu__customer-service__num">--%>
${ fn:replace(resultMap.operAt.cscTelnb, '-', '<br>') } <%-- ${ fn:replace(resultMap.operAt.cscTelnb, '-', '<br>') }--%>
</span> <%-- </span>--%>
</div> <%-- </div>--%>
<div class="quick-menu__to-top"> <div class="quick-menu__to-top">
<button><i class="icon icon_quick-to-top"></i><span class="visually-hidden">위로 <button><i class="icon icon_quick-to-top"></i><span class="visually-hidden">위로
가기</span></button> 가기</span></button>

View File

@@ -228,6 +228,10 @@
<a class="login__misc__link" href="${accessUrl}/sopmal/mbr/selectIdPasswordSearch">아이디/비밀번호 찾기</a> <a class="login__misc__link" href="${accessUrl}/sopmal/mbr/selectIdPasswordSearch">아이디/비밀번호 찾기</a>
</div> </div>
</form> </form>
<div class="login__signIn">
<p class="login__signIn__text">아직 <span>${shopInfo.sopmalNm}</span> 회원이 아니세요?</p>
<a class="login__signIn__link" href="${accessUrl}${'/sopmal/mbr/selectJoinGuidance'}">회원가입</a>
</div>
<div class="login__sns"> <div class="login__sns">
<c:if test="${shopInfo.kakaoIntrlckAt == 'Y'}"> <c:if test="${shopInfo.kakaoIntrlckAt == 'Y'}">
<button type="button" class="login__sns__btn kakao" onclick="openSocialLoginPopup('kakao')"><i class="icon icon_kakaoLogin"></i>카카오 <button type="button" class="login__sns__btn kakao" onclick="openSocialLoginPopup('kakao')"><i class="icon icon_kakaoLogin"></i>카카오
@@ -509,7 +513,15 @@
}) })
.then(data => { .then(data => {
console.log('Login successful', data); console.log('Login successful', data);
let moveTo = new URL(redirectUri).pathname; let moveTo = "";
try{
moveTo = new URL(redirectUri).pathname;
}catch(e){
if(redirectUri.startsWith("/",0)){
domain = window.location.href.split("/")[0];
moveTo = new URL(domain+redirectUri).pathname;
}
}
if (!fn_is_empty(moveTo) && !moveTo.includes('/login') && moveTo !=='/') { if (!fn_is_empty(moveTo) && !moveTo.includes('/login') && moveTo !=='/') {
window.location.href = redirectUri; window.location.href = redirectUri;

View File

@@ -387,10 +387,15 @@
}) })
.then(data => { .then(data => {
console.log('Login successful', data); console.log('Login successful', data);
let moveTo = new URL(redirectUri).pathname; let moveTo = "";
console.log('move', moveTo); try{
console.log('data.url', data.url); moveTo = new URL(redirectUri).pathname;
}catch(e){
if(redirectUri.startsWith("/",0)){
domain = window.location.href.split("/")[0];
moveTo = new URL(domain+redirectUri).pathname;
}
}
if (!fn_is_empty(moveTo) && !moveTo.includes('/login') && moveTo !=='/') { if (!fn_is_empty(moveTo) && !moveTo.includes('/login') && moveTo !=='/') {
window.location.href = redirectUri; window.location.href = redirectUri;
} else { } else {

View File

@@ -2671,14 +2671,14 @@
<caption>판매정보</caption> <caption>판매정보</caption>
<colgroup> <colgroup>
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col style="width: 38%;">
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col style="width: 38%;">
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>
<th>판매 상태</th> <th>판매 상태</th>
<td colspan="2"> <td colspan="4">
<div class="td-inner"> <div class="td-inner">
<div class="custom-radio-container"> <div class="custom-radio-container">
<c:forEach items="${resultMap.goodsDftinfoSttusList}" var="goodsDftinfoSttus" varStatus="status"> <c:forEach items="${resultMap.goodsDftinfoSttusList}" var="goodsDftinfoSttus" varStatus="status">

View File

@@ -2843,9 +2843,9 @@
<caption>판매정보</caption> <caption>판매정보</caption>
<colgroup> <colgroup>
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col style="width: 38%;">
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col style="width: 38%;">
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>

View File

@@ -2977,6 +2977,7 @@
<spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/> <spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/> <spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/> <spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
<input type="hidden" id="cdnurl" value="${cdnurl}"/> <input type="hidden" id="cdnurl" value="${cdnurl}"/>
<section id="section01" class="content-section content-scroll-detect content-fold"> <section id="section01" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header"> <div class="content-fold__header">
@@ -5071,7 +5072,7 @@
</div> </div>
<div class="product-group__description"> <div class="product-group__description">
<p><c:out value="${goodsInfo.goodsNm}"/></p> <p><c:out value="${goodsInfo.goodsNm}"/></p>
<p class="product-group__description-price"><fmt:formatNumber value="${goodsInfo.slepric}" pattern="#,###"/>원</p> <p class="product-group__description-price"><fmt:formatNumber value="${goodsInfo.slepric}" pattern="#,###"/>${curUnit}</p>
</div> </div>
</div> </div>
</c:forEach> </c:forEach>

View File

@@ -23,6 +23,8 @@
$('#appendList tr').each(function() { $('#appendList tr').each(function() {
const goodsId = $(this).attr('id').replace('choiseListId', ''); const goodsId = $(this).attr('id').replace('choiseListId', '');
const goodsOptnInnb = $(this).find('input[name="goodsOptnInnb"]').val();
const optnTy = $(this).find('input[name="optnTy"]').val();
const goodsImg = $(this).find('input[name="goodsImgCours"]').val(); const goodsImg = $(this).find('input[name="goodsImgCours"]').val();
const goodsNm = $(this).find('input[name="goodsNm"]').val(); const goodsNm = $(this).find('input[name="goodsNm"]').val();
const goodsPrice = $(this).find('input[name="slepric"]').val(); const goodsPrice = $(this).find('input[name="slepric"]').val();
@@ -32,6 +34,8 @@
if (goodsId) { if (goodsId) {
selectedGoods.push({ selectedGoods.push({
goodsId: goodsId, goodsId: goodsId,
goodsOptnInnb: goodsOptnInnb,
optnTy: optnTy,
goodsImg: goodsImg, goodsImg: goodsImg,
goodsNm: goodsNm, goodsNm: goodsNm,
goodsPrice: goodsPrice, goodsPrice: goodsPrice,
@@ -46,6 +50,8 @@
var copyTr = $(this).clone(); var copyTr = $(this).clone();
var goodsId = $(this).find('input[name="goodsInnb"]').val(); var goodsId = $(this).find('input[name="goodsInnb"]').val();
var goodsOptnInnb = $(this).find('input[name="goodsOptnInnb"]').val();
var optnTy = $(this).find('input[name="optnTy"]').val();
var goodsImg = $(this).find('input[name="goodsImgCours"]').val(); var goodsImg = $(this).find('input[name="goodsImgCours"]').val();
var goodsNm = $(this).find('input[name="goodsNm"]').val(); var goodsNm = $(this).find('input[name="goodsNm"]').val();
var goodsPrice = $(this).find('input[name="slepric"]').val(); var goodsPrice = $(this).find('input[name="slepric"]').val();
@@ -75,6 +81,8 @@
selectedGoods.push({ selectedGoods.push({
goodsId: goodsId, goodsId: goodsId,
goodsOptnInnb: goodsOptnInnb,
optnTy: optnTy,
goodsImg: goodsImg, goodsImg: goodsImg,
goodsNm: goodsNm, goodsNm: goodsNm,
goodsPrice: goodsPrice, goodsPrice: goodsPrice,
@@ -151,6 +159,8 @@
<tr class="searchList"> <tr class="searchList">
<td class="text-left"> <td class="text-left">
<input type="hidden" id="goodsInnb" name="goodsInnb" value="<c:out value="${ list.goodsInnb }"/>"/> <input type="hidden" id="goodsInnb" name="goodsInnb" value="<c:out value="${ list.goodsInnb }"/>"/>
<input type="hidden" id="goodsOptnInnb" name="goodsOptnInnb" value="<c:out value="${ list.goodsOptnInnb }"/>"/>
<input type="hidden" id="optnTy" name="optnTy" value="<c:out value="${ list.optnTy }"/>"/>
<input type="hidden" id="goodsImgCours" name="goodsImgCours" value="<c:out value="${cdnurl}${ list.goodsImgCours }"/>"/> <input type="hidden" id="goodsImgCours" name="goodsImgCours" value="<c:out value="${cdnurl}${ list.goodsImgCours }"/>"/>
<input type="hidden" id="goodsNm" name="goodsNm" value="<c:out value="${ list.goodsNm }"/>"/> <input type="hidden" id="goodsNm" name="goodsNm" value="<c:out value="${ list.goodsNm }"/>"/>
<input type="hidden" id="slepric" name="slepric" value="<fmt:parseNumber value="${ list.slepric }"/>"/> <input type="hidden" id="slepric" name="slepric" value="<fmt:parseNumber value="${ list.slepric }"/>"/>

View File

@@ -0,0 +1,877 @@
<%@ 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 : SubsvcU.jsp
Description : 구독서비스 상세
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-01-27 jazz 최초생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%-- 공통 include --%>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
</head>
<script>
$(document).ready(function () {
//페이지 로드 시 숫자 인풋 정규화( 3자리 컴마)
$('.input-text.number').each(function () {
var input = $(this).val();
$(this).val(input.replace(/[^0-9]/g, "").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"));
});
const expsrSetTable = document.getElementById('expsrSet');
//노출예약 체크되어있을 경우 enable 처리
if($("input[name='expsrDvCd']:checked").val() ==='03'){
enableTableInputs(expsrSetTable)
}
const sopmalCd = $('#sopmalCd').val()
fn_create_ckeditor('#subsvcDc', sopmalCd); //상세 설명 > 상품 설명 ck에디터 적용
fn_create_ckeditor('#mblSubsvcDc', sopmalCd); // 모바일용 상세 설명 > 모바일용 상품 설명 ck에디터 적용
/* 모바일용 상세 설명 설정 이벤트 */
fn_handleMblSubsvcDcPcSameAt();
//모바일용 상세 설명 설정 이벤트 설정
$('[name="mblSubsvcDcPcSameAt"]').on('change', fn_handleMblSubsvcDcPcSameAt);
//실판매가 자동계산 이벤트 등록
$('[name="dlvyCnt"]').on('change', fn_cal_selpric);
$('[name="subsvcCt"]').on('change', fn_cal_selpric);
$('[name="tmeDlvyAmt"]').on('change', fn_cal_selpric);
//재고변경 시 가용재고 계산
$('#invntryQy').on('change', fn_cal_availQt);
//구독서비스명 변경 시 중복체크 초기화
$('#subsvcNm').on('change', fn_initDupCheck);
});
//숫자 인풋 포커스시 0 제거
$(document).on("focus", '.input-text.number',function () {
if(fn_nvl($(this).val(), '0') === '0'){
$(this).val('');
}
});
//재고와 상관없이 판매일 경우 옵션재고 disabled
$(document).on('change', 'input[name="invntryPolicyCd"]',function () {
let normalQy = $('input[name="invntryQy_normal"]');
let invntryQy = $('input[name="invntryQy_invntry"]');
let addeddQy = $('input[name="invntryQy_added"]');
if($(this).val() === '02'){
normalQy.prop('disabled', true)
invntryQy.prop('disabled', true)
addeddQy.prop('disabled', true)
}else{
normalQy.prop('disabled', false)
invntryQy.prop('disabled', false)
addeddQy.prop('disabled', false)
}
})
//예약 판매설정 체크 해제시 예약상품 배송일자, 안내문구 빈값 처리
$(document).on('click', '#goodsExpsrTy02', function () {
if(!$(this).prop('checked')){
$('#resveGoods input').val('')
}
})
//노출여부 노출예약이 아닐경우 노출 정보 빈값 처리
$(document).on('click', 'input[name="expsrDvCd"]', function () {
const target = $('#expsrDvCd3')
if($(this).attr('id') !== target.attr('id')){
$('#expsrSet input').val('')
}
})
//재고와 상관없이 판매일 경우 가용재고제한수량 빈값처리
$(document).on('click', '#invntryPolicyCd2', function () {
$('#avlinvLmttQy').val('')
})
/* ********************************************************
* 모바일용 상세설명 설정 enable-disable
******************************************************** */
function fn_handleMblSubsvcDcPcSameAt() {
if($('[name="mblSubsvcDcPcSameAt"]:checked').val() === 'Y'){
$('.mobileSubsvcCn').hide();
}else{
$('.mobileSubsvcCn').show();
}
}
/* ********************************************************
* 노출여부 enable-disable
******************************************************** */
function handleRadioClick2(radio) {
//노출쳬약 객체
const lastRadio = document.querySelector('#expsrDvCd3');
const table = document.getElementById('expsrSet');
if (radio === lastRadio) {
enableTableInputs(table);
} else {
disableTableInputs(table);
}
}
/* ********************************************************
* 재고에 따른 판매 enable-disable
******************************************************** */
function handleRadioClickDisable(radio) {
const firstRadio = document.querySelector('input[name="invntryPolicyCd"]:first-of-type');
const inputText = document.getElementById('avlinvLmttQy');
if (radio === firstRadio) {
inputText.disabled = false;
} else {
inputText.disabled = true;
}
}
/* ********************************************************
* enable-disable
******************************************************** */
function enableTableInputs(table) {
const inputs = table.querySelectorAll('input');
inputs.forEach(input => input.disabled = false);
}
function disableTableInputs(table) {
const inputs = table.querySelectorAll('input');
inputs.forEach(input => input.disabled = true);
}
function convertToDate(dateStr) {
// 입력된 문자열을 Date 객체로 변환
const date = new Date(dateStr);
// 유효하지 않은 날짜인 경우 null 반환
if (isNaN(date.getTime())) {
return null;
}
return date;
}
//시간을 분으로 변경하는 함수
function timeToMinutes(timeStr) {
// 시간과 분을 ':'를 기준으로 분리
const [hours, minutes] = timeStr.split(':').map(Number);
// 시간을 분으로 변환
return hours * 60 + minutes;
}
//마지막 컴마 지우기
const remove_Last_Comma = function removeLastComma(str) {
const lastCommaIndex = str.lastIndexOf(',');
if (lastCommaIndex !== -1) {
return str.substring(0, lastCommaIndex);
} else {
return str;
}
}
const fn_create_input = function (type, name, value, tgtForm) {
const input = document.createElement('input');
input.setAttribute("type", type);
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.appendChild(input);
}
/* ********************************************************
* 리스트 바로가기
******************************************************** */
const fn_select_list = function () {
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcListForm"/>';
$('#subsvcForm').attr('action', url);
$('#subsvcForm').attr('method', 'post');
$('#subsvcForm').submit();
};
//모든 컴마 삭제 및 문자를 숫자로 변환
const fn_comma_del_str_to_number = function (str) {
// null이나 undefined인 경우 0을 반환
if (str === null || str === undefined || str.trim() === '') {
return 0;
}
// 쉼표를 제거하고 숫자로 변환
const numberWithoutCommas = str.replace(/,/g, '');
const number = parseFloat(numberWithoutCommas);
// 변환된 값이 NaN인 경우 0을 반환
if (isNaN(number)) {
return 0;
}
return number;
}
/* 에러메세지 처리 */
const fn_proc_error_message = function(data) {
$('#overlay').fadeOut();
if (!data.responseJSON.resBody.message) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (fn_check_json(data.responseJSON.resBody.message)) {
const errorObject = JSON.parse(data.responseJSON.resBody.message);
if (!errorObject) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (!errorObject.errorMsg) {
alert('<spring:message code="error.internal-server"/>');
} else {
alert(errorObject.errorMsg);
let isMtched = false;
$('.main').eq(0).find('input, select, textarea').each(function () {
for (let idx = 0; idx < errorObject.errorFields.length; idx++) {
const name = $(this).prop('name');
if (!fn_is_empty(name)) {
if (errorObject.errorFields[idx].indexOf(name) >= 0) {
isMtched = true;
break;
}
}
}
if (isMtched) {
$(this).focus();
return false;
}
});
}
}
} else {
if (data.responseJSON.resBody.message) {
alert(data.responseJSON.resBody.message);
} else {
alert('<spring:message code="error.internal-server"/>');
}
}
}
}
//상품이미지 삭제
const deleteFileImg = function (obj) {
$("#delImg").val($("#img").val());
$(obj).parent('div.file-preview').parent('div.file-preview__container').remove()
}
/*실판매가 자동계산*/
const fn_cal_selpric = function(){
var dlvyCnt = $('#dlvyCnt'); //배송횟수
var subsvcCt = $('#subsvcCt'); //구독료
var tmeDlvyAmt = $('#tmeDlvyAmt'); //1회 배송비
var selpric = $('#selpric'); //1회 배송비
selpric.val(((Number(dlvyCnt.val().replace(/,/g, '')) * Number(tmeDlvyAmt.val().replace(/,/g, ''))) + Number(subsvcCt.val().replace(/,/g, ''))).toLocaleString());
}
/*가용재고 자동계산*/
const fn_cal_availQt = function(){
var invntryQy = $('#invntryQy');
var usefulInvntryQy = $('#usefulInvntryQy');
var availQt = $('#availQt');
availQt.val(Number(invntryQy.val().replace(/,/g, '')) - Number(usefulInvntryQy.val().replace(/,/g, '')));
}
/** 중복체크 초기화*/
const fn_initDupCheck = function (){
$('#dupCheck').val('false');
}
/** 제약조건 체크 */
const validate = function(){
var retVal = true;
//에디터내용을 textarea로 복사
var subsvcDc = $('#subsvcDc');
subsvcDc.val(fn_get_editor_data('#subsvcDc'));
//구독서비스명 중복확인
var dupCheck = $('#dupCheck');
if(typeof dupCheck.val() != 'undefined' && dupCheck.val() == 'false'){
alert('구독서비스명 중복확인이 필요합니다.');
return false;
}
// 텍스트 입력 내용중 필수 항목 체크
$(':text[required]').each(function () {
if($(this).hasClass('number')){
if ($(this).val().trim() == '' || $(this).val().trim() == '0') {
alert($(this).prop('title')+"은(는) 필수입니다");
$(this).focus();
retVal = false;
return false;
}
}else{
if ($(this).val().trim() == '') {
alert($(this).prop('title')+"은(는) 필수입니다");
$(this).focus();
retVal = false;
return false;
}
}
});
if(!retVal){
return retVal;
}
//노출예약 인 경우 노출기간 필수
if($('input[name="expsrDvCd"]:checked').val() == '03'){
if($('#expsrBgnDt_dt').val().trim() == ''){
alert($('#expsrBgnDt_dt').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrBgnDt_dt').focus();
return false;
}
if($('#expsrBgnDt_time').val().trim().replaceAll(':','') == ''){
alert($('#expsrBgnDt_time').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrBgnDt_time').focus();
return false;
}
if($('#expsrEndDt_dt').val().trim() == ''){
alert($('#expsrEndDt_dt').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrEndDt_dt').focus();
return false;
}
if($('#expsrEndDt_time').val().trim().replaceAll(':','') == ''){
alert($('#expsrEndDt_time').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrEndDt_time').focus();
return false;
}
// 노출기간 셋팅
const expsrBgnDt = $('#expsrBgnDt_dt').val() + ' ' +$('#expsrBgnDt_time').val() +':00'
const expsrEndDt = $('#expsrEndDt_dt').val() + ' ' +$('#expsrEndDt_time').val() +':00'
$('#expsrBgnDt').val(expsrBgnDt);
$('#expsrEndDt').val(expsrEndDt);
}
//재고가 있으면 판매인 경우 개수 품절처리 필수
if($('input[name="invntryPolicyCd"]:checked').val() == '01'){
if($('#avlinvLmttQy').val() == ''){
alert($('#avlinvLmttQy').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#avlinvLmttQy').focus();
return false;
}
}
//이미지 필수 체크
if(imgDropzone.files.length != 1){
if(imgDropzone.files.length == 0){
alert("대표이미지(섬네일)은(는) 필수입니다");
}else{
alert("대표이미지(섬네일)은(는) 1개만 등록가능합니다");
}
$('#img-dropzone')[0].scrollIntoView();
// $('#img-dropzone').focus();
return false;
}
//상품설명 필수체크
if(subsvcDc.val() == ''){
alert(subsvcDc.prop('title')+"은(는) 필수입니다");
CKEditorArray['#subsvcDc'].editing.view.focus();
return false;
}
//PC와 모바일 다르게 설정인 경우 모바일 상품설명 필수
if($('input[name="mblSubsvcDcPcSameAt"]:checked').val() == 'N'){
var mblSubsvcDc = $('#mblSubsvcDc');
mblSubsvcDc.val(fn_get_editor_data('#mblSubsvcDc'));
if(mblSubsvcDc.val().trim() == ''){
alert(mblSubsvcDc.prop('title')+"은(는) 필수입니다");
CKEditorArray['#mblSubsvcDc'].editing.view.focus();
return false;
}
}
return true;
}
/** 등록하기*/
const fn_updateSubsvc = function (){
if(!validate()){
return false;
}
const url = '<c:url value="/mngr/goods/subsvc/insertSubsvc"/>';
var formData = new FormData($('#subsvcForm')[0]);
imgDropzone.files.forEach(function(file, index){
console.log("file",file);
//1개만 등록 되도록
if(index == 0){
formData.append('files',file);
}
});
console.log("formData",formData);
if (confirm(`구독서비스를 <spring:message code="confirm.common.insert"/>`)) {
$.ajax({
type: 'post',
enctype: 'multipart/form-data',
url: url,
data: formData,
contentType: false,
processData: false,
success: function (data) {
try{
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('<spring:message code="success.common.insert"/>');
//등록 후 목록화면으로 이동
fn_select_list();
} else {
alert('<spring:message code="fail.common.insert"/>');
}
}catch (e) {
alert('<spring:message code="fail.common.insert"/>');
console.log(e);
}
},
error: function (request, status, error) {
alert('<spring:message code="fail.common.insert"/>');
console.log(error);
}
});
}
}
/** 구독서비스 명칭 중복확인 */
fn_subsvcNmDupCheck = function (subsvcNm){
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcNmDupCheck"/>';
if(subsvcNm.val().trim() == ''){
alert('구독서비스명을 입력해주세요.');
return false;
}
$.ajax({
type: 'post',
url: url,
data: {
'subsvcNm': subsvcNm.val()
},
success: function (data) {
try{
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('사용가능한 구독서비스입니다.');
$('#dupCheck').val('true');
//check 컬럼에 true 등록
} else {
alert('동일한 구독서비스가 있습니다.');
$('#dupCheck').val('false');
//check 컬럼에 false 등록
}
}catch (e) {
alert('<spring:message code="fail.common.select"/>');
//check 컬럼에 false 등록
console.log(e);
}
},
error: function (request, status, error) {
alert('<spring:message code="fail.common.select"/>');
console.log(error);
}
});
}
</script>
<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 onclick="fn_select_list();" class="btn outline"><spring:message code="button.list"/></button>
<button onclick="fn_updateSubsvc();return false;" class="btn primary"><spring:message code="button.insert"/></button>
</div>
</div>
<form id="subsvcForm" method="post" action="" enctype="multipart/form-data">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="">
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.paramVO.sopmalCd}">
<input type="hidden" id="srchSelSubsvcNm" name="srchSelSubsvcNm" value="${resultMap.paramVO.srchSelSubsvcNm}">
<input type="hidden" id="srchSubsvcNm" name="srchSubsvcNm" value="${resultMap.paramVO.srchSubsvcNm}">
<input type="hidden" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr" value="${resultMap.paramVO.srchSelSubsvcGnr}">
<input type="hidden" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="${resultMap.paramVO.srchSubsvcGnrNm}">
<c:forEach items="${resultMap.paramVO.srchArrSubsvcSttusCd}" var="srchSubsvcSttusCd" varStatus="status">
<input type="hidden" id="srchArrSubsvcSttusCd${status.count}" name="srchArrSubsvcSttusCd" value="${srchSubsvcSttusCd}">
</c:forEach>
<input type="hidden" id="srchExpsrDvCd" name="srchExpsrDvCd" value="${resultMap.paramVO.srchExpsrDvCd}">
<input type="hidden" id="sortDv" name="sortDv" value="${resultMap.paramVO.sortDv}">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="delImg" name="delImg" value="">
<input type="hidden" id="expsrBgnDt" name="expsrBgnDt" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.expsrBgnDt}</c:if>">
<input type="hidden" id="expsrEndDt" name="expsrEndDt" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.expsrBgnDt}</c:if>">
<input type="hidden" id="usefulInvntryQy" name="usefulInvntryQy" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.usefulInvntryQy}</c:if>">
<spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<input type="hidden" id="cdnurl" value="${cdnurl}"/>
<section id="section01" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">기본정보</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>기본정보</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 38%">
<col style="width: 12%;">
<col style="width: 38%">
</colgroup>
<tbody>
<tr>
<th>구독서비스명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text lg" type="text" title="구독서비스명" id="subsvcNm" name="subsvcNm" maxlength="100" value="${resultMap.subsvcDtl.subsvcNm}" <c:if test='${resultMap.subsvcDtl != null}'>readonly</c:if> required>
<c:if test='${resultMap.subsvcDtl == null}'>
<button type="button" id="dupCheckButton" onclick="fn_subsvcNmDupCheck($('#subsvcNm'));return false;" class="btn xsm gray ml-5">중복확인</button>
<input type="hidden" id="dupCheck" name="dupCheck" value="false">
</c:if>
</div>
</td>
<th>구독기간<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="구독기간" id="subPd" name="subPd" maxlength="3" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.subPd}</c:if>" required> 개월
</div>
</td>
</tr>
<tr>
<th>기수</th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="기수" id="subsvcGnr" name="subsvcGnr" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.subsvcNextGnr}</c:if><c:if test='${resultMap.subsvcDtl == null}'>1</c:if>" readonly> 기
</div>
</td>
<th>기수명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text lg" type="text" title="기수명" id="subsvcGnrNm" name="subsvcGnrNm" maxlength="80" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.subsvcGnrNm}</c:if>" required>
</div>
</td>
</tr>
<tr>
<th>배송횟수<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="배송횟수" id="dlvyCnt" name="dlvyCnt" maxlength="3" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.dlvyCnt}</c:if>" required> 회
</div>
</td>
<th>배송주기<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm" type="text" title="배송주기" id="dlvyCycle" name="dlvyCycle" maxlength="30" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.dlvyCycle}</c:if>" required>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section02" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">판매정보</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>판매정보</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 38%">
<col style="width: 12%;">
<col style="width: 38%">
</colgroup>
<tbody>
<tr>
<th>구독료<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="구독료" id="subsvcCt" name="subsvcCt" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.subsvcCt}</c:if>" required> 円(엔)
</div>
</td>
<th>1회 배송비<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="1회 배송비" id="tmeDlvyAmt" name="tmeDlvyAmt" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.tmeDlvyAmt}</c:if>" required> 円(엔)
</div>
</td>
</tr>
<tr>
<th>소비자가</th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="소비자가" id="cnsmrpric" name="cnsmrpric" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.cnsmrpric}</c:if>"> 円(엔)
</div>
</td>
<th>실판매가<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="실판매가" id="selpric" name="selpric" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.selpric}</c:if>" readonly> 円(엔)
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section03" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">구독설정</h3>
<button type="button" class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>구독설정</caption>
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>재고<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="재고" id="invntryQy" name="invntryQy" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.invntryQy}</c:if>" required>
</div>
</td>
<th>가용재고</th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="가용재고" id="availQt" maxlength="11" value="<c:if test='${resultMap.subsvcDtl != null}'>${resultMap.subsvcDtl.availQt}</c:if>" readonly>
</div>
</td>
</tr>
<tr>
<th>판매 상태</th>
<td colspan="2">
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${resultMap.subsvcSttusList}" var="subsvcSttus" varStatus="status">
<div class="custom-radio">
<input type="radio" id="subsvcSttusCd${status.count}" name="subsvcSttusCd" title="판매 상태" value="${subsvcSttus.cd}" <c:if test="${resultMap.subsvcDtl.subsvcSttusCd eq subsvcSttus.cd}">checked</c:if>/>
<label for="subsvcSttusCd${status.count}">${subsvcSttus.cdNm}</label>
<input type="hidden" value="${resultMap.subsvcDtl.subsvcSttusCd}" id="subsvcSttusCdChk"/>
</div>
</c:forEach>
</div>
</div>
</td>
</tr>
<tr>
<th>노출 여부</th>
<td colspan="3">
<div class="td-inner vertical">
<div class="custom-radio-container mt-10">
<c:forEach items="${resultMap.expsrDvList}" var="expsrDv" varStatus="status">
<div class="custom-radio">
<input type="radio" id="expsrDvCd${status.count}" name="expsrDvCd" title="노출 여부" value="${expsrDv.cd}" onclick="handleRadioClick2(this);" <c:if test="${resultMap.subsvcDtl.expsrDvCd eq expsrDv.cd}">checked</c:if>/>
<label for="expsrDvCd${status.count}">${expsrDv.cdNm}</label>
<input type="hidden" value="${resultMap.subsvcDtl.expsrDvCd}" id="expsrDvCdChk"/>
</div>
</c:forEach>
</div>
<div class="table-wrapper mt-10">
<table class="table">
<caption>노출 기간</caption>
<colgroup>
<col style="width: 16%;">
<col>
</colgroup>
<tbody id="expsrSet">
<tr>
<th>노출 기간</th>
<td>
<div class="td-inner">
<input type="text" id="expsrBgnDt_dt" class="datepicker" title="시작 날짜 선택" autocomplete="off" value="${fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[0]}" disabled>
<div class="timepicker-container">
<input type="text" class="bs-timepicker" id="expsrBgnDt_time" title="시작 시간 설정" value="${fn:split(fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[1], ':')[0]}:${fn:split(fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[1], ':')[1]}" disabled>
</div>
<span class="tilde">~</span>
<input type="text" id="expsrEndDt_dt" class="datepicker" title="종료 날짜 선택" autocomplete="off" value="${fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[0]}" disabled>
<div class="timepicker-container">
<input type="text" class="bs-timepicker" id="expsrEndDt_time" title="종료 시간 설정" value="${fn:split(fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[1], ':')[0]}:${fn:split(fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[1], ':')[1]}" disabled>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
<tr>
<th>재고에 따른 판매</th>
<td colspan="3">
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${resultMap.invntryPolicyList}" var="invntryPolicy" varStatus="status">
<div class="custom-radio">
<input type="radio" id="invntryPolicyCd${status.count}" name="invntryPolicyCd" value="${invntryPolicy.cd}" onclick="handleRadioClickDisable(this);"<c:if test="${resultMap.subsvcDtl.invntryPolicyCd eq invntryPolicy.cd}">checked</c:if>/>
<label for="invntryPolicyCd${status.count}">${invntryPolicy.cdNm}</label>
</div>
<c:if test="${status.first}">
<div>
<span class="ml-4">(</span>
<input class="input-text number xsm ml-5 right" id="avlinvLmttQy" name="avlinvLmttQy" value="${resultMap.subsvcDtl.avlinvLmttQy}" type="text" title="해당 인풋에 대한 설명" <c:if test="${resultMap.subsvcDtl.invntryPolicyCd eq '02'}"> disabled</c:if> />
개 이하 일 때 품절 처리
<span class="ml-4">)</span>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section07" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">구독서비스 설명</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>구독서비스 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>대표이미지(썸네일) 등록<span class="red-7">*</span></th>
<td>
<div class="td-inner vertical">
<div class="dropzone-wrapper">
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<div class="dropzone" id="img-dropzone">
</div><p class="fyi gray-7 mt-15">1개의 이미지만 등록가능합니다.</p>
</div>
</div>
</td>
</tr>
<tr>
<th>상품 설명<span class="red-7">*</span></th>
<td>
<div class="td-inner"><textarea class="textarea" title="상품 설명" cols="30" rows="10" id="subsvcDc" name="subsvcDc">${resultMap.subsvcDtl.subsvcDc}</textarea>
</div>
</td>
</tr>
<tr>
<th>모바일용 상세 설명 설정</th>
<td>
<div class="td-inner">
<div class="custom-radio-container mr-5">
<div class="custom-radio">
<input type="radio" id="mblSubsvcDcPcSameAt1" name="mblSubsvcDcPcSameAt" value="Y" <c:if test="${ resultMap.subsvcDtl.mblSubsvcDcPcSameAt eq 'Y'}">checked</c:if>>
<label for="mblSubsvcDcPcSameAt1">PC와 동일</label>
</div>
<div class="custom-radio">
<input type="radio" id="mblSubsvcDcPcSameAt2" name="mblSubsvcDcPcSameAt" value="N" <c:if test="${ resultMap.subsvcDtl.mblSubsvcDcPcSameAt eq 'N'}">checked</c:if>>
<label for="mblSubsvcDcPcSameAt2">PC와 모바일 다르게 설정</label>
</div>
</div>
</div>
</td>
</tr>
<tr class="mobileSubsvcCn">
<th>모바일용 상세 설명<span class="red-7">*</span></th>
<td>
<div class="td-inner"><textarea class="textarea" title="모바일용 상품 설명" cols="30" rows="10" id="mblSubsvcDc" name="mblSubsvcDc">${resultMap.subsvcDtl.mblSubsvcDc}</textarea>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
<div id="modalDiv">
</div>
<%--관리자 수정이력 내역보기 모달 --%>
<div id="logDiv"></div>
</main>
<script>
// Dropzone 파일업로드
if ($("#img-dropzone").length > 0) {
Dropzone.autoDiscover = false;
var imgDropzone = new Dropzone("#img-dropzone", {
url: "/file-upload",
maxFiles: 1,
maxFilesize: 20,
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "클릭하거나 파일을 여기로 드래그하세요",
dictRemoveFile: "삭제",
acceptedFiles: "${acceptFileExtensions}",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
});
}
</script>
</body>
</html>

View File

@@ -0,0 +1,137 @@
<%@ 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 : SubsvcList.jsp
Description : 구독서비스 목록 조회 리스트
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-05 jazz 최초 생성
--%>
<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="sortDvView" id="sortDvView" onchange="fn_select_list(1);return false;">
<option value="subsvcGnrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrAsc'}">selected="selected"</c:if>>구독서비스+기수 오름차순</option>
<option value="subsvcGnrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrDesc'}">selected="selected"</c:if>>구독서비스+기수 내림차순</option>
</select>
</div>
<div class="select-box">
<select id="pageUnitView" name="pageUnitView" title="페이지당 출력될 목록건수" onchange="fn_select_list(1,this.value);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 class="btn dark sm" onclick="fn_delete_check();return false;">선택 삭제</button>
</div>
<div class="center">
</div>
</div>
<hr class="spacing">
<div class="table-wrapper">
<table class="table vertical">
<caption>구독서비스 목록</caption>
<colgroup>
<col style="width: 4%;">
<col style="width: 4%;">
<col style="width: 12%;">
<col style="width: 7%;">
<col style="width: 12%;">
<col style="width: 7%;">
<col style="width: 6%;">
<col style="width: 6%;">
<col style="width: 7%;">
<col style="width: 7%;">
<col style="width: 7%;">
<col style="width: 7%;">
<col style="width: 7%;">
<col style="width: 7%;">
</colgroup>
<thead>
<tr>
<th>
<label class="b-checkbox checkbox is-medium">
<input type="checkbox" id="checkAll" value="">
<span class="check"></span>
</label>
</th>
<th>번호</th>
<th>구독서비스</th>
<th>기수</th>
<th>기수명</th>
<th>배송횟수</th>
<th>재고</th>
<th>가용재고</th>
<th>판매상태</th>
<th>노출여부</th>
<th>구독료</th>
<th>1회배송비</th>
<th>소비자가</th>
<th>실판매가</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="subsvc" varStatus="status">
<tr>
<td>
<label class="b-checkbox checkbox is-medium check-all">
<input type="checkbox" name="arrSubsvcInnb" class="subsvcInnb" value="${subsvc.subsvcInnb}">
<span class="check"></span>
</label>
</td>
<td><c:out value="${ resultMap.paginationInfo.totalRecordCount - subsvc.rnum + 1 }" /></td>
<td><a onclick="fn_move_subsvc_dtl(<c:out value="${subsvc.subsvcInnb}"/>)" class="under-line"><c:out value="${subsvc.subsvcNm}"/></a></td>
<td><c:out value="${subsvc.subsvcGnr}"/>기 <button class="btn xsm outline" type="button" onclick="fn_move_subsvc_copy(<c:out value="${subsvc.subsvcInnb}"/>)"><spring:message code="button.copy"/> </button></td>
<td><c:out value="${subsvc.subsvcGnrNm}"/></td>
<td><c:out value="${subsvc.dlvyCnt}"/>회</td>
<td><fmt:formatNumber value="${subsvc.invntryQy}" pattern="#,###"/></td>
<td><fmt:formatNumber value="${subsvc.availQt}" pattern="#,###"/></td>
<td><c:out value="${subsvc.subsvcSttus}"/></td>
<td><c:out value="${subsvc.expsrDv}"/></td>
<td><fmt:formatNumber value="${subsvc.subsvcCt}" pattern="#,###"/></td>
<td><fmt:formatNumber value="${subsvc.tmeDlvyAmt}" pattern="#,###"/></td>
<td><fmt:formatNumber value="${subsvc.cnsmrpric}" pattern="#,###"/></td>
<td><fmt:formatNumber value="${subsvc.selpric}" pattern="#,###"/></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">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>

View File

@@ -0,0 +1,449 @@
<%@ 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 : SubsvcListForm.jsp
Description : 구독서비스 목록 조회 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-05 jazz 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
</head>
<script>
var initFlag = true;
$(document).ready(function () {
let pageIndex = $("#pageIndex").val();
let pageUnit = $("#pageUnit").val();
let srchSelSubsvcNm = $('#srchSelSubsvcNm').val();
// event 제어
fn_event();
if(srchSelSubsvcNm != ''){
fn_getsubsvcGnr(srchSelSubsvcNm);
}else{
// 목록 조회
fn_select_list(pageIndex, pageUnit);
}
// 엔터키 검색
$('#listForm').on('keydown', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
fn_select_list(1);
}
});
});
/*********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function (pageIndex, pageUnit) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
//정렬기준 셋팅
if(typeof $('#sortDvView') !== undefined && $('#sortDvView').val() !== undefined){
$('#sortDv').val($('#sortDvView').val());
}
//한페이지 목록개수 셋팅
if(typeof $('#pageUnitView') !== undefined && $('#pageUnitView').val() !== undefined){
$('#pageUnit').val($('#pageUnitView').val());
}
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: "<c:url value="/mngr/goods/subsvc/selectSubsvcList"/>",
data: dataStr,
success: function (resultHtml) {
$('#pageDiv').html(resultHtml);
$('#sortDv').val($('#sortDvView').val());
$('#pageUnitView').niceSelect();
$('#sortDvView').niceSelect();
}
});
}
/*********************************************************
* 구독서비스 복사 조회
*********************************************************/
const fn_move_subsvc_copy = (subsvcInnb) => {
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcRegistForm"/>';
$('#subsvcInnb').val(subsvcInnb);
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
}
/*********************************************************
* 구독서비스 상세 조회
*********************************************************/
const fn_move_subsvc_dtl = (subsvcInnb) => {
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcDtlForm"/>';
$('#subsvcInnb').val(subsvcInnb);
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
}
/*********************************************************
* 등록폼 이동
******************************************************** */
const fn_move_regpage = function () {
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcRegistForm"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
};
/* 현제uri에 프로토콜, 호스트, 쿼리스티링을 제외하여 history갱신 */
history.replaceState({}, null, location.pathname);
/* ****************************
* event 제어
******************************/
const fn_event = function () {
/* 검색조건 구독서비스 선택 시 회차 조회 이벤트*/
$(document).on('change', '#srchSelSubsvcNm', function(){
var srchSelSubsvcNm = $(this).val();
if(fn_is_empty(srchSelSubsvcNm)){
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
}else{
//해당구독서비스 기수조회
fn_getsubsvcGnr(srchSelSubsvcNm);
}
});
/* 목록 > 전체선택 체인지 이벤트 */
$(document).on('change', '#checkAll', function () {
let checkbox = $(this).closest('table').find('input[name="arrSubsvcInnb"]');
$(checkbox).prop('checked', false);
$(checkbox).prop('checked', $(this).is(':checked'));
});
}
/* ****************************
* 해당구독서비스 기수조회 AJAX
******************************/
const fn_getsubsvcGnr = function (srchSelSubsvcNm) {
$.ajax({
type: 'post',
url: '<c:url value="/mngr/goods/subsvc/selectSrchSubsvcGnrListAjax"/>',
data: {
'srchSelSubsvcNm': srchSelSubsvcNm
},
success: function (data) {
if (data.resBody != null) {
const result = JSON.parse(data.resBody.result);
const srchSubsvcGnrList = result.srchSubsvcGnrList;
if (srchSubsvcGnrList.length > 0) {
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
// $('#srchSubsvcGnr option').filter(function() {
// return $(this).val() !== '';
// }).remove();
for (let i = 0; i < srchSubsvcGnrList.length; i++) {
const srchSubsvcGnr = srchSubsvcGnrList[i];
var check = "";
if(srchSubsvcGnr.subsvcGnr == '${resultMap.paramVO.srchSelSubsvcGnr}'){
check ="selected"
}
console.log("check:",check," resultMap.paramVO.srchSelSubsvcGnr", '${resultMap.paramVO.srchSelSubsvcGnr}');
if(initFlag == true){
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '" '+ check+'>' + srchSubsvcGnr.subsvcGnrNm + '</option>');
fn_select_list();
initFlag = false;
}else{
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '">' + srchSubsvcGnr.subsvcGnrNm + '</option>');
}
}
$('#srchSelSubsvcGnr').niceSelect('update');
}
}
},
error: function (data) {
fn_proc_error_message(data);
}
});
}
/**
* 체크박스 전체 처리
* */
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);
}
}
}
/*********************************************************
* 구독서비스 선택 삭제 AJAX
*********************************************************/
const fn_delete_check = function () {
let url = '<c:url value="/mngr/goods/subsvc/deleteSubsvc"/>';
let arrSubsvcInnb = $("input[name='arrSubsvcInnb']:checked");
let subsvcInnbArr = [];
if (arrSubsvcInnb.length === 0) {
alert("선택된 상품이 없습니다.");
return false;
}else{
arrSubsvcInnb.each( function (){
subsvcInnbArr.push($(this).val());
});
}
if (confirm('상품을 <spring:message code="confirm.common.delete"/>')) {
$.ajax({
type: 'post',
url: url,
data: {
"arrSubsvcInnb": subsvcInnbArr
},
dataType: "json",
success: function (data) {
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('<spring:message code="success.common.delete"/>');
fn_select_list();
}else{
alert('<spring:message code="fail.common.delete"/>');
}
}
})
}
}
/* 관리자 주문 > 상품조회 > 검색조건 > 날짜 선택 이벤트 */
$(document).on('click', '.dateRange-btn', function () {
const date = $(this).attr('id');
$('.dateRange-btn').removeClass('selected');
$('#' + date).addClass('selected');
const datepicker = $(this).closest('.td-inner').find('.datepicker');
const start = $(datepicker[0]).attr('id');
const end = $(datepicker[1]).attr('id');
if ('allDays' === date) {
$('#' + start + ', #' + end).val('');
$('#datePeriod').val(date);
return false;
}
fn_set_date(start, end, end, date);
$('#datePeriod').val(date);
});
//카테고리 선택시 카테고리 아이디 저장(검색용)
$(document).on('change', 'select[id^=ctgryDepth]', function () {
const ctgryOptn = $(this).val()
if(!fn_is_empty(ctgryOptn)){
$('#ctgryId').val(ctgryOptn)
}else{
//value가 ''인 카테고리 선택할경우
let currentCtgryDepth = parseInt($(this).attr('id').replace('ctgryDepth', ''));
//1차 카테고리가 아닐 경우 이전 카테고리 번호 가져오기
if(currentCtgryDepth !== 1){
$('#ctgryId').val($('#ctgryDepth' + (currentCtgryDepth - 1)).val())
}else{
//1차 카테고리 일경우 카테고리 번호 비우기
$('#ctgryId').val('')
}
}
})
//초기화버튼
$(document).on('click', '#resetBtn', function () {
$('#listForm')[0].reset();
$('#srchSelSubsvcNm').niceSelect('update');
$('#srchSelSubsvcNm').trigger("change");
$('#srchSelSubsvcGnr').niceSelect('update');
fn_select_list(1);
})
</script>
<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 onclick="fn_move_regpage()" class="btn primary">구독서비스 <spring:message code="button.insert"/></button>
</div>
</div>
<form id='listForm' name="listForm" method="post" action="<c:url value="/mngr/goods/subsvc/selectSubsvcList"/>">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="sortDv" name="sortDv" value="${ resultMap.paramVO.sortDv }">
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="">
<section class="content-section" id="search-section">
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>구독서비스</th>
<td colspan="3">
<div class="td-inner">
<div class="select-box">
<select title="구독서비스" id="srchSelSubsvcNm" name="srchSelSubsvcNm">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq ''}">selected="selected"</c:if>>전체</option>
<c:forEach items="${resultMap.srchSubsvcList}" var="srchSubsvc" varStatus="status">
<option value="${srchSubsvc.subsvcNm}" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq srchSubsvc.subsvcNm}">selected="selected"</c:if>>${srchSubsvc.subsvcNm}</option>
</c:forEach>
</select>
</div>
<div class="select-box">
<select title="구독서비스회차" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcGnr eq ''}">selected="selected"</c:if>>전체</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<th>구독서비스명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcNm" name="srchSubsvcNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcNm }" />">
</div>
</td>
<th>기수명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcGnrNm }" />">
</div>
</td>
</tr>
<tr>
<th>판매상태</th>
<td>
<div class="td-inner">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox check-all">
<input id="srchArrSubsvcSttusCd-all" type="checkbox" name="srchArrSubsvcSttusCd-all" <c:if test="${resultMap.paramVO.srchArrSubsvcSttusCd == null || fn:length(resultMap.paramVO.srchArrSubsvcSttusCd) == 3}" >checked</c:if> value="" onclick="fn_change_event('srchArrSubsvcSttusCd', 'all');">
<span class="check"></span>
<span class="subsvcSttus-all">전체</span>
</label>
<c:forEach items="${resultMap.srchSubsvcSttusList}" var="srchSubsvcSttus" varStatus="status">
<label class="b-checkbox checkbox">
<input type="checkbox" name="srchArrSubsvcSttusCd" value="${srchSubsvcSttus.cd}" onclick="fn_change_event('srchArrSubsvcSttusCd', 'other');" <c:if test="${resultMap.paramVO.srchArrSubsvcSttusCd == null || fn:contains(resultMap.paramVO.srchArrSubsvcSttusCd, srchSubsvcSttus.cd) }">checked</c:if>>
<span class="check"></span>
<span class="control-label">${srchSubsvcSttus.cdNm}</span>
</label>
</c:forEach>
</div>
</div>
</td>
<th>노출여부</th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<div class="custom-radio">
<input type="radio" id="srchExpsrDvCd" name="srchExpsrDvCd" value="" <c:if test="${resultMap.paramVO.srchExpsrDvCd eq '' || resultMap.paramVO.srchExpsrDvCd == null}">checked</c:if>>
<label for="srchExpsrDvCd">전체</label>
</div>
<c:forEach items="${resultMap.srchExpsrDvList}" var="srchExpsrDvCd" varStatus="status">
<div class="custom-radio">
<input type="radio" id="srchExpsrDvCd${status.count}" name="srchExpsrDvCd" value="${srchExpsrDvCd.cd}"<c:if test="${srchExpsrDvCd.cd eq resultMap.paramVO.srchExpsrDvCd}">checked</c:if>>
<label for="srchExpsrDvCd${status.count}">${srchExpsrDvCd.cdNm}</label>
</div>
</c:forEach>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="form-control-container">
<div class="left"></div>
<div class="center">
<button class="btn outline" id="resetBtn" type="button">초기화</button>
<button class="btn primary" id="searchBtn" type="button" onclick="fn_select_list(1);"><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>
<div id="modalDiv">
</div>
</main>
</body>
</html>

View File

@@ -0,0 +1,842 @@
<%@ 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 : SubsvcU.jsp
Description : 구독서비스 상세
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-01-27 jazz 최초생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%-- 공통 include --%>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
</head>
<script>
$(document).ready(function () {
//페이지 로드 시 숫자 인풋 정규화( 3자리 컴마)
$('.input-text.number').each(function () {
var input = $(this).val();
$(this).val(input.replace(/[^0-9]/g, "").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"));
});
const expsrSetTable = document.getElementById('expsrSet');
//노출예약 체크되어있을 경우 enable 처리
if($("input[name='expsrDvCd']:checked").val() ==='03'){
enableTableInputs(expsrSetTable)
}
const sopmalCd = $('#sopmalCd').val()
fn_create_ckeditor('#subsvcDc', sopmalCd); //상세 설명 > 상품 설명 ck에디터 적용
fn_create_ckeditor('#mblSubsvcDc', sopmalCd); // 모바일용 상세 설명 > 모바일용 상품 설명 ck에디터 적용
/* 모바일용 상세 설명 설정 이벤트 */
fn_handleMblSubsvcDcPcSameAt();
//모바일용 상세 설명 설정 이벤트 설정
$('[name="mblSubsvcDcPcSameAt"]').on('change', fn_handleMblSubsvcDcPcSameAt);
//실판매가 자동계산 이벤트 등록
$('[name="dlvyCnt"]').on('change', fn_cal_selpric);
$('[name="subsvcCt"]').on('change', fn_cal_selpric);
$('[name="tmeDlvyAmt"]').on('change', fn_cal_selpric);
$('#invntryQy').on('change', fn_cal_availQt)
});
//숫자 인풋 포커스시 0 제거
$(document).on("focus", '.input-text.number',function () {
if(fn_nvl($(this).val(), '0') === '0'){
$(this).val('');
}
});
//재고와 상관없이 판매일 경우 옵션재고 disabled
$(document).on('change', 'input[name="invntryPolicyCd"]',function () {
let normalQy = $('input[name="invntryQy_normal"]');
let invntryQy = $('input[name="invntryQy_invntry"]');
let addeddQy = $('input[name="invntryQy_added"]');
if($(this).val() === '02'){
normalQy.prop('disabled', true)
invntryQy.prop('disabled', true)
addeddQy.prop('disabled', true)
}else{
normalQy.prop('disabled', false)
invntryQy.prop('disabled', false)
addeddQy.prop('disabled', false)
}
})
//예약 판매설정 체크 해제시 예약상품 배송일자, 안내문구 빈값 처리
$(document).on('click', '#goodsExpsrTy02', function () {
if(!$(this).prop('checked')){
$('#resveGoods input').val('')
}
})
//노출여부 노출예약이 아닐경우 노출 정보 빈값 처리
$(document).on('click', 'input[name="expsrDvCd"]', function () {
const target = $('#expsrDvCd3')
if($(this).attr('id') !== target.attr('id')){
$('#expsrSet input').val('')
}
})
//재고와 상관없이 판매일 경우 가용재고제한수량 빈값처리
$(document).on('click', '#invntryPolicyCd2', function () {
$('#avlinvLmttQy').val('')
})
/* ********************************************************
* 모바일용 상세설명 설정 enable-disable
******************************************************** */
function fn_handleMblSubsvcDcPcSameAt() {
if($('[name="mblSubsvcDcPcSameAt"]:checked').val() === 'Y'){
$('.mobileSubsvcCn').hide();
}else{
$('.mobileSubsvcCn').show();
}
}
/* ********************************************************
* 노출여부 enable-disable
******************************************************** */
function handleRadioClick2(radio) {
//노출쳬약 객체
const lastRadio = document.querySelector('#expsrDvCd3');
const table = document.getElementById('expsrSet');
if (radio === lastRadio) {
enableTableInputs(table);
} else {
disableTableInputs(table);
}
}
/* ********************************************************
* 재고에 따른 판매 enable-disable
******************************************************** */
function handleRadioClickDisable(radio) {
const firstRadio = document.querySelector('input[name="invntryPolicyCd"]:first-of-type');
const inputText = document.getElementById('avlinvLmttQy');
if (radio === firstRadio) {
inputText.disabled = false;
} else {
inputText.disabled = true;
}
}
/* ********************************************************
* enable-disable
******************************************************** */
function enableTableInputs(table) {
const inputs = table.querySelectorAll('input');
inputs.forEach(input => input.disabled = false);
}
function disableTableInputs(table) {
const inputs = table.querySelectorAll('input');
inputs.forEach(input => input.disabled = true);
}
function convertToDate(dateStr) {
// 입력된 문자열을 Date 객체로 변환
const date = new Date(dateStr);
// 유효하지 않은 날짜인 경우 null 반환
if (isNaN(date.getTime())) {
return null;
}
return date;
}
//시간을 분으로 변경하는 함수
function timeToMinutes(timeStr) {
// 시간과 분을 ':'를 기준으로 분리
const [hours, minutes] = timeStr.split(':').map(Number);
// 시간을 분으로 변환
return hours * 60 + minutes;
}
//마지막 컴마 지우기
const remove_Last_Comma = function removeLastComma(str) {
const lastCommaIndex = str.lastIndexOf(',');
if (lastCommaIndex !== -1) {
return str.substring(0, lastCommaIndex);
} else {
return str;
}
}
const fn_create_input = function (type, name, value, tgtForm) {
const input = document.createElement('input');
input.setAttribute("type", type);
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.appendChild(input);
}
/* ********************************************************
* 리스트 바로가기
******************************************************** */
const fn_select_list = function () {
const url = '<c:url value="/mngr/goods/subsvc/selectSubsvcListForm"/>';
$('#subsvcForm').attr('action', url);
$('#subsvcForm').attr('method', 'post');
$('#subsvcForm').submit();
};
//모든 컴마 삭제 및 문자를 숫자로 변환
const fn_comma_del_str_to_number = function (str) {
// null이나 undefined인 경우 0을 반환
if (str === null || str === undefined || str.trim() === '') {
return 0;
}
// 쉼표를 제거하고 숫자로 변환
const numberWithoutCommas = str.replace(/,/g, '');
const number = parseFloat(numberWithoutCommas);
// 변환된 값이 NaN인 경우 0을 반환
if (isNaN(number)) {
return 0;
}
return number;
}
/* 에러메세지 처리 */
const fn_proc_error_message = function(data) {
$('#overlay').fadeOut();
if (!data.responseJSON.resBody.message) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (fn_check_json(data.responseJSON.resBody.message)) {
const errorObject = JSON.parse(data.responseJSON.resBody.message);
if (!errorObject) {
alert('<spring:message code="error.internal-server"/>');
} else {
if (!errorObject.errorMsg) {
alert('<spring:message code="error.internal-server"/>');
} else {
alert(errorObject.errorMsg);
let isMtched = false;
$('.main').eq(0).find('input, select, textarea').each(function () {
for (let idx = 0; idx < errorObject.errorFields.length; idx++) {
const name = $(this).prop('name');
if (!fn_is_empty(name)) {
if (errorObject.errorFields[idx].indexOf(name) >= 0) {
isMtched = true;
break;
}
}
}
if (isMtched) {
$(this).focus();
return false;
}
});
}
}
} else {
if (data.responseJSON.resBody.message) {
alert(data.responseJSON.resBody.message);
} else {
alert('<spring:message code="error.internal-server"/>');
}
}
}
}
//상품이미지 삭제
const deleteFileImg = function (obj) {
$("#delImg").val($("#img").val());
$(obj).parent('div.file-preview').parent('div.file-preview__container').remove()
}
/*실판매가 자동계산*/
const fn_cal_selpric = function(){
var dlvyCnt = $('#dlvyCnt'); //배송횟수
var subsvcCt = $('#subsvcCt'); //구독료
var tmeDlvyAmt = $('#tmeDlvyAmt'); //1회 배송비
var selpric = $('#selpric'); //1회 배송비
selpric.val(((Number(dlvyCnt.val().replace(/,/g, '')) * Number(tmeDlvyAmt.val().replace(/,/g, ''))) + Number(subsvcCt.val().replace(/,/g, ''))).toLocaleString());
}
/*가용재고 자동계산*/
const fn_cal_availQt = function(){
var invntryQy = $('#invntryQy');
var usefulInvntryQy = $('#usefulInvntryQy');
var availQt = $('#availQt');
availQt.val(Number(invntryQy.val().replace(/,/g, '')) - Number(usefulInvntryQy.val().replace(/,/g, '')));
}
/** 제약조건 체크 */
const validate = function(){
var retVal = true;
//에디터내용을 textarea로 복사
var subsvcDc = $('#subsvcDc');
subsvcDc.val(fn_get_editor_data('#subsvcDc'));
// 텍스트 입력 내용중 필수 항목 체크
$(':text[required]').each(function () {
if($(this).hasClass('number')){
if ($(this).val().trim() == '' || $(this).val().trim() == '0') {
alert($(this).prop('title')+"은(는) 필수입니다");
$(this).focus();
retVal = false;
return false;
}
}else{
if ($(this).val().trim() == '') {
alert($(this).prop('title')+"은(는) 필수입니다");
$(this).focus();
retVal = false;
return false;
}
}
});
if(!retVal){
return retVal;
}
//노출예약 인 경우 노출기간 필수
if($('input[name="expsrDvCd"]:checked').val() == '03'){
if($('#expsrBgnDt_dt').val().trim() == ''){
alert($('#expsrBgnDt_dt').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrBgnDt_dt').focus();
return false;
}
if($('#expsrBgnDt_time').val().trim().replaceAll(':','') == ''){
alert($('#expsrBgnDt_time').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrBgnDt_time').focus();
return false;
}
if($('#expsrEndDt_dt').val().trim() == ''){
alert($('#expsrEndDt_dt').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrEndDt_dt').focus();
return false;
}
if($('#expsrEndDt_time').val().trim().replaceAll(':','') == ''){
alert($('#expsrEndDt_time').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#expsrEndDt_time').focus();
return false;
}
// 노출기간 셋팅
const expsrBgnDt = $('#expsrBgnDt_dt').val() + ' ' +$('#expsrBgnDt_time').val() +':00'
const expsrEndDt = $('#expsrEndDt_dt').val() + ' ' +$('#expsrEndDt_time').val() +':00'
$('#expsrBgnDt').val(expsrBgnDt);
$('#expsrEndDt').val(expsrEndDt);
}else if($('input[name="expsrDvCd"]:checked').val() != '03'){
$('#expsrBgnDt').val('');
$('#expsrEndDt').val('');
}
//재고가 있으면 판매인 경우 개수 품절처리 필수
if($('input[name="invntryPolicyCd"]:checked').val() == '01'){
if($('#avlinvLmttQy').val() == ''){
alert($('#avlinvLmttQy').prop('title')+"은(는) 노출여부가 노출예약인 경우 필수입니다");
$('#avlinvLmttQy').focus();
return false;
}
}
//이미지 필수 체크
if((($('#delImg').val() != '' || $('#img').val() == '') && imgDropzone.files.length != 1)){
if(imgDropzone.files.length == 0){
alert("대표이미지(섬네일)은(는) 필수입니다");
}else{
alert("대표이미지(섬네일)은(는) 1개만 등록가능합니다");
}
$('#img-dropzone')[0].scrollIntoView();
// $('#img-dropzone').focus();
return false;
}else if(imgDropzone.files.length > 1){
alert("대표이미지(섬네일)은(는) 1개만 등록가능합니다");
$('#img-dropzone').focus();
return false;
}
//상품설명 필수체크
if(subsvcDc.val() == ''){
alert(subsvcDc.prop('title')+"은(는) 필수입니다");
CKEditorArray['#subsvcDc'].editing.view.focus();
return false;
}
//PC와 모바일 다르게 설정인 경우 모바일 상품설명 필수
if($('input[name="mblSubsvcDcPcSameAt"]:checked').val() == 'N'){
var mblSubsvcDc = $('#mblSubsvcDc');
mblSubsvcDc.val(fn_get_editor_data('#mblSubsvcDc'));
if(mblSubsvcDc.val().trim() == ''){
alert(mblSubsvcDc.prop('title')+"은(는) 필수입니다");
CKEditorArray['#mblSubsvcDc'].editing.view.focus();
return false;
}
}
return true;
}
/*수정하기*/
const fn_updateSubsvc = function (){
if(!validate()){
return false;
}
const url = '<c:url value="/mngr/goods/subsvc/updateSubsvc"/>';
var formData = new FormData($('#subsvcForm')[0]);
imgDropzone.files.forEach(function(file, index){
console.log("file",file);
//1개만 등록 되도록
if(index == 0){
formData.append('files',file);
}
});
console.log("formData",formData);
if (confirm(`구독서비스를 <spring:message code="confirm.common.update"/>`)) {
$.ajax({
type: 'post',
enctype: 'multipart/form-data',
url: url,
data: formData,
contentType: false,
processData: false,
success: function (data) {
try{
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('<spring:message code="success.common.update"/>');
//등록 후 수정화면으로 이동
window.location.reload();
} else {
alert('<spring:message code="fail.common.update"/>');
}
}catch (e) {
console.log(e);
alert('<spring:message code="fail.common.update"/>');
}
}
});
}
}
</script>
<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">구독서비스 수정 (상품번호 : ${resultMap.subsvcDtl.subsvcInnb})</h2>
<div class="page-title__btn-container">
<button onclick="fn_select_list()" class="btn outline"><spring:message code="button.list"/></button>
<button onclick="fn_updateSubsvc();return false;" class="btn primary"><spring:message code="button.update"/></button>
</div>
</div>
<form id="subsvcForm" method="post" action="" enctype="multipart/form-data">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="${resultMap.subsvcDtl.subsvcInnb}">
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${resultMap.paramVO.sopmalCd}">
<input type="hidden" id="srchSelSubsvcNm" name="srchSelSubsvcNm" value="${resultMap.paramVO.srchSelSubsvcNm}">
<input type="hidden" id="srchSubsvcNm" name="srchSubsvcNm" value="${resultMap.paramVO.srchSubsvcNm}">
<input type="hidden" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr" value="${resultMap.paramVO.srchSelSubsvcGnr}">
<input type="hidden" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="${resultMap.paramVO.srchSubsvcGnrNm}">
<c:forEach items="${resultMap.paramVO.srchArrSubsvcSttusCd}" var="srchSubsvcSttusCd" varStatus="status">
<input type="hidden" id="srchArrSubsvcSttusCd${status.count}" name="srchArrSubsvcSttusCd" value="${srchSubsvcSttusCd}">
</c:forEach>
<input type="hidden" id="srchExpsrDvCd" name="srchExpsrDvCd" value="${resultMap.paramVO.srchExpsrDvCd}">
<input type="hidden" id="sortDv" name="sortDv" value="${resultMap.paramVO.sortDv}">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="delImg" name="delImg" value="">
<input type="hidden" id="expsrBgnDt" name="expsrBgnDt" value="${resultMap.subsvcDtl.expsrBgnDt}">
<input type="hidden" id="expsrEndDt" name="expsrEndDt" value="${resultMap.subsvcDtl.expsrEndDt}">
<input type="hidden" id="usefulInvntryQy" name="usefulInvntryQy" value="${resultMap.subsvcDtl.usefulInvntryQy}">
<spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<input type="hidden" id="cdnurl" value="${cdnurl}"/>
<section id="section01" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">기본정보</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>기본정보</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 38%">
<col style="width: 12%;">
<col style="width: 38%">
</colgroup>
<tbody>
<tr>
<th>구독서비스명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="subsvcNm" name="subsvcNm" maxlength="100" value="${resultMap.subsvcDtl.subsvcNm}" required>
</div>
</td>
<th>구독기간<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="구독기간" id="subPd" name="subPd" maxlength="3" value="${resultMap.subsvcDtl.subPd}" required> 개월
</div>
</td>
</tr>
<tr>
<th>기수</th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="기수" id="subsvcGnr" name="subsvcGnr" value="${resultMap.subsvcDtl.subsvcGnr}" readonly> 기
</div>
</td>
<th>기수명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="기수명" id="subsvcGnrNm" name="subsvcGnrNm" maxlength="80" value="${resultMap.subsvcDtl.subsvcGnrNm}" required>
</div>
</td>
</tr>
<tr>
<th>배송횟수<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xsm number text-right" type="text" title="배송횟수" id="dlvyCnt" name="dlvyCnt" maxlength="3" value="${resultMap.subsvcDtl.dlvyCnt}" required> 회
</div>
</td>
<th>배송주기<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm" type="text" title="배송주기" id="dlvyCycle" name="dlvyCycle" maxlength="30" value="${resultMap.subsvcDtl.dlvyCycle}" required>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section02" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">판매정보</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>판매정보</caption>
<colgroup>
<col style="width: 12%;">
<col style="width: 38%">
<col style="width: 12%;">
<col style="width: 38%">
</colgroup>
<tbody>
<tr>
<th>구독료<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="구독료" id="subsvcCt" name="subsvcCt" maxlength="11" value="${resultMap.subsvcDtl.subsvcCt}" required> 円(엔)
</div>
</td>
<th>1회 배송비<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="1회 배송비" id="tmeDlvyAmt" name="tmeDlvyAmt" maxlength="11" value="${resultMap.subsvcDtl.tmeDlvyAmt}" required> 円(엔)
</div>
</td>
</tr>
<tr>
<th>소비자가</th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="소비자가" id="cnsmrpric" name="cnsmrpric" maxlength="11" value="${resultMap.subsvcDtl.cnsmrpric}"> 円(엔)
</div>
</td>
<th>실판매가<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="실판매가" id="selpric" name="selpric" maxlength="11" value="${resultMap.subsvcDtl.selpric}" readonly> 円(엔)
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section03" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">구독설정</h3>
<button type="button" class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>구독설정</caption>
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>재고<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="재고" id="invntryQy" name="invntryQy" maxlength="11" value="${resultMap.subsvcDtl.invntryQy}" required>
</div>
</td>
<th>가용재고</th>
<td>
<div class="td-inner">
<input class="input-text sm number text-right" type="text" title="가용재고" id="availQt" maxlength="11" value="${resultMap.subsvcDtl.availQt}" readonly>
</div>
</td>
</tr>
<tr>
<th>판매 상태</th>
<td colspan="2">
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${resultMap.subsvcSttusList}" var="subsvcSttus" varStatus="status">
<div class="custom-radio">
<input type="radio" id="subsvcSttusCd${status.count}" name="subsvcSttusCd" title="판매 상태" value="${subsvcSttus.cd}" <c:if test="${resultMap.subsvcDtl.subsvcSttusCd eq subsvcSttus.cd}">checked</c:if>/>
<label for="subsvcSttusCd${status.count}">${subsvcSttus.cdNm}</label>
<input type="hidden" value="${resultMap.subsvcDtl.subsvcSttusCd}" id="subsvcSttusCdChk"/>
</div>
</c:forEach>
</div>
</div>
</td>
</tr>
<tr>
<th>노출 여부</th>
<td colspan="3">
<div class="td-inner vertical">
<div class="custom-radio-container mt-10">
<c:forEach items="${resultMap.expsrDvList}" var="expsrDv" varStatus="status">
<div class="custom-radio">
<input type="radio" id="expsrDvCd${status.count}" name="expsrDvCd" title="노출 여부" value="${expsrDv.cd}" onclick="handleRadioClick2(this);" <c:if test="${resultMap.subsvcDtl.expsrDvCd eq expsrDv.cd}">checked</c:if>/>
<label for="expsrDvCd${status.count}">${expsrDv.cdNm}</label>
<input type="hidden" value="${resultMap.subsvcDtl.expsrDvCd}" id="expsrDvCdChk"/>
</div>
</c:forEach>
</div>
<div class="table-wrapper mt-10">
<table class="table">
<caption>노출 기간</caption>
<colgroup>
<col style="width: 16%;">
<col>
</colgroup>
<tbody id="expsrSet">
<tr>
<th>노출 기간</th>
<td>
<div class="td-inner">
<input type="text" id="expsrBgnDt_dt" class="datepicker" title="시작 날짜 선택" autocomplete="off" value="${fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[0]}" disabled>
<div class="timepicker-container">
<input type="text" class="bs-timepicker" id="expsrBgnDt_time" title="시작 시간 설정" value="${fn:split(fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[1], ':')[0]}:${fn:split(fn:split(resultMap.subsvcDtl.expsrBgnDt,' ')[1], ':')[1]}" disabled>
</div>
<span class="tilde">~</span>
<input type="text" id="expsrEndDt_dt" class="datepicker" title="종료 날짜 선택" autocomplete="off" value="${fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[0]}" disabled>
<div class="timepicker-container">
<input type="text" class="bs-timepicker" id="expsrEndDt_time" title="종료 시간 설정" value="${fn:split(fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[1], ':')[0]}:${fn:split(fn:split(resultMap.subsvcDtl.expsrEndDt,' ')[1], ':')[1]}" disabled>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
<tr>
<th>재고에 따른 판매</th>
<td colspan="3">
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${resultMap.invntryPolicyList}" var="invntryPolicy" varStatus="status">
<div class="custom-radio">
<input type="radio" id="invntryPolicyCd${status.count}" name="invntryPolicyCd" value="${invntryPolicy.cd}" onclick="handleRadioClickDisable(this);"<c:if test="${resultMap.subsvcDtl.invntryPolicyCd eq invntryPolicy.cd}">checked</c:if>/>
<label for="invntryPolicyCd${status.count}">${invntryPolicy.cdNm}</label>
</div>
<c:if test="${status.first}">
<div>
<span class="ml-4">(</span>
<input class="input-text number xsm ml-5 right" id="avlinvLmttQy" name="avlinvLmttQy" value="${resultMap.subsvcDtl.avlinvLmttQy}" type="text" title="해당 인풋에 대한 설명" <c:if test="${resultMap.subsvcDtl.invntryPolicyCd eq '02'}"> disabled</c:if> />
개 이하 일 때 품절 처리
<span class="ml-4">)</span>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="section07" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">구독서비스 설명</h3>
<button class="content-fold__btn"><span class="visually-hidden">접기</span></button>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>구독서비스 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>대표이미지(썸네일) 등록<span class="red-7">*</span></th>
<td>
<div class="td-inner vertical">
<div class="dropzone-wrapper">
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<div class="dropzone" id="img-dropzone">
</div><p class="fyi gray-7 mt-15">1개의 이미지만 등록가능합니다.</p>
</div>
</div>
</td>
</tr>
<tr>
<th>등록한 대표이미지(썸네일)</th>
<td>
<div class="td-inner" id="sortable">
<c:if test="${not empty resultMap.subsvcDtl.img}">
<div class="file-preview__container">
<div class="file-preview">
<span class="file-preview__number"></span>
<button class="file-preview__delete" id="file-preview__delete" onclick="deleteFileImg(this)">
<span class="visually-hidden">삭제</span></button>
<div class="file-preview__image">
<img src="<c:out value="${cdnurl}${resultMap.subsvcDtl.img}"/>" alt="구독서비스 이미지" onerror="this.src='/mngr/images/image_placeholder.png'" >
<input type="hidden" id="img" name="img" value="<c:out value="${resultMap.subsvcDtl.img}"/>">
</div>
</div>
</div>
</c:if>
</div>
</td>
</tr>
<tr>
<th>상품 설명<span class="red-7">*</span></th>
<td>
<div class="td-inner"><textarea class="textarea" title="상품 설명" cols="30" rows="10" id="subsvcDc" name="subsvcDc">${resultMap.subsvcDtl.subsvcDc}</textarea>
</div>
</td>
</tr>
<tr>
<th>모바일용 상세 설명 설정</th>
<td>
<div class="td-inner">
<div class="custom-radio-container mr-5">
<div class="custom-radio">
<input type="radio" id="mblSubsvcDcPcSameAt1" name="mblSubsvcDcPcSameAt" value="Y" <c:if test="${ resultMap.subsvcDtl.mblSubsvcDcPcSameAt eq 'Y'}">checked</c:if>>
<label for="mblSubsvcDcPcSameAt1">PC와 동일</label>
</div>
<div class="custom-radio">
<input type="radio" id="mblSubsvcDcPcSameAt2" name="mblSubsvcDcPcSameAt" value="N" <c:if test="${ resultMap.subsvcDtl.mblSubsvcDcPcSameAt eq 'N'}">checked</c:if>>
<label for="mblSubsvcDcPcSameAt2">PC와 모바일 다르게 설정</label>
</div>
</div>
</div>
</td>
</tr>
<tr class="mobileSubsvcCn">
<th>모바일용 상세 설명<span class="red-7">*</span></th>
<td>
<div class="td-inner"><textarea class="textarea" title="모바일용 상품 설명" cols="30" rows="10" id="mblSubsvcDc" name="mblSubsvcDc">${resultMap.subsvcDtl.mblSubsvcDc}</textarea>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
<div id="modalDiv">
</div>
<%--관리자 수정이력 내역보기 모달 --%>
<div id="logDiv"></div>
</main>
<script>
// Dropzone 파일업로드
if ($("#img-dropzone").length > 0) {
Dropzone.autoDiscover = false;
var imgDropzone = new Dropzone("#img-dropzone", {
url: "/file-upload",
maxFiles: 1,
maxFilesize: 20,
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "클릭하거나 파일을 여기로 드래그하세요",
dictRemoveFile: "삭제",
acceptedFiles: "${acceptFileExtensions}",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
});
}
</script>
</body>
</html>

View File

@@ -752,7 +752,6 @@
if ('25' === data.ordrSttusCd) { if ('25' === data.ordrSttusCd) {
header += ' <button type="button" id="ordrSttus35" class="btn-' + currTr + ' btn prep xsm">상품준비</button>'; header += ' <button type="button" id="ordrSttus35" class="btn-' + currTr + ' btn prep xsm">상품준비</button>';
header += ' <button type="button" onclick="fn_dlivy_procs_popup_check_ordrs(\'/mngr/ordr/dlivy/selectOrdrDlivyPopupForm\',\'팝업\',\'1400\',\'840\');" class="btn primary xsm btn-dlivy-procs-pop-' + data.ordrSttusCd + '">출고처리</button>';
/* header += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */ /* header += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */
} }
@@ -1348,7 +1347,6 @@
if ('25' === prevOrderSttusCd) { if ('25' === prevOrderSttusCd) {
footer += ' <button type="button" id="ordrSttus35" class="btn-' + prevTrClass + ' btn prep xsm">상품준비</button>'; footer += ' <button type="button" id="ordrSttus35" class="btn-' + prevTrClass + ' btn prep xsm">상품준비</button>';
footer += ' <button type="button" onclick="fn_dlivy_procs_popup_check_ordrs(\'/mngr/ordr/dlivy/selectOrdrDlivyPopupForm\',\'팝업\',\'1400\',\'840\');" class="btn primary xsm btn-dlivy-procs-pop-' + data.ordrSttusCd + '">출고처리</button>';
/* footer += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */ /* footer += ' <button type="button" id="ordrSttus85" class="btn-' + currTr + ' btn gray xsm">결제취소</button>'; */
} }

View File

@@ -1783,7 +1783,6 @@
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
<button type="button" class="btn-ordr-sttus-35 btn gray">상품 준비</button> <button type="button" class="btn-ordr-sttus-35 btn gray">상품 준비</button>
<button type="button" onclick="fn_dlivy_procs_popup_check_ordrs('${dtl.ordrInnb}');" class="btn primary">출고 처리</button>
</c:if> </c:if>
<c:if test="${'35' eq dtl.ordrSttusCd && dtl.sknEnvrnCd ne 'POS'}"> <!-- 상품준비 --> <c:if test="${'35' eq dtl.ordrSttusCd && dtl.sknEnvrnCd ne 'POS'}"> <!-- 상품준비 -->
<a href="javascript:void(0);" id="canclPayment" class="btn outline">결제 취소</a> <a href="javascript:void(0);" id="canclPayment" class="btn outline">결제 취소</a>

View File

@@ -0,0 +1,107 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.Date" %>
<%@ 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 : SubsvcOrderGoodsInfoListPop.jsp
Description : 구독서비스 구독자조회 - 배송상품 목록 팝업
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div id="subsvcOrdrrGoodsInfoListPop" class="modal" style="max-width: 700px;">
<div class="modal-header">
<h4>배송상품 목록</h4>
</div>
<br>
<div class="modal-content">
<div class="form-control-container mb-10">
<div class="left">
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class=" table-wrapper mb-40">
<table class="table">
<caption>주문자/주문번호 정보</caption>
<colgroup>
<col style="width: 15%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 35%;">
</colgroup>
<tbody>
<tr>
<th>구독서비스</th>
<td>
<div class="td-inner"><c:out value="${resultMap.subsvcInfo.subsvcNm}"/></div>
</td>
<th>기수명</th>
<td>
<div class="td-inner"><c:out value="${resultMap.subsvcInfo.subsvcGnr}"/>기(<c:out value="${resultMap.subsvcInfo.subsvcGnrNm}"/>)</div>
</td>
</tr>
</tbody>
</table>
</div>
<br/>
<div class=" table-wrapper mb-40">
<table class="table vertical" style="max-height: 200px;">
<caption>배송정보</caption>
<colgroup>
<col style="width: 15%;">
<col style="width: 20%;">
<col style="width: 50%;">
<col style="width: 15%;">
</colgroup>
<thead>
<tr>
<th>순번</th>
<th colspan="2">상품명</th>
<th>적용횟수</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="goods" varStatus="status">
<tr>
<td><c:out value="${goods.rnum}"/></td>
<td><img src='<c:out value="${cdnurl}${goods.goodsImgCours}"/>' onerror="this.src='/pc/images/image_placeholder.png'" alt='<c:out value="${goods.goodsNm}"/>' width="56px" height="56px"></td>
<td>
<div class="order-section__product-info">
<span class="order-section__product-productTitle"><c:out value="${goods.goodsNm}"/></span>
<span class="option-text">
<span class="option-badge">옵션</span> <c:out value="${goods.optnNm1}"/>:<c:out value="${goods.optnVal1}"/>
</span>
</div>
</td>
<td><fmt:formatNumber value="${goods.applyCnt}" pattern="#,###"/></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>
</div>
<div class="modal-footer">
<a href="#" id="btn_close_modal_bbsC" rel="modal:close" class="btn outline">닫기</a>
</div>
<a href="#close-modal" rel="modal:close" class="close-modal ">Close</a>
</div>
<script src="/mngr/js/script.js" defer=""></script>

View File

@@ -0,0 +1,106 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.Date" %>
<%@ 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 : SubsvcOrderMbrInfoListPop.jsp
Description : 구독서비스 구독자조회 - 구독자 목록 팝업
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div id="subsvcOrderMbrInfoListPop" class="modal" style="max-width: 700px;">
<div class="modal-header">
<h4>구독자 목록</h4>
</div>
<br>
<div class="modal-content">
<div class="form-control-container mb-10">
<div class="left">
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class=" table-wrapper mb-40">
<table class="table">
<caption>구독서비스 정보</caption>
<colgroup>
<col style="width: 15%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 35%;">
</colgroup>
<tbody>
<tr>
<th>구독서비스</th>
<td>
<div class="td-inner"><c:out value="${resultMap.subsvcInfo.subsvcNm}"/></div>
</td>
<th>기수명</th>
<td>
<div class="td-inner"><c:out value="${resultMap.subsvcInfo.subsvcGnr}"/>기(<c:out value="${resultMap.subsvcInfo.subsvcGnrNm}"/>)</div>
</td>
</tr>
</tbody>
</table>
</div>
<br/>
<div class=" table-wrapper mb-40">
<table class="table vertical" style="max-height: 200px;">
<caption>배송정보</caption>
<colgroup>
<col style="width: 10%;">
<col style="width: 20%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th>순번</th>
<th>주문번호</th>
<th>구독자</th>
<th>최종차수</th>
<th>최종처리일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="mbr" varStatus="status">
<tr>
<td><c:out value="${mbr.rnum}"/></td>
<td><c:out value="${mbr.ordrInnb}"/></td>
<td><c:out value="${mbr.mbrNm}"/> (<c:out value="${mbr.mbrId}"/>/<c:out value="${mbr.grade}"/>)</td>
<td><c:out value="${mbr.lastProcsOdr}"/>회</td>
<fmt:parseDate value="${mbr.lastPrcsDt}" pattern="yyyy-MM-dd HH:mm:ss" var="parsePrcsDt"/>
<fmt:formatDate value="${parsePrcsDt }" var="formatPrcsDt" pattern="yyyy-MM-dd"/>
<td><c:out value="${formatPrcsDt}"/></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>
</div>
<div class="modal-footer">
<a href="#" id="btn_close_modal_bbsC" rel="modal:close" class="btn outline">닫기</a>
</div>
<a href="#close-modal" rel="modal:close" class="close-modal ">Close</a>
</div>
<script src="/mngr/js/script.js" defer=""></script>

View File

@@ -0,0 +1,124 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.Date" %>
<%@ 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 : subsvcOrdrDlvyListPop.jsp
Description : 구독서비스 상품준비 관리 배송내역 팝업
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-07 jazz 최초 생성
--%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div id="subsvcOrdrDlvyListPop" class="modal" style="max-width: 1000px;">
<div class="modal-header">
<h4>배송내역</h4>
</div>
<br>
<div class="modal-content">
<div class="form-control-container mb-10">
<div class="left">
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class=" table-wrapper mb-40">
<table class="table">
<caption>주문자/주문번호 정보</caption>
<colgroup>
<col style="width: 15%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 35%;">
</colgroup>
<tbody>
<tr>
<th>주문자</th>
<td>
<div class="td-inner">
<c:if test="${not empty resultMap.list}">
${resultMap.list[0].mbrNm} (${resultMap.list[0].mbrId}/${resultMap.list[0].grade})
</c:if>
</div>
</td>
<th>주문번호</th>
<td>
<div class="td-inner">
<c:if test="${not empty resultMap.list}">${resultMap.list[0].ordrInnb}</c:if>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<br/>
<div class=" table-wrapper mb-40">
<table class="table vertical" style="max-height: 200px;">
<caption>배송정보</caption>
<colgroup>
<col style="width: 5%;">
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 35%;">
<col style="width: 15%;">
<col style="width: 15%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th>차수</th>
<th>발생일자</th>
<th colspan="2">상품명</th>
<th>정가</th>
<th>판매가</th>
<th>상태</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="dlvy" varStatus="status">
<tr>
<td><c:out value="${dlvy.rnum}"/></td>
<fmt:parseDate value="${dlvy.procsDt}" pattern="yyyy-MM-dd HH:mm:ss" var="parsePrcsDt"/>
<fmt:formatDate value="${parsePrcsDt }" var="formatPrcsDt" pattern="yyyy-MM-dd"/>
<td><c:out value="${formatPrcsDt}"/></td>
<td><img src='<c:out value="${cdnurl}${dlvy.goodsImgCours}"/>' onerror="this.src='/pc/images/image_placeholder.png'" alt='<c:out value="${dlvy.goodsNm}"/>' width="56px" height="56px"></td>
<td>
<div class="order-section__product-info">
<span class="order-section__product-productTitle"><c:out value="${dlvy.goodsNm}"/></span>
<span class="option-text">
<span class="option-badge">옵션</span> <c:out value="${dlvy.optnNm1}"/>:<c:out value="${dlvy.optnVal1}"/>
</span>
</div>
</td>
<td><fmt:formatNumber value="${dlvy.cnsmrpric}" pattern="#,###"/></td>
<td><fmt:formatNumber value="${dlvy.slepric}" pattern="#,###"/></td>
<td><c:out value="${dlvy.ordrSttus}"/></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>
</div>
<div class="modal-footer">
<a href="#" id="btn_close_modal_bbsC" rel="modal:close" class="btn outline">닫기</a>
</div>
<a href="#close-modal" rel="modal:close" class="close-modal ">Close</a>
</div>
<script src="/mngr/js/script.js" defer=""></script>

View File

@@ -0,0 +1,130 @@
<%@ 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 : SubsvcOrdrList.jsp
Description : 구독서비스 상품준비 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-05 jazz 최초 생성
--%>
<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="sortDvView" id="sortDvView" onchange="fn_select_list(1);return false;">
<option value="subsvcGnrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrAsc'}">selected="selected"</c:if>>구독서비스+기수 오름차순</option>
<option value="subsvcGnrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrDesc'}">selected="selected"</c:if>>구독서비스+기수 내림차순</option>
<option value="mbrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'mbrAsc'}">selected="selected"</c:if>>주문자 오름차순</option>
<option value="mbrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'mbrDesc'}">selected="selected"</c:if>>주문자 내림차순</option>
<option value="ordrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'ordrAsc'}">selected="selected"</c:if>>주문번호 오름차순</option>
<option value="ordrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'ordrDesc'}">selected="selected"</c:if>>주문번호 내림차순</option>
<option value="lastPrcsDtAsc" <c:if test="${resultMap.paramVO.sortDv eq 'lastPrcsDtAsc'}">selected="selected"</c:if>>최종처리일 오름차순</option>
<option value="lastPrcsDtDesc" <c:if test="${resultMap.paramVO.sortDv eq 'lastPrcsDtDesc'}">selected="selected"</c:if>>최종처리일 내림차순</option>
</select>
</div>
<div class="select-box">
<select id="pageUnitView" name="pageUnitView" title="페이지당 출력될 목록건수" onchange="fn_select_list(1,this.value);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 class="btn sm dark" onclick="fn_allOrdrReady_check();return false;">상품준비 일괄처리</button>
</div>
<div class="center">
</div>
</div>
<hr class="spacing">
<div class="table-wrapper">
<table class="table vertical">
<caption>구독서비스 목록</caption>
<colgroup>
<col style="width: 4%;">
<col style="width: 20%;">
<col style="width: 6%;">
<col style="width: 10%;">
<col style="width: 15%;">
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th>
<label class="b-checkbox checkbox is-medium ">
<input type="checkbox" id="checkAll" value="">
<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>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="subsvcOrdr" varStatus="status">
<tr<c:if test="${lastProcsOdr > mbrLastProcsOdr}"> class="sendOut-info__reseller"</c:if>>
<td>
<label class="b-checkbox checkbox is-medium check-all">
<input type="checkbox" name="arrCheck" class="arrCheck" value="${subsvcOrdr.ordrInnb}@${subsvcOrdr.ordrGoodsInnb}@${subsvcOrdr.ordrGoodsOptnInnb}@${subsvcOrdr.ordrDlvyInnb}">
<span class="check"></span>
</label>
</td>
<td><c:out value="${subsvcOrdr.subsvcNm}"/></td>
<td><c:out value="${subsvcOrdr.subsvcGnr}"/>기</td>
<td><c:out value="${subsvcOrdr.subsvcGnrNm}"/></td>
<td><c:out value="${subsvcOrdr.mbrNm}"/></br>(<c:out value="${subsvcOrdr.mbrId}"/>/<c:out value="${subsvcOrdr.grade}"/>)</td>
<td><c:out value="${subsvcOrdr.ordrInnb}"/></td>
<td><c:out value="${subsvcOrdr.curtProcsOdr}"/>회</td>
<td><c:out value="${subsvcOrdr.mbrLastProcsOdr}"/>회 <button class="btn xsm outline light-gray" type="button" onclick="fn_open_modal('#modalDiv','#subsvcOrdrDlvyListPop','<c:url value ='/mngr/ordr/subsvc/selectSubsvcOrdrDlvyListPop'/>',{'ordrInnb':'<c:out value="${subsvcOrdr.ordrInnb}"/>'}); return false;">배송내역</button></td>
<fmt:parseDate value="${subsvcOrdr.lastPrcsDt}" pattern="yyyy-MM-dd HH:mm:ss" var="parseLastPrcsDt"/>
<fmt:formatDate value="${parseLastPrcsDt }" var="formatLastPrcsDt" pattern="yyyy-MM-dd"/>
<td><c:out value="${ formatLastPrcsDt }"/></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">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>

View File

@@ -0,0 +1,513 @@
<%@ 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 : SubsvcOrdrListFrom.jsp
Description : 구독서비스 상품준비 목록 조회 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-05 jazz 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
</head>
<script>
var initFlag = true;
$(document).ready(function () {
let pageIndex = $("#pageIndex").val();
let pageUnit = $("#pageUnit").val();
let srchSelSubsvcNm = $('#srchSelSubsvcNm').val();
// event 제어
fn_event();
if(srchSelSubsvcNm != ''){
fn_getsubsvcGnr(srchSelSubsvcNm);
}else{
// 목록 조회
fn_select_list(pageIndex, pageUnit);
}
// 엔터키 검색
$('#listForm').on('keydown', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
fn_select_list(1);
}
});
});
/*********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function (pageIndex, pageUnit) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
//정렬기준 셋팅
if(typeof $('#sortDvView') !== undefined && $('#sortDvView').val() !== undefined){
$('#sortDv').val($('#sortDvView').val());
}
//한페이지 목록개수 셋팅
if(typeof $('#pageUnitView') !== undefined && $('#pageUnitView').val() !== undefined){
$('#pageUnit').val($('#pageUnitView').val());
}
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: "<c:url value="/mngr/ordr/subsvc/selectSubsvcOrdrList"/>",
data: dataStr,
success: function (resultHtml) {
$('#pageDiv').html(resultHtml);
$('#sortDv').val($('#sortDvView').val());
$('#pageUnitView').niceSelect();
$('#sortDvView').niceSelect();
}
});
}
/* 현제uri에 프로토콜, 호스트, 쿼리스티링을 제외하여 history갱신 */
history.replaceState({}, null, location.pathname);
/* ****************************
* event 제어
******************************/
const fn_event = function () {
/* 검색조건 구독서비스 선택 시 회차 조회 이벤트*/
$(document).on('change', '#srchSelSubsvcNm', function(){
var srchSelSubsvcNm = $(this).val();
if(fn_is_empty(srchSelSubsvcNm)){
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
}else{
//해당구독서비스 기수조회
fn_getsubsvcGnr(srchSelSubsvcNm);
}
});
/* 목록 > 전체선택 체인지 이벤트 */
$(document).on('change', '#checkAll', function () {
let checkbox = $(this).closest('table').find('input[name="arrCheck"]');
$(checkbox).prop('checked', false);
$(checkbox).prop('checked', $(this).is(':checked'));
});
}
/* ****************************
* 해당구독서비스 기수조회 AJAX
******************************/
const fn_getsubsvcGnr = function (srchSelSubsvcNm) {
$.ajax({
type: 'post',
url: '<c:url value="/mngr/goods/subsvc/selectSrchSubsvcGnrListAjax"/>',
data: {
'srchSelSubsvcNm': srchSelSubsvcNm
},
success: function (data) {
if (data.resBody != null) {
const result = JSON.parse(data.resBody.result);
const srchSubsvcGnrList = result.srchSubsvcGnrList;
if (srchSubsvcGnrList.length > 0) {
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
// $('#srchSubsvcGnr option').filter(function() {
// return $(this).val() !== '';
// }).remove();
for (let i = 0; i < srchSubsvcGnrList.length; i++) {
const srchSubsvcGnr = srchSubsvcGnrList[i];
var check = "";
if(srchSubsvcGnr.subsvcGnr == '${resultMap.paramVO.srchSelSubsvcGnr}'){
check ="selected"
}
if(initFlag == true){
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '" '+ check+'>' + srchSubsvcGnr.subsvcGnrNm + '</option>');
fn_select_list();
initFlag = false;
}else{
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '">' + srchSubsvcGnr.subsvcGnrNm + '</option>');
}
}
$('#srchSelSubsvcGnr').niceSelect('update');
}
}
},
error: function (data) {
fn_proc_error_message(data);
}
});
}
/**
* 체크박스 전체 처리
* */
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);
}
}
}
/*********************************************************
* 선택된 대상자 구독서비스 상품준비 일괄처리 AJAX
*********************************************************/
const fn_allOrdrReady_check = function () {
let url = '<c:url value="/mngr/ordr/subsvc/updateSubsvcOrdrReady"/>';
let check = $("input[name='arrCheck']:checked");
let param = $('#listForm').serialize();
if (check.length === 0) {
alert("선택된 대상이 없습니다");
return false;
}
/** 출고상품 선택 확인*/
if($('#goodsInnb').val() == undefined){
alert("출고상품 선택이 필요합니다");
return false;
}
if (confirm('선택된 주문을 상품준비 일괄처리 하시겠습니까?')) {
$.ajax({
type: 'post',
url: url,
data: param,
dataType: "json",
success: function (data) {
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('<spring:message code="success.common.process"/>');
fn_select_list();
}else{
alert('<spring:message code="fail.common.save"/>');
}
}
})
}
}
/* 관리자 주문 > 상품조회 > 검색조건 > 날짜 선택 이벤트 */
$(document).on('click', '.dateRange-btn', function () {
const date = $(this).attr('id');
$('.dateRange-btn').removeClass('selected');
$('#' + date).addClass('selected');
const datepicker = $(this).closest('.td-inner').find('.datepicker');
const start = $(datepicker[0]).attr('id');
const end = $(datepicker[1]).attr('id');
if ('allDays' === date) {
$('#' + start + ', #' + end).val('');
$('#datePeriod').val(date);
return false;
}
fn_set_date(start, end, end, date);
$('#datePeriod').val(date);
});
//카테고리 선택시 카테고리 아이디 저장(검색용)
$(document).on('change', 'select[id^=ctgryDepth]', function () {
const ctgryOptn = $(this).val()
if(!fn_is_empty(ctgryOptn)){
$('#ctgryId').val(ctgryOptn)
}else{
//value가 ''인 카테고리 선택할경우
let currentCtgryDepth = parseInt($(this).attr('id').replace('ctgryDepth', ''));
//1차 카테고리가 아닐 경우 이전 카테고리 번호 가져오기
if(currentCtgryDepth !== 1){
$('#ctgryId').val($('#ctgryDepth' + (currentCtgryDepth - 1)).val())
}else{
//1차 카테고리 일경우 카테고리 번호 비우기
$('#ctgryId').val('')
}
}
})
//초기화버튼
$(document).on('click', '#resetBtn', function () {
$('#listForm')[0].reset();
$('#srchSelSubsvcNm').niceSelect('update');
$('#srchSelSubsvcNm').trigger("change");
$('#srchSelSubsvcGnr').niceSelect('update');
fn_select_list(1);
})
let selected = [];
/*********************************************************
* 상품 검색 팝업 > 상품 목록 조회
* param : pageIndex, selected
******************************************************** */
const fn_goods_search_popup_list = function (pageIndex, selected) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
$('#popupListForm').find('input[name=pageIndex]').eq(0).val(pageIndex);
const popupListForm = $("#popupListForm").serialize();
$.ajax({
type: "post",
url: "<c:url value="/mngr/goods/goodsmngr/selectGoodsSrchPopupList"/>",
data: popupListForm,
success: function (resultHtml) {
$('#goodsList').empty();
$('#goodsList').html(resultHtml);
}
});
}
/*********************************************************
* 상품검색 팝업에서 선택된 상품을 출고상품에 셋팅
* param 없음
******************************************************** */
function fn_select_goods_search() {
let selected = [];
$('#appendList tr').each(function () {
const goodsId = $(this).attr('id').replace('choiseListId', '');
const goodsOptnInnb = $(this).find('input[name="goodsOptnInnb"]').val();
const optnTy = $(this).find('input[name="optnTy"]').val();
const goodsImg = $(this).find('input[name="goodsImgCours"]').val();
const goodsNm = $(this).find('input[name="goodsNm"]').val();
const goodsPrice = $(this).find('input[name="slepric"]').val();
const goodsSttusNm = $(this).find('input[name="goodsSttusNm"]').val();
const expsrNm = $(this).find('input[name="expsrNm"]').val();
selected.push({
goodsId: goodsId,
goodsOptnInnb: goodsOptnInnb,
optnTy: optnTy,
goodsImg: goodsImg,
goodsNm: goodsNm,
goodsPrice: goodsPrice,
goodsSttusNm: goodsSttusNm,
expsrNm: expsrNm
});
});
// 각 화면에 맞춰서 HTML 변경 START
var tableBody = $("#parentGoodsContainer");
tableBody.empty();
selected.forEach((good, index) => {
if(index == 0) {
var productHtml = `
<div class="product-group__item">
<input type="hidden" id="goodsInnb" name="goodsInnb" value="` + good.goodsId + `">
<input type="hidden" id="goodsOptnInnb" name="goodsOptnInnb" value="` + good.goodsOptnInnb + `">
<input type="hidden" id="optnTy" name="optnTy" value="` + good.optnTy + `">
<span class="product-group__item-number">` + (index + 1) + `</span>
<div class="product-group__image">
<img src="` + good.goodsImg + `" width="140" alt="` + good.goodsNm + `"
onerror="this.src='/mngr/images/image_placeholder.png'"
>
</div>
<div class="product-group__description">
<p>` + good.goodsNm + `</p>
<p class="product-group__description-price">` + fn_format_comma(good.goodsPrice) + `${curUnit}</p>
</div>
</div>
`;
}
tableBody.append(productHtml);
});
// 각 화면에 맞춰서 HTML 변경 END
fn_close_modal('product-search');
}
/*********************************************************
* 배송내역 팝업
*********************************************************/
const fn_select_dlvy_pop = function (ordrInnb) {
$.ajax({
type: 'post',
url: "<c:url value ='/mngr/ordr/subsvc/selectSubsvcOrdrDlvyListPop'/>",
data: {ordrInnb: ordrInnb},
success: function (data) {
alert(data);
$("#modalDiv").empty();
$("#modalDiv").html(data);
$("#board-list-registration").modal();
}
});
}
</script>
<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">
</div>
</div>
<form id='listForm' name="listForm" method="post" action="<c:url value="/mngr/goods/subsvc/selectSubsvcList"/>">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="sortDv" name="sortDv" value="${ resultMap.paramVO.sortDv }">
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="">
<section class="content-section" id="search-section">
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>구독서비스</th>
<td colspan="3">
<div class="td-inner">
<div class="select-box">
<select title="구독서비스" id="srchSelSubsvcNm" name="srchSelSubsvcNm">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq ''}">selected="selected"</c:if>>전체</option>
<c:forEach items="${resultMap.srchSubsvcList}" var="srchSubsvc" varStatus="status">
<option value="${srchSubsvc.subsvcNm}" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq srchSubsvc.subsvcNm}">selected="selected"</c:if>>${srchSubsvc.subsvcNm}</option>
</c:forEach>
</select>
</div>
<div class="select-box">
<select title="구독서비스회차" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcGnr eq ''}">selected="selected"</c:if>>전체</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<th>구독서비스명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcNm" name="srchSubsvcNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcNm }" />">
</div>
</td>
<th>기수명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcGnrNm }" />">
</div>
</td>
</tr>
<tr>
<th>당월 처리자</th>
<td colspan="3">
<div class="td-inner">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" id="srchCurMonExclude" name="srchCurMonExclude" value="Y" <c:if test="${resultMap.paramVO.srchCurMonExclude eq 'Y'}">checked</c:if>>
<span class="check"></span>
<span class="control-label">당월 처리자 제외</span>
</label>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="form-control-container">
<div class="left"></div>
<div class="center">
<button class="btn outline" id="resetBtn" type="button">초기화</button>
<button class="btn primary" id="searchBtn" type="button" onclick="fn_select_list(1);"><spring:message code="button.search"/> </button>
</div>
<div class="right">
</div>
</div>
</section>
<section class="" >
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>출고상품<span class="red-7">*</span>
<a type="button" onclick="fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;" class="btn xsm primary mt-5">검색</a>
</th>
<td>
<div class="td-inner">
<div id="parentGoodsContainer" class="product-group">
</div>
</div>
</td>
</tr>
</table>
</div>
</section>
<div id="pageDiv">
</div>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
<div id="modalDiv">asfasdfasdaf</div>
</main>
</body>
</html>

View File

@@ -0,0 +1,140 @@
<%@ 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 : SubsvcOrdrMappedList.jsp
Description : 구독서비스 상품변경 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.cdnurl')" var="cdnurl"/>
<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="sortDvView" id="sortDvView" onchange="fn_select_list(1);return false;">
<option value="subsvcGnrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrAsc'}">selected="selected"</c:if>>구독서비스+기수 오름차순</option>
<option value="subsvcGnrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrDesc'}">selected="selected"</c:if>>구독서비스+기수 내림차순</option>
<option value="mbrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'mbrAsc'}">selected="selected"</c:if>>주문자 오름차순</option>
<option value="mbrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'mbrDesc'}">selected="selected"</c:if>>주문자 내림차순</option>
<option value="ordrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'ordrAsc'}">selected="selected"</c:if>>주문번호 오름차순</option>
<option value="ordrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'ordrDesc'}">selected="selected"</c:if>>주문번호 내림차순</option>
<option value="lastPrcsDtAsc" <c:if test="${resultMap.paramVO.sortDv eq 'lastPrcsDtAsc'}">selected="selected"</c:if>>처리일 오름차순</option>
<option value="lastPrcsDtDesc" <c:if test="${resultMap.paramVO.sortDv eq 'lastPrcsDtDesc'}">selected="selected"</c:if>>처리일 내림차순</option>
</select>
</div>
<div class="select-box">
<select id="pageUnitView" name="pageUnitView" title="페이지당 출력될 목록건수" onchange="fn_select_list(1,this.value);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 class="btn sm dark" onclick="fn_allOrdrReady_check();return false;">상품준비 일괄처리</button>
</div>
<div class="center">
</div>
</div>
<hr class="spacing">
<div class="table-wrapper">
<table class="table vertical">
<caption>구독서비스 목록</caption>
<colgroup>
<col style="width: 4%;">
<col style="width: 15%;">
<col style="width: 4%;">
<col style="width: 7%;">
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 5%;">
<col style="width: 5%;">
<col style="width: 25%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th>
<label class="b-checkbox checkbox is-medium ">
<input type="checkbox" id="checkAll" value="">
<span class="check"></span>
</label>
</th>
<th>구독서비스</th>
<th>기수</th>
<th>기수명</th>
<th>주문자</th>
<th>주문번호</th>
<th>차수</th>
<th colspan="2">상품</th>
<th>처리일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="subsvcOrdrMapped" varStatus="status">
<tr<c:if test="${lastProcsOdr > mbrLastProcsOdr}"> class="sendOut-info__reseller"</c:if>>
<td>
<label class="b-checkbox checkbox is-medium check-all">
<input type="checkbox" name="arrCheck" class="arrCheck" value="${subsvcOrdrMapped.ordrInnb}@${subsvcOrdrMapped.ordrGoodsInnb}@${subsvcOrdrMapped.ordrGoodsOptnInnb}@${subsvcOrdrMapped.ordrDlvyInnb}">
<span class="check"></span>
</label>
</td>
<td><c:out value="${subsvcOrdrMapped.subsvcNm}"/></td>
<td><c:out value="${subsvcOrdrMapped.subsvcGnr}"/>기</td>
<td><c:out value="${subsvcOrdrMapped.subsvcGnrNm}"/></td>
<td><c:out value="${subsvcOrdrMapped.mbrNm}"/></br>(<c:out value="${subsvcOrdrMapped.mbrId}"/>/<c:out value="${subsvcOrdrMapped.grade}"/>)</td>
<td><c:out value="${subsvcOrdrMapped.ordrInnb}"/></td>
<td><c:out value="${subsvcOrdrMapped.curtProcsOdr}"/>회</td>
<td><img src='<c:out value="${cdnurl}${subsvcOrdrMapped.goodsImgCours}"/>' onerror="this.src='/pc/images/image_placeholder.png'" alt='<c:out value="${subsvcOrdrMapped.goodsNm}"/>' width="56px" height="56px"></td>
<td>
<div class="order-section__product-info">
<span class="order-section__product-productTitle"><c:out value="${subsvcOrdrMapped.goodsNm}"/></span>
<span class="option-text">
<span class="option-badge">옵션</span> <c:out value="${subsvcOrdrMapped.optnNm1}"/>:<c:out value="${subsvcOrdrMapped.optnVal1}"/>
</span>
</div>
</td>
<fmt:parseDate value="${subsvcOrdrMapped.updtDt}" pattern="yyyy-MM-dd HH:mm:ss" var="parseUpdtDt"/>
<fmt:formatDate value="${parseUpdtDt }" var="formatUpdtDt" pattern="yyyy-MM-dd"/>
<td><c:out value="${ formatUpdtDt }"/></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">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>

View File

@@ -0,0 +1,504 @@
<%@ 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 : SubsvcOrdrMappedListFrom.jsp
Description : 구독서비스 상품변경 목록 조회 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
</head>
<script>
var initFlag = true;
$(document).ready(function () {
let pageIndex = $("#pageIndex").val();
let pageUnit = $("#pageUnit").val();
let srchSelSubsvcNm = $('#srchSelSubsvcNm').val();
// event 제어
fn_event();
if(srchSelSubsvcNm != ''){
fn_getsubsvcGnr(srchSelSubsvcNm);
}else{
// 목록 조회
fn_select_list(pageIndex, pageUnit);
}
// 엔터키 검색
$('#listForm').on('keydown', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
fn_select_list(1);
}
});
});
/*********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function (pageIndex, pageUnit) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
//정렬기준 셋팅
if(typeof $('#sortDvView') !== undefined && $('#sortDvView').val() !== undefined){
$('#sortDv').val($('#sortDvView').val());
}
//한페이지 목록개수 셋팅
if(typeof $('#pageUnitView') !== undefined && $('#pageUnitView').val() !== undefined){
$('#pageUnit').val($('#pageUnitView').val());
}
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: "<c:url value="/mngr/ordr/subsvc/selectSubsvcOrdrMappedList"/>",
data: dataStr,
success: function (resultHtml) {
$('#pageDiv').html(resultHtml);
$('#sortDv').val($('#sortDvView').val());
$('#pageUnitView').niceSelect();
$('#sortDvView').niceSelect();
}
});
}
/* 현제uri에 프로토콜, 호스트, 쿼리스티링을 제외하여 history갱신 */
history.replaceState({}, null, location.pathname);
/* ****************************
* event 제어
******************************/
const fn_event = function () {
/* 검색조건 구독서비스 선택 시 회차 조회 이벤트*/
$(document).on('change', '#srchSelSubsvcNm', function(){
var srchSelSubsvcNm = $(this).val();
if(fn_is_empty(srchSelSubsvcNm)){
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
}else{
//해당구독서비스 기수조회
fn_getsubsvcGnr(srchSelSubsvcNm);
}
});
/* 목록 > 전체선택 체인지 이벤트 */
$(document).on('change', '#checkAll', function () {
let checkbox = $(this).closest('table').find('input[name="arrCheck"]');
$(checkbox).prop('checked', false);
$(checkbox).prop('checked', $(this).is(':checked'));
});
}
/* ****************************
* 해당구독서비스 기수조회 AJAX
******************************/
const fn_getsubsvcGnr = function (srchSelSubsvcNm) {
$.ajax({
type: 'post',
url: '<c:url value="/mngr/goods/subsvc/selectSrchSubsvcGnrListAjax"/>',
data: {
'srchSelSubsvcNm': srchSelSubsvcNm
},
success: function (data) {
if (data.resBody != null) {
const result = JSON.parse(data.resBody.result);
const srchSubsvcGnrList = result.srchSubsvcGnrList;
if (srchSubsvcGnrList.length > 0) {
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
// $('#srchSubsvcGnr option').filter(function() {
// return $(this).val() !== '';
// }).remove();
for (let i = 0; i < srchSubsvcGnrList.length; i++) {
const srchSubsvcGnr = srchSubsvcGnrList[i];
var check = "";
if(srchSubsvcGnr.subsvcGnr == '${resultMap.paramVO.srchSelSubsvcGnr}'){
check ="selected"
}
if(initFlag == true){
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '" '+ check+'>' + srchSubsvcGnr.subsvcGnrNm + '</option>');
fn_select_list();
initFlag = false;
}else{
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '">' + srchSubsvcGnr.subsvcGnrNm + '</option>');
}
}
$('#srchSelSubsvcGnr').niceSelect('update');
}
}
},
error: function (data) {
fn_proc_error_message(data);
}
});
}
/**
* 체크박스 전체 처리
* */
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);
}
}
}
/*********************************************************
* 선택된 대상자 구독서비스 상품준비 일괄처리 AJAX
*********************************************************/
const fn_allOrdrReady_check = function () {
let url = '<c:url value="/mngr/ordr/subsvc/updateSubsvcOrdrReady"/>';
let check = $("input[name='arrCheck']:checked");
let param = $('#listForm').serialize();
if (check.length === 0) {
alert("선택된 대상이 없습니다");
return false;
}
/** 출고상품 선택 확인*/
if($('#goodsInnb').val() == undefined){
alert("출고상품 선택이 필요합니다");
return false;
}
if (confirm('선택된 주문을 상품준비 일괄처리 하시겠습니까?')) {
$.ajax({
type: 'post',
url: url,
data: param,
dataType: "json",
success: function (data) {
const message = JSON.parse(data.resBody.result).message;
if(message == "success"){
alert('<spring:message code="success.common.process"/>');
fn_select_list();
}else{
alert('<spring:message code="fail.common.save"/>');
}
}
})
}
}
/* 관리자 주문 > 상품조회 > 검색조건 > 날짜 선택 이벤트 */
$(document).on('click', '.dateRange-btn', function () {
const date = $(this).attr('id');
$('.dateRange-btn').removeClass('selected');
$('#' + date).addClass('selected');
const datepicker = $(this).closest('.td-inner').find('.datepicker');
const start = $(datepicker[0]).attr('id');
const end = $(datepicker[1]).attr('id');
if ('allDays' === date) {
$('#' + start + ', #' + end).val('');
$('#datePeriod').val(date);
return false;
}
fn_set_date(start, end, end, date);
$('#datePeriod').val(date);
});
//카테고리 선택시 카테고리 아이디 저장(검색용)
$(document).on('change', 'select[id^=ctgryDepth]', function () {
const ctgryOptn = $(this).val()
if(!fn_is_empty(ctgryOptn)){
$('#ctgryId').val(ctgryOptn)
}else{
//value가 ''인 카테고리 선택할경우
let currentCtgryDepth = parseInt($(this).attr('id').replace('ctgryDepth', ''));
//1차 카테고리가 아닐 경우 이전 카테고리 번호 가져오기
if(currentCtgryDepth !== 1){
$('#ctgryId').val($('#ctgryDepth' + (currentCtgryDepth - 1)).val())
}else{
//1차 카테고리 일경우 카테고리 번호 비우기
$('#ctgryId').val('')
}
}
})
//초기화버튼
$(document).on('click', '#resetBtn', function () {
$('#listForm')[0].reset();
$('#srchSelSubsvcNm').niceSelect('update');
$('#srchSelSubsvcNm').trigger("change");
$('#srchSelSubsvcGnr').niceSelect('update');
fn_select_list(1);
})
let selected = [];
/*********************************************************
* 상품 검색 팝업 > 상품 목록 조회
* param : pageIndex, selected
******************************************************** */
const fn_goods_search_popup_list = function (pageIndex, selected) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
$('#popupListForm').find('input[name=pageIndex]').eq(0).val(pageIndex);
const popupListForm = $("#popupListForm").serialize();
$.ajax({
type: "post",
url: "<c:url value="/mngr/goods/goodsmngr/selectGoodsSrchPopupList"/>",
data: popupListForm,
success: function (resultHtml) {
$('#goodsList').empty();
$('#goodsList').html(resultHtml);
}
});
}
/*********************************************************
* 상품검색 팝업에서 선택된 상품을 출고상품에 셋팅
* param 없음
******************************************************** */
function fn_select_goods_search() {
let selected = [];
$('#appendList tr').each(function () {
const goodsId = $(this).attr('id').replace('choiseListId', '');
const goodsOptnInnb = $(this).find('input[name="goodsOptnInnb"]').val();
const optnTy = $(this).find('input[name="optnTy"]').val();
const goodsImg = $(this).find('input[name="goodsImgCours"]').val();
const goodsNm = $(this).find('input[name="goodsNm"]').val();
const goodsPrice = $(this).find('input[name="slepric"]').val();
const goodsSttusNm = $(this).find('input[name="goodsSttusNm"]').val();
const expsrNm = $(this).find('input[name="expsrNm"]').val();
selected.push({
goodsId: goodsId,
goodsOptnInnb: goodsOptnInnb,
optnTy: optnTy,
goodsImg: goodsImg,
goodsNm: goodsNm,
goodsPrice: goodsPrice,
goodsSttusNm: goodsSttusNm,
expsrNm: expsrNm
});
});
// 각 화면에 맞춰서 HTML 변경 START
var tableBody = $("#parentGoodsContainer");
tableBody.empty();
selected.forEach((good, index) => {
if(index == 0) {
var productHtml = `
<div class="product-group__item">
<input type="hidden" id="goodsInnb" name="goodsInnb" value="` + good.goodsId + `">
<input type="hidden" id="goodsOptnInnb" name="goodsOptnInnb" value="` + good.goodsOptnInnb + `">
<input type="hidden" id="optnTy" name="optnTy" value="` + good.optnTy + `">
<span class="product-group__item-number">` + (index + 1) + `</span>
<div class="product-group__image">
<img src="` + good.goodsImg + `" width="140" alt="` + good.goodsNm + `"
onerror="this.src='/mngr/images/image_placeholder.png'"
>
</div>
<div class="product-group__description">
<p>` + good.goodsNm + `</p>
<p class="product-group__description-price">` + fn_format_comma(good.goodsPrice) + `${curUnit}</p>
</div>
</div>
`;
}
tableBody.append(productHtml);
});
// 각 화면에 맞춰서 HTML 변경 END
fn_close_modal('product-search');
}
</script>
<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">
</div>
</div>
<form id='listForm' name="listForm" method="post" action="<c:url value="/mngr/ordr/subsvc/selectSubsvcOrdrMappedList"/>">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="sortDv" name="sortDv" value="${ resultMap.paramVO.sortDv }">
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="">
<section class="content-section" id="search-section">
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>구독서비스</th>
<td colspan="3">
<div class="td-inner">
<div class="select-box">
<select title="구독서비스" id="srchSelSubsvcNm" name="srchSelSubsvcNm">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq ''}">selected="selected"</c:if>>전체</option>
<c:forEach items="${resultMap.srchSubsvcList}" var="srchSubsvc" varStatus="status">
<option value="${srchSubsvc.subsvcNm}" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq srchSubsvc.subsvcNm}">selected="selected"</c:if>>${srchSubsvc.subsvcNm}</option>
</c:forEach>
</select>
</div>
<div class="select-box">
<select title="구독서비스회차" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcGnr eq ''}">selected="selected"</c:if>>전체</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<th>구독서비스명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcNm" name="srchSubsvcNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcNm }" />">
</div>
</td>
<th>기수명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcGnrNm }" />">
</div>
</td>
</tr>
<tr>
<th>주문자명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="주문자명" id="srchMbrNm" name="srchMbrNm" value="<c:out value="${ resultMap.paramVO.srchMbrNm }" />">
</div>
</td>
<th>주문자ID</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="주문자ID" id="srchMbrId" name="srchMbrId" value="<c:out value="${ resultMap.paramVO.srchMbrId }" />">
</div>
</td>
</tr>
<tr>
<th>주문번호</th>
<td colspan="3">
<div class="td-inner">
<input class="input-text xl" type="text" title="주문번호" id="srchOrdrInnb" name="srchOrdrInnb" value="<c:out value="${ resultMap.paramVO.srchOrdrInnb }" />">
</div>
</td>
</tr>
</table>
</div>
<div class="form-control-container">
<div class="left"></div>
<div class="center">
<button class="btn outline" id="resetBtn" type="button">초기화</button>
<button class="btn primary" id="searchBtn" type="button" onclick="fn_select_list(1);"><spring:message code="button.search"/> </button>
</div>
<div class="right">
</div>
</div>
</section>
<section class="" >
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>출고상품<span class="red-7">*</span>
<a type="button" onclick="fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;" class="btn xsm primary mt-5">검색</a>
</th>
<td>
<div class="td-inner">
<div id="parentGoodsContainer" class="product-group">
</div>
</div>
</td>
</tr>
</table>
</div>
</section>
<div id="pageDiv">
</div>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
<div id="modalDiv">asfasdfasdaf</div>
</main>
</body>
</html>

View File

@@ -0,0 +1,124 @@
<%@ 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 : SubsvcOrdrMbrList.jsp
Description : 구독서비스 구독자 조회 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<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="sortDvView" id="sortDvView" onchange="fn_select_list(1);return false;">
<option value="subsvcGnrAsc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrAsc'}">selected="selected"</c:if>>구독서비스+기수 오름차순</option>
<option value="subsvcGnrDesc" <c:if test="${resultMap.paramVO.sortDv eq 'subsvcGnrDesc'}">selected="selected"</c:if>>구독서비스+기수 내림차순</option>
<option value="subscriberAsc" <c:if test="${resultMap.paramVO.sortDv eq 'subscriberAsc'}">selected="selected"</c:if>>구독자수 오름차순</option>
<option value="subscriberDesc" <c:if test="${resultMap.paramVO.sortDv eq 'subscriberDesc'}">selected="selected"</c:if>>구독자수 내림차순</option>
</select>
</div>
<div class="select-box">
<select id="pageUnitView" name="pageUnitView" title="페이지당 출력될 목록건수" onchange="fn_select_list(1,this.value);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="table-wrapper">
<table class="table vertical">
<caption>구독서비스 목록</caption>
<colgroup>
<col style="width: 5%;">
<col style="width: 5%;">
<col style="width: 20%;">
<col style="width: 5%;">
<col style="width: 10%;">
<col style="width: 10%;">
<col style="width: 5%;">
<col style="width: 5%;">
<col style="width: 10%;">
<col style="width: 15%;">
<col style="width: 10%;">
</colgroup>
<thead>
<tr>
<th>
<label class="b-checkbox checkbox is-medium ">
<input type="checkbox" id="checkAll" value="">
<span class="check"></span>
</label>
</th>
<th>번호</th>
<th>구독서비스</th>
<th>기수</th>
<th>기수명</th>
<th>실판매가</th>
<th>배송횟수</th>
<th>최종차수</th>
<th>최종처리일</th>
<th>구독자수</th>
<th>배송상품</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="subsvcOrdrMbr" varStatus="status">
<tr>
<td>
<label class="b-checkbox checkbox is-medium check-all">
<input type="checkbox" name="arrCheck" class="arrCheck" value="">
<span class="check"></span>
</label>
</td>
<td><c:out value="${subsvcOrdrMbr.totCnt - (subsvcOrdrMbr.rnum -1)}"/></td>
<td><c:out value="${subsvcOrdrMbr.subsvcNm}"/></td>
<td><c:out value="${subsvcOrdrMbr.subsvcGnr}"/>기</td>
<td><c:out value="${subsvcOrdrMbr.subsvcGnrNm}"/></td>
<td><fmt:formatNumber value="${subsvcOrdrMbr.selpric}" pattern="#,###"/></td>
<td><c:out value="${subsvcOrdrMbr.dlvyCnt}"/>회</td>
<td><c:out value="${subsvcOrdrMbr.lastProcsOdr}"/>회</td>
<fmt:parseDate value="${subsvcOrdrMbr.lastPrcsDt}" pattern="yyyy-MM-dd HH:mm:ss" var="parseLastPrcsDt"/>
<fmt:formatDate value="${parseLastPrcsDt }" var="formatLastPrcsDt" pattern="yyyy-MM-dd"/>
<td><c:out value="${ formatLastPrcsDt }"/></td>
<td><c:out value="${subsvcOrdrMbr.subscriberCnt}"/>명 <button class="btn xsm outline light-gray" type="button" onclick="fn_open_modal('#modalDiv','#subsvcOrderMbrInfoListPop','<c:url value ='/mngr/ordr/subsvc/selectSubsvcOrderMbrInfoListPop'/>',{'subsvcInnb':'<c:out value="${subsvcOrdrMbr.subsvcInnb}"/>'}); return false;">상세</button></td>
<td><button class="btn xsm outline light-gray" type="button" onclick="fn_open_modal('#modalDiv','#subsvcOrdrrGoodsInfoListPop','<c:url value ='/mngr/ordr/subsvc/selectSubsvcOrderGoodsInfoListPop'/>',{'subsvcInnb':'<c:out value="${subsvcOrdrMbr.subsvcInnb}"/>'}); return false;">보기</button></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">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>

View File

@@ -0,0 +1,347 @@
<%@ 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 : SubsvcOrdrMbrListFrom.jsp
Description : 구독서비스 구독자 조회 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2026-02-09 jazz 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>일반 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
</head>
<script>
var initFlag = true;
$(document).ready(function () {
let pageIndex = $("#pageIndex").val();
let pageUnit = $("#pageUnit").val();
let srchSelSubsvcNm = $('#srchSelSubsvcNm').val();
// event 제어
fn_event();
if(srchSelSubsvcNm != ''){
fn_getsubsvcGnr(srchSelSubsvcNm);
}else{
// 목록 조회
fn_select_list(pageIndex, pageUnit);
}
// 엔터키 검색
$('#listForm').on('keydown', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
fn_select_list(1);
}
});
});
/*********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function (pageIndex, pageUnit) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
//정렬기준 셋팅
if(typeof $('#sortDvView') !== undefined && $('#sortDvView').val() !== undefined){
$('#sortDv').val($('#sortDvView').val());
}
//한페이지 목록개수 셋팅
if(typeof $('#pageUnitView') !== undefined && $('#pageUnitView').val() !== undefined){
$('#pageUnit').val($('#pageUnitView').val());
}
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: "<c:url value="/mngr/ordr/subsvc/selectSubsvcOrdrMbrList"/>",
data: dataStr,
success: function (resultHtml) {
$('#pageDiv').html(resultHtml);
$('#sortDv').val($('#sortDvView').val());
$('#pageUnitView').niceSelect();
$('#sortDvView').niceSelect();
}
});
}
/* 현제uri에 프로토콜, 호스트, 쿼리스티링을 제외하여 history갱신 */
history.replaceState({}, null, location.pathname);
/* ****************************
* event 제어
******************************/
const fn_event = function () {
/* 검색조건 구독서비스 선택 시 회차 조회 이벤트*/
$(document).on('change', '#srchSelSubsvcNm', function(){
var srchSelSubsvcNm = $(this).val();
if(fn_is_empty(srchSelSubsvcNm)){
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
}else{
//해당구독서비스 기수조회
fn_getsubsvcGnr(srchSelSubsvcNm);
}
});
/* 목록 > 전체선택 체인지 이벤트 */
$(document).on('change', '#checkAll', function () {
let checkbox = $(this).closest('table').find('input[name="arrCheck"]');
$(checkbox).prop('checked', false);
$(checkbox).prop('checked', $(this).is(':checked'));
});
}
/* ****************************
* 해당구독서비스 기수조회 AJAX
******************************/
const fn_getsubsvcGnr = function (srchSelSubsvcNm) {
$.ajax({
type: 'post',
url: '<c:url value="/mngr/goods/subsvc/selectSrchSubsvcGnrListAjax"/>',
data: {
'srchSelSubsvcNm': srchSelSubsvcNm
},
success: function (data) {
if (data.resBody != null) {
const result = JSON.parse(data.resBody.result);
const srchSubsvcGnrList = result.srchSubsvcGnrList;
if (srchSubsvcGnrList.length > 0) {
// 회차 초기화
$('#srchSelSubsvcGnr').empty().append('<option value="">전체</option>').niceSelect('update');
// $('#srchSubsvcGnr option').filter(function() {
// return $(this).val() !== '';
// }).remove();
for (let i = 0; i < srchSubsvcGnrList.length; i++) {
const srchSubsvcGnr = srchSubsvcGnrList[i];
var check = "";
if(srchSubsvcGnr.subsvcGnr == '${resultMap.paramVO.srchSelSubsvcGnr}'){
check ="selected"
}
if(initFlag == true){
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '" '+ check+'>' + srchSubsvcGnr.subsvcGnrNm + '</option>');
fn_select_list();
initFlag = false;
}else{
$('#srchSelSubsvcGnr').append('<option value="' + srchSubsvcGnr.subsvcGnr + '">' + srchSubsvcGnr.subsvcGnrNm + '</option>');
}
}
$('#srchSelSubsvcGnr').niceSelect('update');
}
}
},
error: function (data) {
fn_proc_error_message(data);
}
});
}
/**
* 체크박스 전체 처리
* */
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', '.dateRange-btn', function () {
const date = $(this).attr('id');
$('.dateRange-btn').removeClass('selected');
$('#' + date).addClass('selected');
const datepicker = $(this).closest('.td-inner').find('.datepicker');
const start = $(datepicker[0]).attr('id');
const end = $(datepicker[1]).attr('id');
if ('allDays' === date) {
$('#' + start + ', #' + end).val('');
$('#datePeriod').val(date);
return false;
}
fn_set_date(start, end, end, date);
$('#datePeriod').val(date);
});
//카테고리 선택시 카테고리 아이디 저장(검색용)
$(document).on('change', 'select[id^=ctgryDepth]', function () {
const ctgryOptn = $(this).val()
if(!fn_is_empty(ctgryOptn)){
$('#ctgryId').val(ctgryOptn)
}else{
//value가 ''인 카테고리 선택할경우
let currentCtgryDepth = parseInt($(this).attr('id').replace('ctgryDepth', ''));
//1차 카테고리가 아닐 경우 이전 카테고리 번호 가져오기
if(currentCtgryDepth !== 1){
$('#ctgryId').val($('#ctgryDepth' + (currentCtgryDepth - 1)).val())
}else{
//1차 카테고리 일경우 카테고리 번호 비우기
$('#ctgryId').val('')
}
}
})
//초기화버튼
$(document).on('click', '#resetBtn', function () {
$('#listForm')[0].reset();
$('#srchSelSubsvcNm').niceSelect('update');
$('#srchSelSubsvcNm').trigger("change");
$('#srchSelSubsvcGnr').niceSelect('update');
fn_select_list(1);
})
</script>
<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">
</div>
</div>
<form id='listForm' name="listForm" method="post" action="<c:url value="/mngr/ordr/subsvc/selectSubsvcOrdrMbrList"/>">
<input type="hidden" id="pageIndex" name="pageIndex" value="${ resultMap.paramVO.pageIndex }"/>
<input type="hidden" id="sortDv" name="sortDv" value="${ resultMap.paramVO.sortDv }">
<input type="hidden" id="pageUnit" name="pageUnit" value="${ resultMap.paramVO.pageUnit }">
<input type="hidden" id="subsvcInnb" name="subsvcInnb" value="">
<section class="content-section" id="search-section">
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
<col style="width: 12%;">
<col>
</colgroup>
<tr>
<th>구독서비스</th>
<td colspan="3">
<div class="td-inner">
<div class="select-box">
<select title="구독서비스" id="srchSelSubsvcNm" name="srchSelSubsvcNm">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq ''}">selected="selected"</c:if>>전체</option>
<c:forEach items="${resultMap.srchSubsvcList}" var="srchSubsvc" varStatus="status">
<option value="${srchSubsvc.subsvcNm}" <c:if test="${ resultMap.paramVO.srchSelSubsvcNm eq srchSubsvc.subsvcNm}">selected="selected"</c:if>>${srchSubsvc.subsvcNm}</option>
</c:forEach>
</select>
</div>
<div class="select-box">
<select title="구독서비스회차" id="srchSelSubsvcGnr" name="srchSelSubsvcGnr">
<option value="" <c:if test="${ resultMap.paramVO.srchSelSubsvcGnr eq ''}">selected="selected"</c:if>>전체</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<th>구독서비스명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcNm" name="srchSubsvcNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcNm }" />">
</div>
</td>
<th>기수명</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="구독서비스명" id="srchSubsvcGnrNm" name="srchSubsvcGnrNm" value="<c:out value="${ resultMap.paramVO.srchSubsvcGnrNm }" />">
</div>
</td>
</tr>
<tr>
<th>구독종료여부</th>
<td colspan="3">
<div class="td-inner">
<div class="custom-radio-container">
<div class="custom-radio">
<input type="radio" name="srchSubEndAt" id="srchSubEndAt1" value="" <c:if test="${resultMap.paramVO.srchSubEndAt ne 'Y'}">checked</c:if>>
<label for="srchSubEndAt1"/>전체</label>
<input type="radio" name="srchSubEndAt" id="srchSubEndAt2" value="Y"<c:if test="${resultMap.paramVO.srchSubEndAt eq 'Y'}">checked</c:if>>
<label for="srchSubEndAt2"/>진행중</label>
</div>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="form-control-container">
<div class="left"></div>
<div class="center">
<button class="btn outline" id="resetBtn" type="button">초기화</button>
<button class="btn primary" id="searchBtn" type="button" onclick="fn_select_list(1);"><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>
<div id="modalDiv">asfasdfasdaf</div>
</main>
</body>
</html>

View File

@@ -1507,7 +1507,7 @@ since : 2024-01-30 추지훈 최초 생성
<colgroup> <colgroup>
<col style="width: 6%;"> <col style="width: 6%;">
<col style="width: 23%;"> <col style="width: 23%;">
<col style="width: 20%;"> <col style="width: 23%;">
<col style="width: 11%;"> <col style="width: 11%;">
<col style="width: auto;"> <col style="width: auto;">
</colgroup> </colgroup>

View File

@@ -22,6 +22,13 @@
fn_check_BoxControl(amtCndUseAt,amtCndAditAmt); fn_check_BoxControl(amtCndUseAt,amtCndAditAmt);
fn_check_BoxControl(cntCndUseAt,cntCndAditAmt); fn_check_BoxControl(cntCndUseAt,cntCndAditAmt);
const amtCndUseAt2 = document.querySelector('#amtCndUseAt2');
const amtCndAditAmt2 = document.querySelector('#amtCndAditAmt2');
const cntCndUseAt2 = document.querySelector('#cntCndUseAt2');
const cntCndAditAmt2 = document.querySelector('#cntCndAditAmt2');
fn_check_BoxControl(amtCndUseAt2,amtCndAditAmt2);
fn_check_BoxControl(cntCndUseAt2,cntCndAditAmt2);
/** 묶음배송 체크박스 컨트롤 */ /** 묶음배송 체크박스 컨트롤 */
const bundleDlvyY = document.querySelector('#bundleDlvyY'); const bundleDlvyY = document.querySelector('#bundleDlvyY');
const bundleDlvyN = document.querySelector('#bundleDlvyN'); const bundleDlvyN = document.querySelector('#bundleDlvyN');
@@ -29,16 +36,30 @@
fn_click_bundleDlvy(bundleDlvyY, bundleDlvyCndAmt); fn_click_bundleDlvy(bundleDlvyY, bundleDlvyCndAmt);
fn_click_bundleDlvy(bundleDlvyN, bundleDlvyCndAmt); fn_click_bundleDlvy(bundleDlvyN, bundleDlvyCndAmt);
const bundleDlvyY2 = document.querySelector('#bundleDlvyY2');
const bundleDlvyN2 = document.querySelector('#bundleDlvyN2');
const bundleDlvyCndAmt2 = document.querySelector('#bundleDlvyCndAmt2');
fn_click_bundleDlvy(bundleDlvyY2, bundleDlvyCndAmt2);
fn_click_bundleDlvy(bundleDlvyN2, bundleDlvyCndAmt2);
/** 배송권역 셀렉트박스 컨트롤 */ /** 배송권역 셀렉트박스 컨트롤 */
const dlvyAreaAditAt1 = document.querySelector('#dlvyAreaAditAt'); const dlvyAreaAditAt1 = document.querySelector('#dlvyAreaAditAt');
const areaAditDlvyAmt1 = document.querySelector('#areaAditDlvyAmt'); const areaAditDlvyAmt1 = document.querySelector('#areaAditDlvyAmt');
fn_change_dlvyArea(dlvyAreaAditAt1, areaAditDlvyAmt1); fn_change_dlvyArea(dlvyAreaAditAt1, areaAditDlvyAmt1);
const dlvyAreaAditAt2 = document.querySelector('#dlvyAreaAditAt2');
const areaAditDlvyAmt2 = document.querySelector('#areaAditDlvyAmt2');
fn_change_dlvyArea(dlvyAreaAditAt2, areaAditDlvyAmt2);
//왕복 여부 체크박스 컨트롤 //왕복 여부 체크박스 컨트롤
const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt'); const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt');
const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt'); const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt');
fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt); fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt);
const returnDlvyApplcAt2 = document.querySelector('#returnDlvyApplcAt2');
const exchngDlvyAmt2 = document.querySelector('#exchngDlvyAmt2');
fn_check_BoxControl(returnDlvyApplcAt2,exchngDlvyAmt2);
if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) { if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) {
$(".input-text.number").val('0'); $(".input-text.number").val('0');
} }
@@ -59,14 +80,14 @@
<h3 class="content-section__title">배송비</h3> <h3 class="content-section__title">배송비</h3>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="table"> <table class="table">
<caption>배송그룹 배송비</caption> <caption>배송그룹 배송비(KR)</caption>
<colgroup> <colgroup>
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>
<th>기본 배송비</th> <th>기본 배송비(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="input-container"> <div class="input-container">
@@ -80,18 +101,28 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th>조건(다중선택가능)</th> <th>조건(다중선택가능)(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="b-checkbox-container"> <div class="b-checkbox-container">
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" id="amtCndUseAt" name="amtCndUseAt" value="Y" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt eq 'Y' }">checked="checked"</c:if>> <input type="checkbox" id="amtCndUseAt" name="amtCndUseAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.amtCndUseAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.amtCndUseAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span> <span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.amtCndAditAmt}' pattern="#,###" />" title="금액 조건" id="amtCndAditAmt" name="amtCndAditAmt" maxlength="13"> <input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.amtCndAditAmt}' pattern="#,###" />" title="금액 조건" id="amtCndAditAmt" name="amtCndAditAmt" maxlength="13">
</label> </label>
<span class="control-label">${curUnit} 이상일 때 무료배송</span> <span class="control-label">${curUnit} 이상일 때 무료배송</span>
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" id="cntCndUseAt" name="cntCndUseAt" value="Y" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt eq 'Y' }">checked="checked"</c:if>> <input type="checkbox" id="cntCndUseAt" name="cntCndUseAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.cntCndUseAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.cntCndUseAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span> <span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.cntCndAditAmt}' pattern="#,###" />" title="구매 개수 조건" id="cntCndAditAmt" name="cntCndAditAmt" maxlength="13"> <input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.cntCndAditAmt}' pattern="#,###" />" title="구매 개수 조건" id="cntCndAditAmt" name="cntCndAditAmt" maxlength="13">
</label> </label>
@@ -101,7 +132,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">묶음배송</th> <th rowspan="2">묶음배송(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="custom-radio-container"> <div class="custom-radio-container">
@@ -144,7 +175,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">배송 권역</th> <th rowspan="2">배송 권역(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="select-box"> <div class="select-box">
@@ -161,7 +192,7 @@
<div class="td-inner"> <div class="td-inner">
<div class="td-inner vertical"> <div class="td-inner vertical">
<div class="input-container"> <div class="input-container">
<span class="mr-10 fw-500">오키나와, 홋카이도 추가 배송비</span> <span class="mr-10 fw-500">도서산간지역+제주지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt" <input type="text" class="input-text sm right number" id="areaAditDlvyAmt"
name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if> name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />" value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />"
@@ -173,7 +204,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">반품배송비</th> <th rowspan="2">반품배송비(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="input-container"> <div class="input-container">
@@ -184,7 +215,12 @@
</div> </div>
<div class="b-checkbox-container"> <div class="b-checkbox-container">
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt" value="Y" <c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>> <input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span> <span style="margin-right: 5px;" class="check"></span>
</label> </label>
<span class="control-label">왕복 여부</span> <span class="control-label">왕복 여부</span>
@@ -205,4 +241,167 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="table-wrapper">
<table class="table">
<caption>배송그룹 배송비(JP)</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>기본 배송비(JP)</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right number"
value="<fmt:formatNumber value='${resultMap.dlvyGroup.dftDlvyAmt2}' pattern="#,###" />"
title="기본배송비" name="dftDlvyAmt2" maxlength="13" >
<span class="input-unit-text">${curUnit}</span>
</div>
</div>
</td>
</tr>
<tr>
<th>조건(다중선택가능)(JP)</th>
<td>
<div class="td-inner">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" id="amtCndUseAt2" name="amtCndUseAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.amtCndUseAt2 eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.amtCndUseAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt2 ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.amtCndAditAmt2}' pattern="#,###" />" title="금액 조건" id="amtCndAditAmt2" name="amtCndAditAmt2" maxlength="13">
</label>
<span class="control-label">${curUnit} 이상일 때 무료배송</span>
<label class="b-checkbox checkbox">
<input type="checkbox" id="cntCndUseAt2" name="cntCndUseAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.cntCndUseAt2 eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.cntCndUseAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt2 ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.cntCndAditAmt2}' pattern="#,###" />" title="구매 개수 조건" id="cntCndAditAmt2" name="cntCndAditAmt2" maxlength="13">
</label>
<span class="control-label">개 이상일 때 무료배송</span>
</div>
</div>
</td>
</tr>
<tr>
<th rowspan="2">묶음배송(JP)</th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<div class="custom-radio">
<input type="radio" id="bundleDlvyY2" name="bundleDlvyUseAt2" value="Y"
<c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'Y' }">checked="checked"</c:if> <c:if test="${empty resultMap.dlvyGroup.bundleDlvyUseAt2}">checked="checked"</c:if> >
<label for="bundleDlvyY2">사용함</label>
</div>
<div class="custom-radio">
<input type="radio" id="bundleDlvyN2" name="bundleDlvyUseAt2" value="N"
<c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'N' }">checked="checked"</c:if>>
<label for="bundleDlvyN2">사용안함</label>
</div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="td-inner vertical">
<div class="input-container">
<span class="mr-10">묶음배송 상품 금액 합이</span>
<input type="text" class="input-text sm right number"
<c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'N' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.bundleDlvyCndAmt2}' pattern="#,###" />"
title="묶음배송 조건" id="bundleDlvyCndAmt2" name="bundleDlvyCndAmt2" maxlength="13">
<span class="input-unit-text mr-8">${curUnit}</span>
<span>이상일 때 무료배송</span>
</div>
<div class="gray-7">
<p class="fyi">값을 1${curUnit} 이상 입력 하신 경우 설정이 가능 합니다.</p>
<p class="fyi">묶음배송을 사용함으로 설정하신 상품의 경우에만 해당 조건이 적용됩니다.</p>
<p class="fyi">묶음배송 상품이 아닌 경우, 상품별로 각각 배송비가 부과될 수 있습니다.</p>
<p class="fyi">묶음배송 상품은 2개 이상 주문해야 무료배송 조건이 적용됩니다.</p>
<p class="fyi">무료배송 처리된 묶음배송 상품이 있을 경우, 전체 묶음배송 상품이 무료배송 처리됩니다.
</p>
<p class="fyi">묶음배송 상품인 경우, 금액이 가장 높은 기본 배송비를 한 번만 부과합니다.</p>
</div>
</div>
</td>
</tr>
<tr>
<th rowspan="2">배송 권역(JP)</th>
<td>
<div class="td-inner">
<div class="select-box">
<select title="배송권역 사용여부" id="dlvyAreaAditAt2" name="dlvyAreaAditAt2">
<option value="N" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 ne 'Y' }">selected="selected"</c:if>>사용안함</option>
<option value="Y" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 eq 'Y' }">selected="selected"</c:if>>2권역</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="td-inner">
<div class="td-inner vertical">
<div class="input-container">
<span class="mr-10 fw-500">도서산간지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt2"
name="areaAditDlvyAmt2" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt2}' pattern="#,###" />"
title="배송권역에 대한 추가 배송비" maxlength="13">
<span class="input-unit-text mr-8">${curUnit}</span>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th rowspan="2">반품배송비(JP)</th>
<td>
<div class="td-inner">
<div class="input-container">
<span>편도 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.returnDlvyAmt2}' pattern="#,###" />" title="편도반품배송비" id="returnDlvyAmt2" name="returnDlvyAmt2" maxlength="13">
${curUnit}
</span>
</div>
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt2" name="returnDlvyApplcAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt2 eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
</label>
<span class="control-label">왕복 여부</span>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="input-container">
<span>왕복 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.exchngDlvyAmt2}' pattern="#,###" />" title="왕복반품배송비" id="exchngDlvyAmt2" name="exchngDlvyAmt2" maxlength="13" <c:if test="${resultMap.dlvyGroup.returnDlvyApplcAt2 ne 'Y'}"> disabled="disabled" </c:if> >
${curUnit}
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</section> </section>

View File

@@ -134,12 +134,14 @@ since : 2023.11.28 전일찬 최초 생성11
******************************************************** */ ******************************************************** */
const fn_check_BoxControl = function(checkbox, textbox) { const fn_check_BoxControl = function(checkbox, textbox) {
$(checkbox).on('click', function(){ $(checkbox).on('click', function(){
let targetValue = checkbox.value; // let targetValue = checkbox.value;
if(checkbox.checked == true){ if(checkbox.checked == true){
targetValue = 'Y'; // targetValue = 'Y';
checkbox.value = "Y";
textbox.disabled = false; textbox.disabled = false;
} else { } else {
targetValue = 'N'; // targetValue = 'N';
checkbox.value = "N";
textbox.disabled = true; textbox.disabled = true;
textbox.value= '0'; textbox.value= '0';
} }
@@ -205,6 +207,46 @@ since : 2023.11.28 전일찬 최초 생성11
$('#address').val(data.roadAddress); $('#address').val(data.roadAddress);
} }
} }
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function (callback) {
let postcode2 = $('#postcode2').val();
if(postcode2 == ''){
alert('우편번호를 입력하세요.');
return;
}
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#postcode2').val(),
dataType: 'jsonp',
success: function (data) {
// console.log("status1:", data);
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
// let prefcode = result.prefcode;
$("#address2").val(adres);
$("#detailAddress2").val(dtlAdres);
// $("#prefcode").val(prefcode); // 도도부현코드
} else {
alert('주소 조회가 실패하였습니다. 정상적인 우편번호를 입력하세요.');
}
},
error: function (xhr, status, error) {
console.log("status:", status);
console.log("error:", error);
}
});
}
</script> </script>
<body> <body>
@@ -258,7 +300,7 @@ since : 2023.11.28 전일찬 최초 생성11
<div id="PayDlvy" class="content-tab__content"> <div id="PayDlvy" class="content-tab__content">
</div> </div>
<section class="content-section"> <section class="content-section">
<h3 class="content-section__title">반송지</h3> <h3 class="content-section__title">반송지(KR)</h3>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="table"> <table class="table">
<colgroup> <colgroup>
@@ -306,6 +348,55 @@ since : 2023.11.28 전일찬 최초 생성11
</table> </table>
</div> </div>
</section> </section>
<section class="content-section">
<h3 class="content-section__title">반송지(JP)</h3>
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>주소</th>
<td>
<div class="td-inner">
<div class="address-group">
<div class="address-line">
<span class="address-line__title">우편번호</span>
<input type="text" class="input-text xsm mr-2" value=""
title="반송지 우편번호" id="postcode2" name="rtnlcZip2">
<button type="button" onclick="fn_select_postcodeJp(); return false;" class="address-line__find-btn">주소찾기</button>
</div>
<div class="address-line">
<span class="address-line__title">주소</span>
<input type="text" class="input-text lg" value="" readonly
title="반송지 주소" id="address2" name="rtnlcAdres2">
</div>
<div class="address-line">
<span class="address-line__title">상세주소</span>
<input type="text" class="input-text md" value="" maxlength="35"
title="반송지 상세주소" id="detailAddress2" name="rtnlcDtlAdres2">
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>전화번호</th>
<td>
<div class="td-inner">
<div class="phone-container">
<input type="text" class="input-text sm phone" value=""
title="전화번호" id="rtnlcTelnb2" maxlength="13" name="rtnlcTelnb2">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</section>
</form> </form>
</div> </div>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button> <button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>

View File

@@ -122,6 +122,45 @@
} }
} }
/**********************************************
ibsnet api 호출
***********************************************/
const fn_select_postcodeJp = function (callback) {
let postcode2 = $('#postcode2').val();
if(postcode2 == ''){
alert('우편번호를 입력하세요.');
return;
}
$.ajax({
type: 'GET',
url: 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + $('#postcode2').val(),
dataType: 'jsonp',
success: function (data) {
// console.log("status1:", data);
if(data.status == 200) {
let result = data.results[0];
let adres = result.address1;
let dtlAdres = [result.address2, result.address3].join(" ");
// let prefcode = result.prefcode;
$("#address2").val(adres);
$("#detailAddress2").val(dtlAdres);
// $("#prefcode").val(prefcode); // 도도부현코드
} else {
alert('주소 조회가 실패하였습니다. 정상적인 우편번호를 입력하세요.');
}
},
error: function (xhr, status, error) {
console.log("status:", status);
console.log("error:", error);
}
});
}
/* ******************************************************** /* ********************************************************
* 배송권역 변경 시 value 값 변경 * 배송권역 변경 시 value 값 변경
******************************************************** */ ******************************************************** */
@@ -157,12 +196,14 @@
******************************************************** */ ******************************************************** */
const fn_check_BoxControl = function(checkbox, textbox) { const fn_check_BoxControl = function(checkbox, textbox) {
$(checkbox).on('click', function(){ $(checkbox).on('click', function(){
let targetValue = checkbox.value; // let targetValue = checkbox.value;
if(checkbox.checked == true){ if(checkbox.checked == true){
targetValue = "Y"; // targetValue = "Y";
checkbox.value = "Y";
textbox.disabled = false; textbox.disabled = false;
} else { } else {
targetValue = "N"; // targetValue = "N";
checkbox.value = "N";
textbox.disabled = true; textbox.disabled = true;
textbox.value= '0'; textbox.value= '0';
} }
@@ -227,6 +268,7 @@
<form id="DlvyForm" method="post" action="/mngr/setup/dlvygrp/updateDlvyGroupDtl"> <form id="DlvyForm" method="post" action="/mngr/setup/dlvygrp/updateDlvyGroupDtl">
<input type="hidden" id="dlvyGroupInnb" name="dlvyGroupInnb" value="<c:out value="${resultMap.dlvyGroup.dlvyGroupInnb}"/>"/> <input type="hidden" id="dlvyGroupInnb" name="dlvyGroupInnb" value="<c:out value="${resultMap.dlvyGroup.dlvyGroupInnb}"/>"/>
<input type="hidden" id="rtnlcInnb" name="rtnlcInnb" value="<c:out value="${resultMap.dlvyGroup.rtnlcInnb}"/>"/> <input type="hidden" id="rtnlcInnb" name="rtnlcInnb" value="<c:out value="${resultMap.dlvyGroup.rtnlcInnb}"/>"/>
<input type="hidden" id="rtnlcInnb2" name="rtnlcInnb2" value="<c:out value="${resultMap.dlvyGroup.rtnlcInnb2}"/>"/>
<section class="content-section"> <section class="content-section">
<h3 class="content-section__title">배송그룹명</h3> <h3 class="content-section__title">배송그룹명</h3>
<div class="table-wrapper"> <div class="table-wrapper">
@@ -256,7 +298,7 @@
<div id="PayDlvy" class="content-tab__content"> <div id="PayDlvy" class="content-tab__content">
</div> </div>
<section class="content-section"> <section class="content-section">
<h3 class="content-section__title">반송지</h3> <h3 class="content-section__title">반송지(KR)</h3>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="table"> <table class="table">
<colgroup> <colgroup>
@@ -300,6 +342,51 @@
</table> </table>
</div> </div>
</section> </section>
<section class="content-section">
<h3 class="content-section__title">반송지(JP)</h3>
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>주소</th>
<td>
<div class="td-inner">
<div class="address-group">
<div class="address-line">
<span class="address-line__title">우편번호</span>
<input type="text" class="input-text xsm mr-2" value="<c:out value="${resultMap.dlvyGroup.rtnlcZip2}"/>" title="반송지 우편번호" id="rtnlcZip2" name="rtnlcZip2">
<button type="button" onclick="fn_select_postcodeJp(); return false;" class="address-line__find-btn">주소찾기</button>
</div>
<div class="address-line">
<span class="address-line__title">주소</span>
<input type="text" class="input-text lg" value="<c:out value="${resultMap.dlvyGroup.rtnlcAdres2}"/>" title="반송지 주소" id="rtnlcAdres2" name="rtnlcAdres2">
</div>
<div class="address-line">
<span class="address-line__title">상세주소</span>
<input type="text" class="input-text md" value="<c:out value="${resultMap.dlvyGroup.rtnlcDtlAdres2}"/>" maxlength="35" title="반송지 상세주소" id="rtnlcDtlAdres2" name="rtnlcDtlAdres2">
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>전화번호</th>
<td>
<div class="td-inner">
<div class="phone-container">
<input type="text" class="input-text m phone" value="<c:out value="${resultMap.dlvyGroup.rtnlcTelnb2}"/>" title="전화번호" id="rtnlcTelnb2" maxlength="13" name="rtnlcTelnb2">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</section>
</form> </form>
</div> </div>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button> <button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>

View File

@@ -19,6 +19,10 @@
const areaAditDlvyAmt = document.querySelector('#areaAditDlvyAmt'); const areaAditDlvyAmt = document.querySelector('#areaAditDlvyAmt');
fn_change_dlvyArea(dlvyAreaAditAt, areaAditDlvyAmt); fn_change_dlvyArea(dlvyAreaAditAt, areaAditDlvyAmt);
const dlvyAreaAditAt2 = document.querySelector('#dlvyAreaAditAt2');
const areaAditDlvyAmt2 = document.querySelector('#areaAditDlvyAmt2');
fn_change_dlvyArea(dlvyAreaAditAt2, areaAditDlvyAmt2);
if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) { if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) {
$(".input-text.number").val('0'); $(".input-text.number").val('0');
} }
@@ -34,6 +38,10 @@
const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt'); const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt');
const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt'); const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt');
fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt); fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt);
const returnDlvyApplcAt2 = document.querySelector('#returnDlvyApplcAt2');
const exchngDlvyAmt2 = document.querySelector('#exchngDlvyAmt2');
fn_check_BoxControl(returnDlvyApplcAt2,exchngDlvyAmt2);
}); });
</script> </script>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/> <spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
@@ -42,14 +50,14 @@
<h3 class="content-section__title">배송비</h3> <h3 class="content-section__title">배송비</h3>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="table"> <table class="table">
<caption>배송그룹 배송비</caption> <caption>배송그룹 배송비(KR)</caption>
<colgroup> <colgroup>
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>
<th rowspan="2">배송 권역</th> <th rowspan="2">배송 권역(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="select-box"> <div class="select-box">
@@ -66,7 +74,7 @@
<div class="td-inner"> <div class="td-inner">
<div class="td-inner vertical"> <div class="td-inner vertical">
<div class="input-container"> <div class="input-container">
<span class="mr-10 fw-500">오키나와, 홋카이도 추가 배송비</span> <span class="mr-10 fw-500">도서산간지역+제주지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt" <input type="text" class="input-text sm right number" id="areaAditDlvyAmt"
name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if> name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />" value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />"
@@ -78,7 +86,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">반품배송비</th> <th rowspan="2">반품배송비(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="input-container"> <div class="input-container">
@@ -89,7 +97,12 @@
</div> </div>
<div class="b-checkbox-container"> <div class="b-checkbox-container">
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt" value="Y" <c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>> <input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span> <span style="margin-right: 5px;" class="check"></span>
</label> </label>
<span class="control-label">왕복 여부</span> <span class="control-label">왕복 여부</span>
@@ -110,4 +123,79 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="table-wrapper">
<table class="table">
<caption>배송그룹 배송비(JP)</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th rowspan="2">배송 권역(JP)</th>
<td>
<div class="td-inner">
<div class="select-box">
<select title="배송권역 사용여부" id="dlvyAreaAditAt2" name="dlvyAreaAditAt2">
<option value="N" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 ne 'Y' }">selected="selected"</c:if>>사용안함</option>
<option value="Y" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 eq 'Y' }">selected="selected"</c:if>>2권역</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="td-inner">
<div class="td-inner vertical">
<div class="input-container">
<span class="mr-10 fw-500">도서산간지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt2"
name="areaAditDlvyAmt2" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />"
title="배송권역에 대한 추가 배송비" maxlength="13">
<span class="input-unit-text mr-8">${curUnit}</span>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th rowspan="2">반품배송비(JP)</th>
<td>
<div class="td-inner">
<div class="input-container">
<span>편도 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.returnDlvyAmt2}' pattern="#,###" />" title="편도반품배송비" id="returnDlvyAmt2" name="returnDlvyAmt2" maxlength="13">
${curUnit}
</span>
</div>
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt2" name="returnDlvyApplcAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
</label>
<span class="control-label">왕복 여부</span>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="input-container">
<span>왕복 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.exchngDlvyAmt2}' pattern="#,###" />" title="왕복반품배송비" id="exchngDlvyAmt2" name="exchngDlvyAmt2" maxlength="13" <c:if test="${resultMap.dlvyGroup.returnDlvyApplcAt2 ne 'Y'}"> disabled="disabled" </c:if> >
${curUnit}
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</section> </section>

View File

@@ -14,25 +14,63 @@
--%> --%>
<script type="text/javascript"> <script type="text/javascript">
$( document ).ready(function() { $( document ).ready(function() {
/** 배송권역 셀렉트박스 컨트롤 */ /** 유료배송 조건 체크박스 컨트롤 */
const dlvyAreaAditAt1 = document.querySelector('#dlvyAreaAditAt'); // const amtCndUseAt = document.querySelector('#amtCndUseAt');
const areaAditDlvyAmt1 = document.querySelector('#areaAditDlvyAmt'); // const amtCndAditAmt = document.querySelector('#amtCndAditAmt');
fn_change_dlvyArea(dlvyAreaAditAt1, areaAditDlvyAmt1); const cntCndUseAt = document.querySelector('#cntCndUseAt');
const cntCndAditAmt = document.querySelector('#cntCndAditAmt');
// fn_check_BoxControl(amtCndUseAt,amtCndAditAmt);
fn_check_BoxControl(cntCndUseAt,cntCndAditAmt);
// const amtCndUseAt2 = document.querySelector('#amtCndUseAt2');
// const amtCndAditAmt2 = document.querySelector('#amtCndAditAmt2');
const cntCndUseAt2 = document.querySelector('#cntCndUseAt2');
const cntCndAditAmt2 = document.querySelector('#cntCndAditAmt2');
// fn_check_BoxControl(amtCndUseAt2,amtCndAditAmt2);
fn_check_BoxControl(cntCndUseAt2,cntCndAditAmt2);
/** 묶음배송 체크박스 컨트롤 */
// const bundleDlvyY = document.querySelector('#bundleDlvyY');
// const bundleDlvyN = document.querySelector('#bundleDlvyN');
// const bundleDlvyCndAmt = document.querySelector('#bundleDlvyCndAmt');
// fn_click_bundleDlvy(bundleDlvyY, bundleDlvyCndAmt);
// fn_click_bundleDlvy(bundleDlvyN, bundleDlvyCndAmt);
//
// const bundleDlvyY2 = document.querySelector('#bundleDlvyY2');
// const bundleDlvyN2 = document.querySelector('#bundleDlvyN2');
// const bundleDlvyCndAmt2 = document.querySelector('#bundleDlvyCndAmt2');
// fn_click_bundleDlvy(bundleDlvyY2, bundleDlvyCndAmt2);
// fn_click_bundleDlvy(bundleDlvyN2, bundleDlvyCndAmt2);
/** 배송권역 셀렉트박스 컨트롤 */
const dlvyAreaAditAt1 = document.querySelector('#dlvyAreaAditAt');
const areaAditDlvyAmt1 = document.querySelector('#areaAditDlvyAmt');
fn_change_dlvyArea(dlvyAreaAditAt1, areaAditDlvyAmt1);
const dlvyAreaAditAt2 = document.querySelector('#dlvyAreaAditAt2');
const areaAditDlvyAmt2 = document.querySelector('#areaAditDlvyAmt2');
fn_change_dlvyArea(dlvyAreaAditAt2, areaAditDlvyAmt2);
//왕복 여부 체크박스 컨트롤
const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt');
const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt');
fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt);
const returnDlvyApplcAt2 = document.querySelector('#returnDlvyApplcAt2');
const exchngDlvyAmt2 = document.querySelector('#exchngDlvyAmt2');
fn_check_BoxControl(returnDlvyApplcAt2,exchngDlvyAmt2);
if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) { if ($(".input-text.number").val() === '' || $(".input-text.number").val() == null) {
$(".input-text.number").val('0'); $(".input-text.number").val('0');
} }
$(".input-text.number").on("focus", function () { $(".input-text.number").on("focus", function () {
if ($(this).val() === '0') { if ($(this).val() === '0') {
$(this).val(''); $(this).val('');
} }
});
//왕복 여부 체크박스 컨트롤 });
const returnDlvyApplcAt = document.querySelector('#returnDlvyApplcAt');
const exchngDlvyAmt = document.querySelector('#exchngDlvyAmt');
fn_check_BoxControl(returnDlvyApplcAt,exchngDlvyAmt);
}); });
</script> </script>
<spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/> <spring:eval expression="@environment.getProperty('currency-unit.default')" var="curUnit"/>
@@ -41,14 +79,14 @@
<h3 class="content-section__title">배송비</h3> <h3 class="content-section__title">배송비</h3>
<div class="table-wrapper"> <div class="table-wrapper">
<table class="table"> <table class="table">
<caption>해당 테이블에 대한 설명</caption> <caption>배송그룹 배송비(KR)</caption>
<colgroup> <colgroup>
<col style="width: 12%;"> <col style="width: 12%;">
<col> <col>
</colgroup> </colgroup>
<tbody> <tbody>
<tr> <tr>
<th>기본 배송비</th> <th>기본 배송비(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="input-container"> <div class="input-container">
@@ -60,8 +98,85 @@
</div> </div>
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">배송 권역</th> <th>개별배송조건(KR)</th>
<td>
<div class="td-inner">
<div class="td-inner vertical">
<div class="b-checkbox-container">
<%-- <label class="b-checkbox checkbox">--%>
<%-- <input type="checkbox" id="amtCndUseAt" name="amtCndUseAt" value="Y" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt eq 'Y' }">checked="checked"</c:if>>--%>
<%-- <span style="margin-right: 5px;" class="check"></span>--%>
<%-- <input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.amtCndAditAmt}' pattern="#,###" />" title="금액 조건" id="amtCndAditAmt" name="amtCndAditAmt" maxlength="13">--%>
<%-- </label>--%>
<%-- <span class="control-label">${curUnit} 이상일 때 무료배송</span>--%>
<label class="b-checkbox checkbox">
<input type="checkbox" id="cntCndUseAt" name="cntCndUseAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.cntCndUseAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.cntCndUseAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.cntCndAditAmt}' pattern="#,###" />" title="구매 개수 조건" id="cntCndAditAmt" name="cntCndAditAmt" maxlength="13">
</label>
<span class="control-label">개 단위로 유료배송비 추가</span>
</div>
<div class="gray-7">
<p class="fyi">값을 1개 이상 입력 하신 경우 설정이 가능 합니다.</p>
<p class="fyi">설정한 개수의 배수로 배송비가 부과됩니다.</p>
<p class="fyi">설정하지 않을 경우, 같은 상품은 개수와 상관없이 배송비를 한 번만 부과합니다.</p>
<p class="fyi">무료배송, 묶음배송 상품과 별도로 배송비가 적용됩니다.</p>
</div>
</div>
</div>
</td>
</tr>
<%-- <tr>--%>
<%-- <th rowspan="2">묶음배송(KR)</th>--%>
<%-- <td>--%>
<%-- <div class="td-inner">--%>
<%-- <div class="custom-radio-container">--%>
<%-- <div class="custom-radio">--%>
<%-- <input type="radio" id="bundleDlvyY" name="bundleDlvyUseAt" value="Y"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt eq 'Y' }">checked="checked"</c:if> >--%>
<%-- <label for="bundleDlvyY">사용함</label>--%>
<%-- </div>--%>
<%-- <div class="custom-radio">--%>
<%-- <input type="radio" id="bundleDlvyN" name="bundleDlvyUseAt" value="N"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt eq 'N' }">checked="checked"</c:if> <c:if test="${empty resultMap.dlvyGroup.bundleDlvyUseAt}">checked="checked"</c:if> >--%>
<%-- <label for="bundleDlvyN">사용안함</label>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </td>--%>
<%-- </tr>--%>
<%-- <tr>--%>
<%-- <td>--%>
<%-- <div class="td-inner vertical">--%>
<%-- <div class="input-container">--%>
<%-- <span class="mr-10">묶음배송 상품 금액 합이</span>--%>
<%-- <input type="text" class="input-text sm right number"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt eq 'N' }">disabled="disabled"</c:if>--%>
<%-- value="<fmt:formatNumber value='${resultMap.dlvyGroup.bundleDlvyCndAmt}' pattern="#,###" />"--%>
<%-- title="묶음배송 조건" id="bundleDlvyCndAmt" name="bundleDlvyCndAmt" maxlength="13">--%>
<%-- <span class="input-unit-text mr-8">${curUnit}</span>--%>
<%-- <span>이상일 때 무료배송</span>--%>
<%-- </div>--%>
<%-- <div class="gray-7">--%>
<%-- <p class="fyi">값을 1${curUnit} 이상 입력 하신 경우 설정이 가능 합니다.</p>--%>
<%-- <p class="fyi">묶음배송을 사용함으로 설정하신 상품의 경우에만 해당 조건이 적용됩니다.</p>--%>
<%-- <p class="fyi">묶음배송 상품이 아닌 경우, 상품별로 각각 배송비가 부과될 수 있습니다.</p>--%>
<%-- <p class="fyi">묶음배송 상품은 2개 이상 주문해야 무료배송 조건이 적용됩니다.</p>--%>
<%-- <p class="fyi">무료배송 처리된 묶음배송 상품이 있을 경우, 전체 묶음배송 상품이 무료배송 처리됩니다.--%>
<%-- </p>--%>
<%-- <p class="fyi">묶음배송 상품인 경우, 금액이 가장 높은 기본 배송비를 한 번만 부과합니다.</p>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </td>--%>
<%-- </tr>--%>
<%-- <tr>--%>
<th rowspan="2">배송 권역(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="select-box"> <div class="select-box">
@@ -78,7 +193,7 @@
<div class="td-inner"> <div class="td-inner">
<div class="td-inner vertical"> <div class="td-inner vertical">
<div class="input-container"> <div class="input-container">
<span class="mr-10 fw-500">오키나와, 홋카이도 추가 배송비</span> <span class="mr-10 fw-500">도서산간지역+제주지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt" <input type="text" class="input-text sm right number" id="areaAditDlvyAmt"
name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if> name="areaAditDlvyAmt" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />" value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt}' pattern="#,###" />"
@@ -90,7 +205,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<th rowspan="2">반품배송비</th> <th rowspan="2">반품배송비(KR)</th>
<td> <td>
<div class="td-inner"> <div class="td-inner">
<div class="input-container"> <div class="input-container">
@@ -101,7 +216,12 @@
</div> </div>
<div class="b-checkbox-container"> <div class="b-checkbox-container">
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt" value="Y" <c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>> <input type="checkbox" id="returnDlvyApplcAt" name="returnDlvyApplcAt"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span> <span style="margin-right: 5px;" class="check"></span>
</label> </label>
<span class="control-label">왕복 여부</span> <span class="control-label">왕복 여부</span>
@@ -121,5 +241,170 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="table-wrapper">
<table class="table">
<caption>배송그룹 배송비(JP)</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>기본 배송비(JP)</th>
<td>
<div class="td-inner">
<div class="input-container">
<input type="text" class="input-text sm right number"
value="<fmt:formatNumber value='${resultMap.dlvyGroup.dftDlvyAmt2}' pattern="#,###" />"
title="기본배송비" name="dftDlvyAmt2" maxlength="10">
<span class="input-unit-text">${curUnit}</span>
</div>
</div>
</td>
</tr>
<tr>
<th>개별배송조건(JP)</th>
<td>
<div class="td-inner">
<div class="td-inner vertical">
<div class="b-checkbox-container">
<%-- <label class="b-checkbox checkbox">--%>
<%-- <input type="checkbox" id="amtCndUseAt2" name="amtCndUseAt2" value="Y" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt2 eq 'Y' }">checked="checked"</c:if>>--%>
<%-- <span style="margin-right: 5px;" class="check"></span>--%>
<%-- <input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.amtCndUseAt2 ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.amtCndAditAmt2}' pattern="#,###" />" title="금액 조건" id="amtCndAditAmt2" name="amtCndAditAmt2" maxlength="13">--%>
<%-- </label>--%>
<%-- <span class="control-label">${curUnit} 이상일 때 무료배송</span>--%>
<label class="b-checkbox checkbox">
<input type="checkbox" id="cntCndUseAt2" name="cntCndUseAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.cntCndUseAt2 eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.cntCndUseAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
<input type="text" class="input-text sm right number" <c:if test="${ resultMap.dlvyGroup.cntCndUseAt2 ne 'Y' }">disabled="disabled"</c:if> value="<fmt:formatNumber value='${resultMap.dlvyGroup.cntCndAditAmt2}' pattern="#,###" />" title="구매 개수 조건" id="cntCndAditAmt2" name="cntCndAditAmt2" maxlength="13">
</label>
<span class="control-label">개 단위로 유료배송비 추가</span>
</div>
<div class="gray-7">
<p class="fyi">값을 1개 이상 입력 하신 경우 설정이 가능 합니다.</p>
<p class="fyi">설정한 개수의 배수로 배송비가 부과됩니다.</p>
<p class="fyi">설정하지 않을 경우, 같은 상품은 개수와 상관없이 배송비를 한 번만 부과합니다.</p>
<p class="fyi">무료배송, 묶음배송 상품과 별도로 배송비가 적용됩니다.</p>
</div>
</div>
</div>
</td>
</tr>
<%-- <tr>--%>
<%-- <th rowspan="2">묶음배송(JP)</th>--%>
<%-- <td>--%>
<%-- <div class="td-inner">--%>
<%-- <div class="custom-radio-container">--%>
<%-- <div class="custom-radio">--%>
<%-- <input type="radio" id="bundleDlvyY2" name="bundleDlvyUseAt2" value="Y"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'Y' }">checked="checked"</c:if> >--%>
<%-- <label for="bundleDlvyY2">사용함</label>--%>
<%-- </div>--%>
<%-- <div class="custom-radio">--%>
<%-- <input type="radio" id="bundleDlvyN2" name="bundleDlvyUseAt2" value="N"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'N' }">checked="checked"</c:if> <c:if test="${empty resultMap.dlvyGroup.bundleDlvyUseAt2}">checked="checked"</c:if> >--%>
<%-- <label for="bundleDlvyN2">사용안함</label>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </td>--%>
<%-- </tr>--%>
<%-- <tr>--%>
<%-- <td>--%>
<%-- <div class="td-inner vertical">--%>
<%-- <div class="input-container">--%>
<%-- <span class="mr-10">묶음배송 상품 금액 합이</span>--%>
<%-- <input type="text" class="input-text sm right number"--%>
<%-- <c:if test="${resultMap.dlvyGroup.bundleDlvyUseAt2 eq 'N' }">disabled="disabled"</c:if>--%>
<%-- value="<fmt:formatNumber value='${resultMap.dlvyGroup.bundleDlvyCndAmt2}' pattern="#,###" />"--%>
<%-- title="묶음배송 조건" id="bundleDlvyCndAmt2" name="bundleDlvyCndAmt2" maxlength="13">--%>
<%-- <span class="input-unit-text mr-8">${curUnit}</span>--%>
<%-- <span>이상일 때 무료배송</span>--%>
<%-- </div>--%>
<%-- <div class="gray-7">--%>
<%-- <p class="fyi">값을 1${curUnit} 이상 입력 하신 경우 설정이 가능 합니다.</p>--%>
<%-- <p class="fyi">묶음배송을 사용함으로 설정하신 상품의 경우에만 해당 조건이 적용됩니다.</p>--%>
<%-- <p class="fyi">묶음배송 상품이 아닌 경우, 상품별로 각각 배송비가 부과될 수 있습니다.</p>--%>
<%-- <p class="fyi">묶음배송 상품은 2개 이상 주문해야 무료배송 조건이 적용됩니다.</p>--%>
<%-- <p class="fyi">무료배송 처리된 묶음배송 상품이 있을 경우, 전체 묶음배송 상품이 무료배송 처리됩니다.--%>
<%-- </p>--%>
<%-- <p class="fyi">묶음배송 상품인 경우, 금액이 가장 높은 기본 배송비를 한 번만 부과합니다.</p>--%>
<%-- </div>--%>
<%-- </div>--%>
<%-- </td>--%>
<%-- </tr>--%>
<tr>
<th rowspan="2">배송 권역(JP)</th>
<td>
<div class="td-inner">
<div class="select-box">
<select title="배송권역 사용여부" id="dlvyAreaAditAt2" name="dlvyAreaAditAt2">
<option value="N" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 ne 'Y' }">selected="selected"</c:if>>사용안함</option>
<option value="Y" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 eq 'Y' }">selected="selected"</c:if>>2권역</option>
</select>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="td-inner">
<div class="td-inner vertical">
<div class="input-container">
<span class="mr-10 fw-500">도서산간지역 추가 배송비</span>
<input type="text" class="input-text sm right number" id="areaAditDlvyAmt2"
name="areaAditDlvyAmt2" <c:if test="${ resultMap.dlvyGroup.dlvyAreaAditAt2 ne 'Y' }">disabled="disabled"</c:if>
value="<fmt:formatNumber value='${resultMap.dlvyGroup.areaAditDlvyAmt2}' pattern="#,###" />"
title="배송권역에 대한 추가 배송비" maxlength="13">
<span class="input-unit-text mr-8">${curUnit}</span>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th rowspan="2">반품배송비(JP)</th>
<td>
<div class="td-inner">
<div class="input-container">
<span>편도 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.returnDlvyAmt2}' pattern="#,###" />" title="편도반품배송비" id="returnDlvyAmt2" name="returnDlvyAmt2" maxlength="13">
${curUnit}
</span>
</div>
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" id="returnDlvyApplcAt2" name="returnDlvyApplcAt2"
<c:choose>
<c:when test="${ resultMap.dlvyGroup.returnDlvyApplcAt2 eq 'Y' }"> value="Y" </c:when>
<c:otherwise> value="N" </c:otherwise>
</c:choose>
<c:if test="${ resultMap.dlvyGroup.returnDlvyApplcAt2 eq 'Y' }">checked="checked"</c:if>>
<span style="margin-right: 5px;" class="check"></span>
</label>
<span class="control-label">왕복 여부</span>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="input-container">
<span>왕복 :
<input type="text" class="input-text sm right number" value="<fmt:formatNumber value='${resultMap.dlvyGroup.exchngDlvyAmt2}' pattern="#,###" />" title="왕복반품배송비" id="exchngDlvyAmt2" name="exchngDlvyAmt2" maxlength="13" <c:if test="${resultMap.dlvyGroup.returnDlvyApplcAt2 ne 'Y'}"> disabled="disabled" </c:if> >
${curUnit}
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</section> </section>

View File

@@ -152,12 +152,14 @@
$.ajax({ $.ajax({
type: "post", type: "post",
url: "<c:url value ='/sopmal/csc/selectBbscttCn'/>", url: "<c:url value ='/sopmal/csc/selectBbscttCn'/>",
data: { contentType: 'application/json',
data: JSON.stringify({
bbsId: bbsId, bbsId: bbsId,
bbscttInnb: bbscttInnb, bbscttInnb: bbscttInnb,
sopmalCd: sopmalCd sopmalCd: sopmalCd
}, }),
success: function (data) { success: function (data) {
console.log(data);
let cn = JSON.parse(data.resBody.result); let cn = JSON.parse(data.resBody.result);
$("#cnDiv").html(cn.cn); $("#cnDiv").html(cn.cn);
if ($("#regusrDvCd").val() === '01' || $("#regusrDvCd").val() === '99') { if ($("#regusrDvCd").val() === '01' || $("#regusrDvCd").val() === '99') {

View File

@@ -306,8 +306,16 @@
event.preventDefault(); // 체크박스 상태 변경 방지 event.preventDefault(); // 체크박스 상태 변경 방지
} }
</script> </script>
<style>
.refund-clause {
border: 1px solid #e9ecef;
padding: clamp(12px, 3%, 18px);
margin-bottom: 16px;
}
</style>
<body> <body>
<%--시큐리티정보가져오기--%> <%--시큐리티정보가져오기--%>
<c:set value = "${resultMap.clauseList}" var = "clauseList"/>
<c:set value = "${resultMap.regusrInfo}" var = "regusrInfo"/> <c:set value = "${resultMap.regusrInfo}" var = "regusrInfo"/>
<c:set value = "${resultMap.bbscttVO}" var = "bbscttVO"/> <c:set value = "${resultMap.bbscttVO}" var = "bbscttVO"/>
<c:set value = "${resultMap.bbsInfo}" var = "bbsInfo"/> <c:set value = "${resultMap.bbsInfo}" var = "bbsInfo"/>
@@ -335,6 +343,11 @@
</c:choose> </c:choose>
<div class="table-wrapper"> <div class="table-wrapper">
<form id="bbsRegForm"> <form id="bbsRegForm">
<div class="refund-clause ck-content">
<c:out value="${clauseList[0].stplatNm}" escapeXml="false"/>
<br><br>
<c:out value="${clauseList[0].stplatCn}" escapeXml="false"/>
</div>
<table class="table write"> <table class="table write">
<caption>게시글 등록</caption> <caption>게시글 등록</caption>
<colgroup> <colgroup>

View File

@@ -265,7 +265,15 @@
} }
} }
</script> </script>
<style>
.refund-clause {
border: 1px solid #e9ecef;
padding: clamp(12px, 3%, 18px);
margin-bottom: 16px;
}
</style>
<body> <body>
<c:set value="${resultMap.clauseList}" var="clauseList"/>
<c:set value="${resultMap.regusrInfo}" var="regusrInfo"/> <c:set value="${resultMap.regusrInfo}" var="regusrInfo"/>
<c:set value="${resultMap.bbscttVO}" var="bbscttVO"/> <c:set value="${resultMap.bbscttVO}" var="bbscttVO"/>
<c:set value="${resultMap.bbsInfo}" var="bbsInfo"/> <c:set value="${resultMap.bbsInfo}" var="bbsInfo"/>
@@ -284,6 +292,11 @@
<div class="table-wrapper"> <div class="table-wrapper">
<form id="bbsRegForm"> <form id="bbsRegForm">
<input type='hidden' name='bbsTyCd' id='bbsTyCd' value='<c:out value="${bbsInfo.bbsTyCd}"/>'> <input type='hidden' name='bbsTyCd' id='bbsTyCd' value='<c:out value="${bbsInfo.bbsTyCd}"/>'>
<div class="refund-clause ck-content">
<c:out value="${clauseList[0].stplatNm}" escapeXml="false"/>
<br><br>
<c:out value="${clauseList[0].stplatCn}" escapeXml="false"/>
</div>
<table class="table write"> <table class="table write">
<caption>게시글 등록</caption> <caption>게시글 등록</caption>
<colgroup> <colgroup>
@@ -361,7 +374,7 @@
<c:out value="${itm.itmCn}"/> <c:out value="${itm.itmCn}"/>
</option> </option>
</c:forEach> </c:forEach>
</select> </select><br/><br/><span style="color: #f03e3e;">(반품문의 시 이미지를 반드시 첨부해 주세요)</span>
</div> </div>
</div> </div>
</td> </td>
@@ -531,7 +544,7 @@
<div class="b-checkbox-container"> <div class="b-checkbox-container">
<label class="b-checkbox checkbox"> <label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="secretBbscttAt" class="chkAt" <input type="checkbox" value="Y" name="secretBbscttAt" class="chkAt"
checked<c:if test="${bbsInfo.bbsTyCd eq '05'}"> onclick="fn_prevent_click(event);"</c:if>> checked<c:if test="${bbsInfo.bbsTyCd eq '05' || bbsInfo.bbsTyCd eq '12'}"> onclick="fn_prevent_click(event);"</c:if>>
<span class="check"></span> <span class="check"></span>
<span class="control-label">비밀글</span> <span class="control-label">비밀글</span>
</label> </label>

View File

@@ -217,11 +217,11 @@
$.ajax({ $.ajax({
type: "post", type: "post",
url: "<c:url value ='/sopmal/csc/selectBbscttCn'/>", url: "<c:url value ='/sopmal/csc/selectBbscttCn'/>",
data: { data: JSON.stringify({
bbsId: bbsId, bbsId: bbsId,
bbscttInnb: bbscttInnb, bbscttInnb: bbscttInnb,
sopmalCd: sopmalCd sopmalCd: sopmalCd
}, }),
success: function (data) { success: function (data) {
let cn = JSON.parse(data.resBody.result).cn; let cn = JSON.parse(data.resBody.result).cn;
$("#cnBbsUpdt").val(cn); $("#cnBbsUpdt").val(cn);

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