diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/mapper/BOGoodsBadgeMapper.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/mapper/BOGoodsBadgeMapper.java new file mode 100644 index 00000000..91398ad8 --- /dev/null +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/mapper/BOGoodsBadgeMapper.java @@ -0,0 +1,17 @@ +package com.wb.domainserver.domain.gcone.goods.badge.mapper; + +import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO; +import com.wb.domainserver.util.dataaccess.DataMap; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface BOGoodsBadgeMapper { + List selectBOGoodsBadgeList(BOGoodsBadgeVO vo); + int selectBOGoodsBadgeCount(BOGoodsBadgeVO vo); + int insertBOGoodsBadge(BOGoodsBadgeVO vo); + int updateBOGoodsBadge(BOGoodsBadgeVO vo); +} diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/service/BOGoodsBadgeService.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/service/BOGoodsBadgeService.java new file mode 100644 index 00000000..12605f08 --- /dev/null +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/service/BOGoodsBadgeService.java @@ -0,0 +1,113 @@ +package com.wb.domainserver.domain.gcone.goods.badge.service; + +import com.wb.domainserver.domain.gcone.goods.badge.mapper.BOGoodsBadgeMapper; +import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO; +import com.wb.domainserver.exception.WnbtRestException; +import com.wb.domainserver.util.dataaccess.DataMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +@Service +public class BOGoodsBadgeService { + private static final Pattern COLOR_PATTERN = Pattern.compile("^#[0-9A-Fa-f]{6}$"); + private static final Pattern BADGE_CODE_PATTERN = Pattern.compile("^[A-Za-z0-9_-]+$"); + + @Autowired + private BOGoodsBadgeMapper mapper; + + public List selectBOGoodsBadgeList(BOGoodsBadgeVO vo) { + return mapper.selectBOGoodsBadgeList(vo); + } + + @Transactional + public DataMap updateBOGoodsBadgeSetup(BOGoodsBadgeVO request) { + DataMap message = new DataMap(); + String[] badgeCdArr = request.getBadgeCdArr(); + if (badgeCdArr == null || badgeCdArr.length == 0) { + message.put("result", "success"); + return message; + } + + validateArrayLengths(request, badgeCdArr.length); + Set newBadgeCodes = new HashSet<>(); + for (int i = 0; i < badgeCdArr.length; i++) { + BOGoodsBadgeVO badge = createBadge(request, i); + validateBadge(badge); + if ("Y".equals(badge.getNewAt())) { + if (!newBadgeCodes.add(badge.getBadgeCd()) || mapper.selectBOGoodsBadgeCount(badge) > 0) { + throw new WnbtRestException("이미 등록된 배지코드입니다."); + } + mapper.insertBOGoodsBadge(badge); + } else { + if (!badge.getBadgeCd().equals(trim(request.getOriginalBadgeCdArr()[i]))) { + throw new WnbtRestException("기존 배지코드는 변경할 수 없습니다."); + } + if (mapper.selectBOGoodsBadgeCount(badge) == 0) { + throw new WnbtRestException("존재하지 않는 배지코드입니다."); + } + mapper.updateBOGoodsBadge(badge); + } + } + + message.put("result", "success"); + return message; + } + + private void validateArrayLengths(BOGoodsBadgeVO vo, int size) { + if (vo.getOriginalBadgeCdArr() == null || vo.getBadgeNmArr() == null || vo.getFontColorArr() == null || vo.getBgColorArr() == null + || vo.getBorderColorArr() == null || vo.getSortOrdrArr() == null || vo.getUseAtArr() == null + || vo.getNewAtArr() == null || vo.getOriginalBadgeCdArr().length != size || vo.getBadgeNmArr().length != size || vo.getFontColorArr().length != size + || vo.getBgColorArr().length != size || vo.getBorderColorArr().length != size + || vo.getSortOrdrArr().length != size || vo.getUseAtArr().length != size || vo.getNewAtArr().length != size) { + throw new WnbtRestException("배지 저장 요청 값이 올바르지 않습니다."); + } + } + + private BOGoodsBadgeVO createBadge(BOGoodsBadgeVO request, int index) { + BOGoodsBadgeVO badge = new BOGoodsBadgeVO(); + badge.setSopmalCd(request.getSopmalCd()); + badge.setRegusr(request.getRegusr()); + badge.setUpdusr(request.getUpdusr()); + badge.setBadgeCd(trim(request.getBadgeCdArr()[index])); + badge.setBadgeNm(trim(request.getBadgeNmArr()[index])); + badge.setFontColor(trim(request.getFontColorArr()[index])); + badge.setBgColor(trim(request.getBgColorArr()[index])); + badge.setBorderColor(trim(request.getBorderColorArr()[index])); + badge.setSortOrdr(trim(request.getSortOrdrArr()[index])); + badge.setUseAt(trim(request.getUseAtArr()[index])); + badge.setNewAt(trim(request.getNewAtArr()[index])); + return badge; + } + + private void validateBadge(BOGoodsBadgeVO badge) { + if (!StringUtils.hasText(badge.getBadgeCd()) || ("Y".equals(badge.getNewAt()) && !BADGE_CODE_PATTERN.matcher(badge.getBadgeCd()).matches())) { + throw new WnbtRestException("배지코드는 영문, 숫자, 밑줄, 하이픈만 입력할 수 있습니다."); + } + if (!StringUtils.hasText(badge.getBadgeNm()) || !COLOR_PATTERN.matcher(badge.getFontColor()).matches() + || !COLOR_PATTERN.matcher(badge.getBgColor()).matches() || !COLOR_PATTERN.matcher(badge.getBorderColor()).matches()) { + throw new WnbtRestException("배지명과 색상값을 확인해 주세요."); + } + try { + if (Integer.parseInt(badge.getSortOrdr()) < 0) { + throw new NumberFormatException(); + } + } catch (NumberFormatException e) { + throw new WnbtRestException("노출순서는 0 이상의 정수만 입력할 수 있습니다."); + } + if (!("Y".equals(badge.getUseAt()) || "N".equals(badge.getUseAt())) + || !("Y".equals(badge.getNewAt()) || "N".equals(badge.getNewAt()))) { + throw new WnbtRestException("배지 저장 요청 값이 올바르지 않습니다."); + } + } + + private String trim(String value) { + return value == null ? "" : value.trim(); + } +} diff --git a/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/vo/BOGoodsBadgeVO.java b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/vo/BOGoodsBadgeVO.java new file mode 100644 index 00000000..eceae9ac --- /dev/null +++ b/src/main/java/com/wb/domainserver/domain/gcone/goods/badge/vo/BOGoodsBadgeVO.java @@ -0,0 +1,28 @@ +package com.wb.domainserver.domain.gcone.goods.badge.vo; + +import com.wb.domainserver.domain.comm.vo.AbstractVO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BOGoodsBadgeVO extends AbstractVO { + + private String sopmalCd; + private String badgeCd; + private String badgeNm; + private String fontColor; + private String bgColor; + private String borderColor; + private String sortOrdr; + private String newAt; + private String[] badgeCdArr; + private String[] originalBadgeCdArr; + private String[] badgeNmArr; + private String[] fontColorArr; + private String[] bgColorArr; + private String[] borderColorArr; + private String[] sortOrdrArr; + private String[] useAtArr; + private String[] newAtArr; +} diff --git a/src/main/java/com/wb/domainserver/domain/mngr/goods/badge/controller/GoodsBadgeController.java b/src/main/java/com/wb/domainserver/domain/mngr/goods/badge/controller/GoodsBadgeController.java new file mode 100644 index 00000000..202c24f6 --- /dev/null +++ b/src/main/java/com/wb/domainserver/domain/mngr/goods/badge/controller/GoodsBadgeController.java @@ -0,0 +1,54 @@ +package com.wb.domainserver.domain.mngr.goods.badge.controller; + +import com.wb.domainserver.domain.gcone.goods.badge.service.BOGoodsBadgeService; +import com.wb.domainserver.domain.gcone.goods.badge.vo.BOGoodsBadgeVO; +import com.wb.domainserver.response.WnbtResponse; +import com.wb.domainserver.response.WnbtResponseBody; +import com.wb.domainserver.security.authentication.AnonymousUser; +import com.wb.domainserver.security.authentication.MemberJwtContextHolder; +import com.wb.domainserver.security.authorization.annotation.AuthPolicy; +import com.wb.domainserver.security.authorization.annotation.Policy; +import com.wb.domainserver.util.dataaccess.DataMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/mngr/goods/badge") +public class GoodsBadgeController { + + @Autowired + private BOGoodsBadgeService service; + + @Policy(AuthPolicy.RESTRICTED) + @RequestMapping("/selectGoodsBadgeSetup") + public String selectGoodsBadgeSetup(BOGoodsBadgeVO vo, ModelMap model, + @CookieValue(value = "authSopmalCd") String authSopmalCd) { + vo.setSopmalCd(authSopmalCd); + DataMap content = new DataMap(); + content.put("badgeList", service.selectBOGoodsBadgeList(vo)); + model.addAttribute("resultMap", content); + return "mngr/goods/badge/GoodsBadgeSetupU"; + } + + @Policy(AuthPolicy.RESTRICTED) + @PostMapping(value = "/updateGoodsBadgeSetup", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateGoodsBadgeSetup(BOGoodsBadgeVO vo, + @CookieValue(value = "authSopmalCd") String authSopmalCd) { + AnonymousUser user = MemberJwtContextHolder.getMemberInfo(); + vo.setSopmalCd(authSopmalCd); + if ("01".equals(user.getSysDvCd())) { + vo.setSopmalCd(user.getSopmalCd()); + } + vo.setRegusr(user.getUserInnb()); + vo.setUpdusr(user.getUserInnb()); + + DataMap message = service.updateBOGoodsBadgeSetup(vo); + return ResponseEntity.ok(WnbtResponse.builder().resBody(new WnbtResponseBody(message)).build()); + } +} diff --git a/src/main/resources/mybatis/xml/mapper/gcone/goods/badge/BOGoodsBadgeMapper.xml b/src/main/resources/mybatis/xml/mapper/gcone/goods/badge/BOGoodsBadgeMapper.xml new file mode 100644 index 00000000..18dbd481 --- /dev/null +++ b/src/main/resources/mybatis/xml/mapper/gcone/goods/badge/BOGoodsBadgeMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + INSERT INTO GC_GOODS_BADGE ( + SOPMAL_CD, BADGE_CD, BADGE_NM, FONT_COLOR, BG_COLOR, BORDER_COLOR, SORT_ORDR, USE_AT, REGUSR, REGIST_DT, UPDUSR, UPDT_DT + ) VALUES ( + #{sopmalCd}, #{badgeCd}, #{badgeNm}, #{fontColor}, #{bgColor}, #{borderColor}, #{sortOrdr}, #{useAt}, #{regusr}, SYSDATE(), #{updusr}, SYSDATE() + ) + + + + UPDATE GC_GOODS_BADGE + SET BADGE_NM = #{badgeNm}, FONT_COLOR = #{fontColor}, BG_COLOR = #{bgColor}, BORDER_COLOR = #{borderColor}, + SORT_ORDR = #{sortOrdr}, USE_AT = #{useAt}, UPDUSR = #{updusr}, UPDT_DT = SYSDATE() + WHERE SOPMAL_CD = #{sopmalCd} AND BADGE_CD = #{badgeCd} + + diff --git a/src/main/webapp/WEB-INF/views/mngr/goods/badge/GoodsBadgeSetupU.jsp b/src/main/webapp/WEB-INF/views/mngr/goods/badge/GoodsBadgeSetupU.jsp new file mode 100644 index 00000000..079ccea6 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/mngr/goods/badge/GoodsBadgeSetupU.jsp @@ -0,0 +1,79 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + <%@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" %> +
+ +
+

상품배지설정관리

+
+
+
+
+

상품 배지

+
+ + + + + +
상품 배지 설정
배지코드배지명글자색배경색테두리색노출순서사용여부미리보기
등록된 배지가 없습니다.
+
+
+
+
+ + +