Просмотр исходного кода

상품대량 수정등록시 입상상품 옵션 추가 처리

eskim 5 лет назад
Родитель
Сommit
a7422e4cac

+ 24 - 0
src/main/java/com/style24/persistence/mybatis/shop/TssGoods.xml

@@ -2434,4 +2434,28 @@
 		</if>
 		ORDER BY B.NI_CLSF_CD, B.DISP_ORD
 	</select>
+	
+	<!-- 상품옵션 패턴조회 -->
+	<select id="getGoodsOption" parameterType="Option" resultType="Option">
+		/* TssGoods.getGoodsOption */
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		FROM TB_OPTION
+		WHERE  GOODS_CD = #{goodsCd}
+		ORDER BY DISP_ORD
+		LIMIT 1
+	</select>
+
+	<!-- 상품옵션 중복건수여부 확인 -->
+	<select id="getGoodsOptionDupCountCheck" parameterType="Option" resultType="int">
+		/* TssGoods.getGoodsOptionDupCountCheck */
+		SELECT COUNT(*)
+		FROM TB_OPTION
+		WHERE  GOODS_CD = #{goodsCd}
+		AND OPT_CD1 = #{optCd1}
+		AND OPT_CD2 = #{optCd2}
+	</select>
+	
 </mapper>

+ 18 - 0
src/main/java/com/style24/scm/biz/dao/TssGoodsDao.java

@@ -554,4 +554,22 @@ public interface TssGoodsDao {
 	 * @since 2021. 1. 24
 	 */
 	Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo);
+
+	/**
+	 * 상품옵션 패턴조회
+	 * @param option
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 5
+	 */
+	Option getGoodsOption(Option option);
+
+	/**
+	 * 상품옵션 중복건수여부 확인
+	 * @param option
+	 * @return
+	 * @author eskim
+	 * @since 2021. 2. 5
+	 */
+	int getGoodsOptionDupCountCheck(Option option);
 }

+ 120 - 6
src/main/java/com/style24/scm/biz/service/TssGoodsService.java

@@ -587,7 +587,7 @@ public class TssGoodsService {
 		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
 		if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
 			goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
-			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+			String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
 			StringBuilder tempGoodsSnm = new StringBuilder();
 			for (String loopGoodsSnm : arrGoodsSnm) {
 				if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
@@ -1222,7 +1222,7 @@ public class TssGoodsService {
 		// 사용자 검색어를 검색어에 적용
 		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
 		if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
-			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+			String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
 			StringBuilder tempGoodsSnm = new StringBuilder();
 			for (String loopGoodsSnm : arrGoodsSnm) {
 				if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
@@ -1701,9 +1701,9 @@ public class TssGoodsService {
 		//옵션1[필수]^옵션2[선택]^추가금액^안전재고[필수]^판매재고[필수]  |
 		//검정^90^0^0^10|검정^95^0^0^8|검정^100^0^0^5|파랑^90^0^0^15|파랑^95^0^0^5|파랑^100^0^0^1|파랑^105^0^0^7
 
-		String[] arrSizeCd = GagaStringUtil.cutTokenToArray(goodsMass.getOptStr().trim(), "|");
+		String[] arrSizeCd = goodsMass.getOptStr().trim().split("\\|");
 		for (int i = 0; i < arrSizeCd.length; i++) {
-			String[] arrOptCd = GagaStringUtil.cutTokenToArray(arrSizeCd[i], "^");
+			String[] arrOptCd = arrSizeCd[i].split("\\^");
 			if (arrOptCd.length != 5) {
 				goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 옵션구분자[^] 갯수 상이");
 				goods.setGoodsStat("10");
@@ -1844,7 +1844,7 @@ public class TssGoodsService {
 		// 사용자 검색어를 검색어에 적용
 		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
 		if (!StringUtils.isBlank(goods.getGoodsSnm1())) {
-			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+			String[] arrGoodsSnm = goods.getGoodsSnm1().split("\\;");
 			StringBuilder tempGoodsSnm = new StringBuilder();
 			for (String loopGoodsSnm : arrGoodsSnm) {
 				if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
@@ -2247,7 +2247,7 @@ public class TssGoodsService {
 		GoodsMass goodsMass = mapper.convertValue(gagaMap, GoodsMass.class);
 
 		if (StringUtils.isBlank(goodsMass.getGoodsCd())) {
-			throw new IllegalStateException("상품코드가 없습니다.");
+			throw new IllegalStateException("상품코드는 필수입니다.");
 		}
 
 		// 상품기본정보
@@ -2267,6 +2267,114 @@ public class TssGoodsService {
 			return goods.getGoodsStat();
 		}
 
+		// 옵션
+		Collection<Option> stockList = new ArrayList<>();
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getOptStr().trim())) {
+
+			//옵션1[필수]^옵션2[선택]^추가금액^안전재고[필수]^판매재고[필수]  |
+			//검정^90^0^0^10|검정^95^0^0^8|검정^100^0^0^5|파랑^90^0^0^15|파랑^95^0^0^5|파랑^100^0^0^1|파랑^105^0^0^7
+
+			Option dupOption = new Option();
+			dupOption.setGoodsCd(goodsMass.getGoodsCd());
+			int cnt = goodsDao.getGoodsOptionCount(dupOption); // 기 등록된 옵션 건수 조회
+
+			String[] arrSizeCd = goodsMass.getOptStr().trim().split("\\|");
+			for (int i = 0; i < arrSizeCd.length; i++) {
+				String[] arrOptCd = arrSizeCd[i].split("\\^");
+				log.info("[ arrOptCd.length] {}", arrOptCd.length);
+				if (arrOptCd.length != 5) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 옵션구분자[^] 갯수 상이");
+					goods.setGoodsStat("10");
+					break;
+				}
+
+				// 옵션1 - 필수
+				if (StringUtils.isBlank(arrOptCd[0])) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 옵션1 정보없음");
+					goods.setGoodsStat("10");
+					break;
+				}
+				// 추가금액 - 필수
+				if (StringUtils.isBlank(arrOptCd[2])) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 추가금액 정보없음");
+					goods.setGoodsStat("10");
+					break;
+				}
+				if (!arrOptCd[2].trim().matches(NUMBER_PATTERN)) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 추가금액 숫자 오류");
+					goods.setGoodsStat("10");
+					break;
+				}
+				// 안전재고 - 필수
+				if (StringUtils.isBlank(arrOptCd[3])) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 안전재고 정보없음");
+					goods.setGoodsStat("10");
+					break;
+				}
+				if (!arrOptCd[3].trim().matches(NUMBER_PATTERN)) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 안전재고 숫자 오류");
+					goods.setGoodsStat("10");
+					break;
+				}
+				// 판매재고 - 필수
+				if (StringUtils.isBlank(arrOptCd[4])) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 판매재고 정보없음");
+					goods.setGoodsStat("10");
+					break;
+				}
+				if (!arrOptCd[4].trim().matches(NUMBER_PATTERN)) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 판매재고 숫자 오류");
+					goods.setGoodsStat("10");
+					break;
+				}
+
+				// 옵션 중복 여부 확인
+				String optCd1 = arrOptCd[0];
+				String optCd2 = arrOptCd[1];
+				dupOption.setOptCd1(optCd1);
+				dupOption.setOptCd2(optCd2);
+
+				//상품옵션 중복건수여부 확인
+				int dupOptionCnt = goodsDao.getGoodsOptionDupCountCheck(dupOption);
+				if (dupOptionCnt > 0) {
+					goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 옵션1과 옵션2가 중복되는 옵션이 존재합니다.");
+					goods.setGoodsStat("10");
+					break;
+				}
+
+				//상품옵션 패턴조회
+				Option goodsOption = goodsDao.getGoodsOption(dupOption);
+				if (goodsOption != null) {
+					if (StringUtils.isBlank(goodsOption.getOptCd2()) == !StringUtils.isBlank(optCd2) || !StringUtils.isBlank(goodsOption.getOptCd2()) == StringUtils.isBlank(optCd2)) {
+						goods.setGoodsRegMsg("옵션(SKU) " + (i + 1) + "번째 옵션2가 기 등록된 옵션2의 패턴과 다릅니다.");
+						goods.setGoodsStat("10");
+						break;
+					}
+				}
+
+				Option goodsStock = new Option();
+				goodsStock.setGoodsCd(goods.getGoodsCd());
+				goodsStock.setOptCd(goods.getGoodsCd() + "-" + (cnt + (i + 1)));
+				goodsStock.setOptCd1(arrOptCd[0].trim());
+				goodsStock.setOptCd2(arrOptCd[1].trim());
+				goodsStock.setAddPrice(Integer.parseInt(arrOptCd[2]));
+				goodsStock.setBaseStockQty(Integer.parseInt(arrOptCd[3]));
+				goodsStock.setCurrStockQty(Integer.parseInt(arrOptCd[4]));
+				goodsStock.setSoldoutYn("N");
+				goodsStock.setDispOrd(cnt + (i + 1));
+				goodsStock.setDispYn("Y");
+				goodsStock.setRegNo(goods.getRegNo());
+				goodsStock.setUpdNo(goods.getUpdNo());
+
+				stockList.add(goodsStock);
+			}
+		}
+
+		if ("10".equals(goods.getGoodsStat())) { // 정보 오류
+			this.setGoodsRegResult(goods, goodsMass, procJob);
+			return goods.getGoodsStat();  //continue
+		}
+
 		// 상품 고시
 		Collection<GoodsNotiInfo> newGoodsNotiList = new ArrayList<>(); //적용할 고시 정보
 		goods = this.getUpdateMassGoodsNotiCheck(goods, gagaMap, goodsOrigin, newGoodsNotiList);
@@ -2341,6 +2449,12 @@ public class TssGoodsService {
 			}
 		}
 
+		// 품목변경시 카테고리 자동 전시
+		if (!UPDATE_NO_PATTERN.equals(goodsMass.getOptStr().trim()) && stockList != null && !stockList.isEmpty()) {
+			goods.setSelfGoodsYn(goodsOrigin.getSelfGoodsYn());
+			this.createGoodsSize(goods, stockList); // 입점 상품사이즈 정보 자장
+		}
+
 		// 품목변경시 카테고리 자동 전시
 		if (!UPDATE_NO_PATTERN.equals(goods.getItemkindCd().trim())) {
 			GoodsCategory goodsCategory = new GoodsCategory();

+ 1 - 1
src/main/java/com/style24/scm/biz/web/TssGoodsController.java

@@ -880,7 +880,7 @@ public class TssGoodsController extends TssBaseController {
 		String[] goodsNames = {"goodsCd", "goodsNm", "goodsTnm", "goodsSnm1", "itemkindCd", "seasonCd",
 			"sexGb", "currPrice", "sellFeeRate", "goodsGb", "formalGb", "minOrdQty", "maxOrdQty", "dayMaxOrdQty",
 			"giftPackYn", "newCustOrdYn","pntPrate","prePpntUsableYn", "pntMrate","preMpntUsableYn",
-			"returnableYn", "changeableYn","taxGb", "ageGrpCd", "adultYn", "delvFeeCd", "goodsContent",
+			"returnableYn", "changeableYn","taxGb", "ageGrpCd", "adultYn", "delvFeeCd", "optStr","goodsContent",
 			"niClsfCd", "niContent1", "niContent2",
 			"niContent3", "niContent4", "niContent5", "niContent6", "niContent7", "niContent8", "niContent9",
 			"niContent10", "niContent11", "niContent12", "niContent13", "niContent14", "niContent15", "niContent16",

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -1434,7 +1434,7 @@
 			
 			// 첫번째 옵션2의 정보를 확인하여 동일 한지 체크
 			var firstOptCd2 = $("#optionList tr").find("input[name=optCd2]").eq(idx).focus();
-			if (gagajf.isNull(firstOptCd2) != gagajf.isNull(optCd2) ){
+			if ((gagajf.isNull(firstOptCd2) == !gagajf.isNull(optCd2))  || (!gagajf.isNull(firstOptCd2) == gagajf.isNull(optCd2))){
 				optCheck = true;
 				mcxDialog.alertC("옵션2를 확인해주세요", {
 					sureBtnText: "확인",