diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/mapper/BOSubsvcMapper.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/mapper/BOSubsvcMapper.java index 178c1a39..6201aea7 100644 --- a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/mapper/BOSubsvcMapper.java +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/mapper/BOSubsvcMapper.java @@ -26,5 +26,8 @@ public interface BOSubsvcMapper { int deleteBOMngrSubsvc(BOSubsvcVO vo); /** 관리자 구독서비스 수정*/ int updateBOMngrSubsvc(BOSubsvcVO vo); - + /** 관리자 구둑서비스 등록 */ + void insertBOMngrSubsvc(BOSubsvcVO vo); + /** 관리자 구독서비스 명 중복체크*/ + int selectBOMngrSubsvcNmDupCheck(BOSubsvcVO vo); } diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/service/BOSubsvcService.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/service/BOSubsvcService.java index 4ae5d343..b18d34bf 100644 --- a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/service/BOSubsvcService.java +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/service/BOSubsvcService.java @@ -4,6 +4,7 @@ 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; @@ -94,6 +95,19 @@ public class BOSubsvcService { return message; } + /** + * 관리자 구독서비스명 중복체크 + * */ + public String selectBOMngrSubsvcNmDupCheck(BOSubsvcVO vo) { + String message = "success"; + int result = mapper.selectBOMngrSubsvcNmDupCheck(vo); + if (result > 0) { + message = "fail"; + } + return message; + } + + /** * 관리자 구독서비스 수정 * */ @@ -106,5 +120,21 @@ public class BOSubsvcService { 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; + } } diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/vo/BOSubsvcVO.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/vo/BOSubsvcVO.java index 6e2ed3f8..6dad7364 100644 --- a/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/vo/BOSubsvcVO.java +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/subsvc/vo/BOSubsvcVO.java @@ -22,6 +22,8 @@ private static final long serialVersionUID = 1L; private String subPd; /** 구독서비스기수 */ private String subsvcGnr; + /** 구독서비스명 다음기수 */ + private String subsvcNextGnr; /** 구독서비스기수명 */ private String subsvcGnrNm; /** 배송횟수 */ diff --git a/src/main/java/com/wb/domainserver/domain/mngr/goods/subsvc/controller/SubsvcController.java b/src/main/java/com/wb/domainserver/domain/mngr/goods/subsvc/controller/SubsvcController.java index b7ef1969..2ae7b95f 100644 --- a/src/main/java/com/wb/domainserver/domain/mngr/goods/subsvc/controller/SubsvcController.java +++ b/src/main/java/com/wb/domainserver/domain/mngr/goods/subsvc/controller/SubsvcController.java @@ -170,7 +170,7 @@ public class SubsvcController { } /** - * 상품 수정(상품이미지) + * 구독서비스 수정 * @param vo * @param request * @return @@ -218,6 +218,97 @@ public class SubsvcController { ); } + /** + * 구독서비스 등록(복사)품 + * @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 content = new HashMap<>(); + content.put("paramVO", vo); + + // 구독서비스 상세조회 + DataMap subsvcDtl = service.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 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> uploadFileMap = new ArrayList>(); + + 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 message = new HashMap<>(); + String result = service.insertBOMngrSubsvc(vo); + message.put("message",result); + + return ResponseEntity.ok( + WnbtResponse.builder() + .resBody(new WnbtResponseBody(message)) + .build() + ); + } + + /** * 구독서비스 목록 조회 리스트 * @param vo @@ -262,6 +353,32 @@ public class SubsvcController { return "mngr/goods/subsvc/SubsvcList"; } + /** + * 구독서비스명 중복체크 + * @param vo + * @return ResponseEntity + */ + @Policy(AuthPolicy.RESTRICTED) + @RequestMapping(value = "/selectSubsvcNmDupCheck", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity 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 = service.selectBOMngrSubsvcNmDupCheck(vo); + message.put("message", result); + + return ResponseEntity.ok( + WnbtResponse.builder() + .resBody(new WnbtResponseBody(message)) + .build() + ); + } + + /** * 구독서비스 선택삭제 * @param vo diff --git a/src/main/resources/mybatis/xml/mapper/gcone/goods/subsvc/BOSubsvcMapper.xml b/src/main/resources/mybatis/xml/mapper/gcone/goods/subsvc/BOSubsvcMapper.xml index 03fc18f6..1738acef 100644 --- a/src/main/resources/mybatis/xml/mapper/gcone/goods/subsvc/BOSubsvcMapper.xml +++ b/src/main/resources/mybatis/xml/mapper/gcone/goods/subsvc/BOSubsvcMapper.xml @@ -33,6 +33,7 @@ , 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 /*배송횟수*/ @@ -192,8 +193,22 @@ , AVLINV_LMTT_QY = #{avlinvLmttQy} , SUBSVC_STTUS_CD = #{subsvcSttusCd} , EXPSR_DV_CD = #{expsrDvCd} + + , EXPSR_BGN_DT = #{expsrBgnDt} + + + , EXPSR_BGN_DT = null + + + + , EXPSR_END_DT = #{expsrEndDt} + + + , EXPSR_END_DT = null + + , SUBSVC_DC = #{subsvcDc} , MBL_SUBSVC_DC = #{mblSubsvcDc} , MBL_SUBSVC_DC_PC_SAME_AT = #{mblSubsvcDcPcSameAt} @@ -205,4 +220,82 @@ WHERE SUBSVC_INNB = #{subsvcInnb} + + + 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} + + + , #{expsrBgnDt} + + + , null + + + + + , #{expsrEndDt} + + + , null + + + , #{subsvcDc} + , #{mblSubsvcDc} + , #{mblSubsvcDcPcSameAt} + , #{img} + , 5 + , 'Y' + , #{regusr} + , NOW() + ) + + + + diff --git a/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcC.jsp b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcC.jsp new file mode 100644 index 00000000..0cba3dcc --- /dev/null +++ b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcC.jsp @@ -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 최초생성 +--%> + + + + + + + 일반 관리자 + <%-- 공통 include --%> + <%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%> + + + +<%@ include file="/WEB-INF/views/comm/mngr/Header.jsp"%> +
+ <%@ include file="/WEB-INF/views/comm/mngr/Left.jsp"%> +
+
+ +
+

+ 구독서비스 등록 +

+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+

기본정보

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
기본정보
구독서비스명* +
+ readonly required> + + + + +
+
구독기간* +
+ 개월 +
+
기수 +
+ 기 +
+
기수명* +
+ +
+
배송횟수* +
+ 회 +
+
배송주기* +
+ +
+
+
+
+
+
+
+

판매정보

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
판매정보
구독료* +
+ 円(엔) +
+
1회 배송비* +
+ 円(엔) +
+
소비자가 +
+ 円(엔) +
+
실판매가* +
+ 円(엔) +
+
+
+
+
+
+
+

구독설정

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
구독설정
재고* +
+ +
+
가용재고 +
+ +
+
판매 상태 +
+
+ +
+ checked/> + + +
+
+
+
+
노출 여부 +
+
+ +
+ checked/> + + +
+
+
+
+ + + + + + + + + + + + +
노출 기간
노출 기간 +
+ +
+ +
+ ~ + +
+ +
+
+
+
+
+
재고에 따른 판매 +
+
+ +
+ checked/> + +
+ +
+ ( + disabled /> + 개 이하 일 때 품절 처리 + ) +
+
+
+
+
+
+
+
+
+
+
+

구독서비스 설명

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
구독서비스 설명
대표이미지(썸네일) 등록* +
+
+ +
+

1개의 이미지만 등록가능합니다.

+
+
+
상품 설명* +
+
+
모바일용 상세 설명 설정 +
+
+
+ checked> + +
+
+ checked> + +
+
+
+
모바일용 상세 설명* +
+
+
+
+
+
+ + +
+
+ +
+ +
+ <%--관리자 수정이력 내역보기 모달 --%> +
+
+ + + diff --git a/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcListForm.jsp b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcListForm.jsp index 92cbe1a5..40cb6a7e 100644 --- a/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcListForm.jsp +++ b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcListForm.jsp @@ -98,7 +98,7 @@ * 구독서비스 복사 조회 *********************************************************/ const fn_move_subsvc_copy = (subsvcInnb) => { - const url = ''; + const url = ''; $('#subsvcInnb').val(subsvcInnb); $('#listForm').attr('action', url); diff --git a/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcU.jsp b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcU.jsp index 25c91458..10ded83e 100644 --- a/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcU.jsp +++ b/src/main/webapp/WEB-INF/views/mngr/goods/subsvc/SubsvcU.jsp @@ -357,6 +357,9 @@ $('#expsrBgnDt').val(expsrBgnDt); $('#expsrEndDt').val(expsrEndDt); + }else if($('input[name="expsrDvCd"]:checked').val() != '03'){ + $('#expsrBgnDt').val(''); + $('#expsrEndDt').val(''); } //재고가 있으면 판매인 경우 개수 품절처리 필수 @@ -434,12 +437,17 @@ contentType: false, processData: false, success: function (data) { - const message = JSON.parse(data.resBody.result).message; - if(message == "success"){ - alert(''); - //등록 후 수정화면으로 이동 - window.location.reload(); - } else { + try{ + const message = JSON.parse(data.resBody.result).message; + if(message == "success"){ + alert(''); + //등록 후 수정화면으로 이동 + window.location.reload(); + } else { + alert(''); + } + }catch (e) { + console.log(e); alert(''); } } @@ -480,7 +488,7 @@ - +