Browse Source

네이버 최저가 조회

eskim 5 năm trước cách đây
mục cha
commit
341971d174

+ 42 - 0
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -10,6 +10,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -850,4 +851,45 @@ public interface TsaGoodsDao {
 	 */
 	void updateGoodsSupplyPricecfrmDt(GoodsPriceRes goodsPriceRes);
 
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 네이버 최저가 최종 작업일
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	String getGoodsNaverLowestPriceReqYmd();
+
+	/**
+	 * 상품 네이버 최저가  삭제
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	void deleteGoodsNaverLowestPrice();
+
+	/**
+	 * 상품 네이버 최저가 저장
+	 *
+	 * @param goodsNaverLowestPrice
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 09
+	 */
+	void saveGoodsNaverLowestPrice(GoodsNaverLowestPrice goodsNaverLowestPrice);
+
+
 }

+ 117 - 0
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.admin.biz.dao.TsaGoodsDao;
 import com.style24.admin.support.env.TsaConstants;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.thirdparty.NaverLowestPriceApi;
 import com.style24.core.biz.thirdparty.SafetyKoreaApi;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Brand;
@@ -25,6 +26,7 @@ import com.style24.persistence.domain.GoodsDesc;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
 import com.style24.persistence.domain.GoodsImg;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -33,6 +35,7 @@ import com.style24.persistence.domain.GoodsSearch;
 import com.style24.persistence.domain.GoodsTnmRes;
 import com.style24.persistence.domain.GoodsVideo;
 import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.NaverLowestPrice;
 import com.style24.persistence.domain.NotiInfo;
 import com.style24.persistence.domain.Notice;
 import com.style24.persistence.domain.NoticeGoods;
@@ -88,6 +91,10 @@ public class TsaGoodsService {
 	@Autowired
 	private SafetyKoreaApi safetyKoreaApi;
 
+	@Autowired
+	private NaverLowestPriceApi naverLowestPriceApi;
+
+
 	@Autowired
 	private ObjectMapper mapper;
 
@@ -1075,6 +1082,7 @@ public class TsaGoodsService {
 		goodsDesc.setDescGb("50");
 		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
 		this.saveGoodsDesc(goodsDesc);
+
 	}
 
 	/**
@@ -2245,4 +2253,113 @@ public class TsaGoodsService {
 		}
 	}
 
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	public Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	@Transactional("shopTxnManager")
+	public Collection<GoodsNaverLowestPrice> saveGoodsNaverPrice(GoodsSearch goodsSearch) {
+
+		// 1. 조회 상품 TB_SEARCH_DATA 담기
+		int index = 0;
+		for (String goodsCd : goodsSearch.getConditionList()) {
+
+			SearchData searchData = new SearchData();
+			searchData.setRegNo(TsaSession.getInfo().getUserNo());
+			searchData.setSearchCd(goodsCd);
+			if (index == 0) {
+				commonService.deleteExceluploadSearCh(searchData);
+			}
+
+			commonService.createExceluploadSearch(searchData);
+			index++;
+		}
+
+		// 2. 일 최초 조회이면 테이블 삭제
+		String regYmd  = goodsDao.getGoodsNaverLowestPriceReqYmd();
+		if (!StringUtils.isEmpty(regYmd) && !regYmd.equals(GagaDateUtil.getToday())) {
+			goodsDao.deleteGoodsNaverLowestPrice();
+		}
+
+		// 3. 네이버 최저가 조회 저장
+		saveGoodsNaverLowestPrice(goodsSearch);
+
+		// 4. 최저가 상품 조회
+		goodsSearch.setSearchGb("EXCEL");
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		return goodsDao.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 상품 네이버 최저가 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	private void saveGoodsNaverLowestPrice(GoodsSearch goodsSearch) {
+
+		for (String goodsCd : goodsSearch.getConditionList()) {
+			try {
+				log.info("saveGoodsNaverLowestPrice  11 =  {}", GagaDateUtil.getTodayDateTime());
+				TaskSleeep();
+				log.info("saveGoodsNaverLowestPrice  22 =  {}", GagaDateUtil.getTodayDateTime());
+				NaverLowestPrice naverLowestPrice = naverLowestPriceApi.getLowestPrice(goodsCd);
+
+				log.info("[saveGoodsNaverLowestPrice] naverLowestPrice= {}",naverLowestPrice);
+				if (naverLowestPrice != null) {
+					GoodsNaverLowestPrice goodsNaverLowestPrice = new GoodsNaverLowestPrice();
+					goodsNaverLowestPrice.setReqYmd(GagaDateUtil.getToday());
+					goodsNaverLowestPrice.setGoodsCd(goodsCd);
+					goodsNaverLowestPrice.setMallNm(naverLowestPrice.getItems().iterator().next().getMallName());
+					goodsNaverLowestPrice.setMallLink(naverLowestPrice.getItems().iterator().next().getLink());
+					goodsNaverLowestPrice.setLowestPrice(naverLowestPrice.getItems().iterator().next().getLprice());
+					goodsNaverLowestPrice.setRegNo(TsaSession.getInfo().getUserNo());
+					goodsNaverLowestPrice.setUpdNo(TsaSession.getInfo().getUserNo());
+					log.info("[saveGoodsNaverLowestPrice] goodsNaverLowestPrice= {}", goodsNaverLowestPrice);
+					goodsDao.saveGoodsNaverLowestPrice(goodsNaverLowestPrice);
+
+				}
+
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+
+	}
+
+	/**
+	 *
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 08
+	 */
+	static void TaskSleeep() {
+		try {
+			Thread.sleep(100);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
 }

+ 56 - 0
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -34,6 +34,7 @@ import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.GoodsCompose;
 import com.style24.persistence.domain.GoodsEpSkip;
 import com.style24.persistence.domain.GoodsHst;
+import com.style24.persistence.domain.GoodsNaverLowestPrice;
 import com.style24.persistence.domain.GoodsNotiInfo;
 import com.style24.persistence.domain.GoodsPriceRes;
 import com.style24.persistence.domain.GoodsResSell;
@@ -2039,9 +2040,64 @@ public class TsaGoodsController extends TsaBaseController {
 		// 공급업체
 		String supplyCompCd = "";
 		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd, "Y"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
 
 		mav.setViewName("goods/GoodsNaverPriceForm");
 		return mav;
 	}
 
+	/**
+	 * 상품목록 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/naver/price/list")
+	@ResponseBody
+	public Collection<GoodsNaverLowestPrice> getGoodsNaverPriceList(@RequestBody GoodsSearch goodsSearch) {
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo().toString());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
+
+		return goodsService.getGoodsNaverPriceList(goodsSearch);
+	}
+
+	/**
+	 * 네이버 최저가 상품 정보 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/naver/lowest/price/save")
+	@ResponseBody
+	public Collection<GoodsNaverLowestPrice> saveGoodsNaverPrice(@RequestBody GoodsSearch goodsSearch) {
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		return goodsService.saveGoodsNaverPrice(goodsSearch);
+	}
+
 }

+ 30 - 0
style24.admin/src/main/java/com/style24/persistence/domain/GoodsNaverLowestPrice.java

@@ -0,0 +1,30 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 네이버 최저가 도메인
+ *
+ * @author gagamel
+ * @since 2020. 12. 08
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsNaverLowestPrice extends TscBaseDomain {
+
+	private String reqYmd;
+	private String goodsCd;
+	private String mallNm;
+	private String mallLink;
+	private int lowestPrice;
+
+	private String brandCd;
+	private String brandEnm;
+	private String goodsNm;
+	private int listPrice;
+	private int currPrice;
+	private int benefitPrice;
+
+}

+ 123 - 3
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -404,7 +404,7 @@
 		    , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = Z.ITEMKIND_CD ) AS ITEMKIND_NM
 		    , FN_GET_USER_NM(REG_NO) AS REG_NM
 		    , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		    <if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		    <if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		    , GB.CURR_PRICE AS BENEFIT_CURR_PRICE
 		    </if>
 		FROM (
@@ -732,7 +732,7 @@
 		<when test="pageable != null">
 		    ) A
 		)Z
-		<if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		<if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON Z.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
 		</if> 
 		WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
@@ -740,7 +740,7 @@
 		<otherwise>
 		    ) A
 		)Z
-		<if test='goodsPriceYn != null and goodsPriceYn = "Y"'>
+		<if test='goodsPriceYn != null and goodsPriceYn == "Y"'>
 		LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON Z.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
 		</if> 
 		</otherwise>
@@ -880,6 +880,7 @@
 		     , G.SELL_FEE_RATE
 		     , G.FORMAL_GB
 		     , G.RETURNABLE_YN
+		     , G.CHANGEABLE_YN
 		     , G.PRE_PPNT_USABLE_YN
 		     , G.PRE_MPNT_USABLE_YN
 		     , G.MIN_ORD_QTY
@@ -1620,6 +1621,8 @@
 		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
 		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
 		  , DISTRIBUTION_GB = #{distributionGb}
+		  , RETURNABLE_YN = #{returnableYn}
+		  , CHANGEABLE_YN = #{changeableYn}
 		  , AGE_GRP_CD = #{ageGrpCd}
 		  , SELL_FEE_RATE = #{sellFeeRate}
 		  , GIFT_PACK_YN = #{giftPackYn}
@@ -3055,5 +3058,122 @@
 		     , UPD_NO = #{updNo}
 		     , UPD_DT = NOW()
 	</insert>
+	
+	<!-- 상품 네이버 최저가 목록 -->
+	<select id="getGoodsNaverPriceList" parameterType="GoodsSearch" resultType="GoodsNaverLowestPrice">
+		/* TsaGoods.getGoodsNaverPriceList */
+		        SELECT
+		                GE.REQ_YMD
+		              , G.GOODS_CD
+		              , GE.MALL_NM
+		              , GE.MALL_LINK
+		              , GE.LOWEST_PRICE
+		              , B.BRAND_ENM
+		              , G.BRAND_CD
+		              , G.GOODS_NUM
+		              , G.GOODS_NM
+		              , G.LIST_PRICE
+		              , G.CURR_PRICE
+		              , NVL(GB.PC_CURR_PRICE,G.CURR_PRICE) AS BENEFIT_PRICE
+		              , FN_GET_USER_NM(GE.REG_NO) AS UPD_NM
+		              , DATE_FORMAT(GE.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
+		              , DATE_FORMAT(GE.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		               <choose>
+		                  <when test="searchGb != null and searchGb =='EXCEL'">
+		              , SD.TMP_DISP_ORD
+		                  </when>
+		                  <otherwise>
+		              , 0 AS TMP_DISP_ORD
+		                  </otherwise>
+		              </choose>
+		        FROM TB_GOODS G
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_NAVER_LOWEST_PRICE GE ON G.GOODS_NUM = GE.GOODS_CD
+		        LEFT OUTER JOIN TB_GOODS_BENEFIT_PRICE GB ON G.GOODS_CD = GB.GOODS_CD AND GB.CUST_GB = 'G100_00'
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                     SELECT SEARCH_CD
+		                          , TMP_DISP_ORD
+		                     FROM (
+		                           SELECT SEARCH_CD
+		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                           FROM TB_SEARCH_DATA
+		                           WHERE REG_NO = #{regNo}
+		                           GROUP BY SEARCH_CD) T
+		                   ) SD
+		                   ON ( (G.GOODS_NUM LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                        <if test="mdNo != null and mdNo != ''">
+		                        AND G.BRAND_CD IN (
+		                                           SELECT DISTINCT BRAND_CD
+		                                           FROM TB_BRAND_MD
+		                                           WHERE MD_NO = CAST(#{mdNo} AS UNSIGNED)
+		                                           )
+		                       </if>
+		                   )
+		        </if>
+		        WHERE 1=1
+		        <if test="mdNo != null and mdNo != ''">
+		        AND G.BRAND_CD IN (
+		                           SELECT DISTINCT BRAND_CD
+		                           FROM TB_BRAND_MD
+		                           WHERE MD_NO = CAST(#{mdNo} AS UNSIGNED)
+		                          )
+		        </if>
+		        <if test="searchGb == null or searchGb =='BASIC' " >
+		        <include refid="getGoodsListCondition_sql"/>
+		        ORDER BY GE.REQ_YMD, G.GOODS_CD
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        ORDER BY SD.TMP_DISP_ORD
+		        </if>
+	</select>
+	
+	<!-- 상품 네이버 최저가 최종 작업일 -->
+	<select id="getGoodsNaverLowestPriceReqYmd" resultType="String">
+		/* TsaGoods.getGoodsNaverLowestPriceReqYmd */
+		SELECT MAX(REQ_YMD)
+		FROM TB_GOODS_NAVER_LOWEST_PRICE
+	</select>
+	
+	<!-- 상품 네이버 최저가 삭제 -->
+	<delete id="deleteGoodsNaverLowestPrice">
+		/* TsaGoods.deleteGoodsNaverLowestPrice */
+		TRUNCATE TABLE TB_GOODS_NAVER_LOWEST_PRICE
+	</delete>
+	
+	<!-- 상품 네이버 최저가 저장 -->
+	<insert id="saveGoodsNaverLowestPrice"  parameterType="GoodsNaverLowestPrice" >
+		/* TsaGoods.saveGoodsNaverLowestPrice */
+		INSERT INTO TB_GOODS_NAVER_LOWEST_PRICE (
+		    REQ_YMD
+		  , GOODS_CD
+		  , MALL_NM
+		  , MALL_LINK
+		  , LOWEST_PRICE
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{reqYmd}
+		  , #{goodsCd}
+		  , #{mallNm}
+		  , #{mallLink}
+		  , #{lowestPrice}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       MALL_NM = #{mallNm}
+		     , MALL_LINK = #{mallLink}
+		     , LOWEST_PRICE = #{lowestPrice}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
 	
 </mapper>

+ 24 - 8
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -158,7 +158,7 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="9">&nbsp;</td>
+										<td rowspan="11">&nbsp;</td>
 										<th>시즌<em class="required" title="필수"></em></th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">
@@ -234,16 +234,12 @@
 										<td><input type="text" class="w80p aR" id="sellFeeRate" name="sellFeeRate" maxlength="10" data-valid-type="numeric"/> %
 											<input type="hidden" id="sellFeeRateOrg" name="sellFeeRateOrg"/>
 										</td>
-										<th>반품여부<em class="required" title="필수"></em></th>
-										<td>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
-											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
-											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+										<td  colspan="2">
 										</td>
 									</tr>
 									<tr>
 										<th>품목코드<em class="required" title="필수"></em></th>
-										<td colspan="3">
+										<td colspan="5">
 											<select  name="itemkindCd" id="itemkindCd" th:disabled="${sessionInfo.roleCd != 'G001_0000' AND sessionInfo.roleCd != 'G001_A000' AND sessionInfo.roleCd != 'G001_A101' AND sessionInfo.roleCd != 'G001_A100' AND sessionInfo.roleCd != 'G001_A001'}">
 												<option th:if="${itemkindList}" th:each="oneData, status : ${itemkindList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 											</select>
@@ -252,6 +248,21 @@
 											<button type="button" class="btn btn-success btn-lg" id="btnGoodsItemkindChange">품목변경</button>
 											</th:block>
 										</td>
+										
+									</tr>
+									<tr>
+										<th>반품여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="returnableYn" id="returnableYnN" value="N"/>N</label>
+											<input type="hidden" id="returnableYnOrg" name="returnableYnOrg"/>
+										</td>
+										<th>교환여부<em class="required" title="필수"></em></th>
+										<td>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnY" value="Y" />Y</label>
+											<label class="rdoBtn"><input type="radio" name="changeableYn" id="changeableYnN" value="N"/>N</label>
+											<input type="hidden" id="changeableYnOrg" name="changeableYnOrg"/>
+										</td>
 										<th>과세구분</th>
 										<td>
 											<select name="taxGb"  disabled="disabled">
@@ -315,7 +326,6 @@
 										</td>
 									</tr>
 									<tr>
-										<td></td>
 										<th>안전인증번호</th>
 										<td colspan="5">
 											<input type="text" class="w150" id="certNum" name="certNum"  maxlength="20"/>
@@ -749,6 +759,12 @@
 			}else{
 				$("#goodsDetailForm input:radio[name=returnableYn]:input[value='N']").trigger('click');
 			}
+			if (result.changeableYn == "Y"){
+				$("#goodsDetailForm input:radio[name=changeableYn]:input[value='Y']").trigger('click');
+			}else{
+				$("#goodsDetailForm input:radio[name=changeableYn]:input[value='N']").trigger('click');
+			}
+		
 			
 			$('#goodsDetailForm input[name=sellFeeRate]').val(result.sellFeeRate);
 			$("#goodsDetailForm input[name=sellFeeRateOrg]").val(result.sellFeeRate);

+ 147 - 161
style24.admin/src/main/webapp/WEB-INF/views/goods/GoodsNaverPriceForm.html

@@ -23,13 +23,16 @@
 		<!-- 메뉴 설명 -->
 		<div class="infoBox menu-desc">
 		</div>
-		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/list'}">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/naver/price/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
  		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
 			<!-- TITLE -->
 			<div class="panelTitle">
 				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
 			</div>
 			<!-- //TITLE -->
 			<div class="panelContent">
@@ -41,8 +44,8 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th rowspan="3">브랜드</th>
-						<td rowspan="3">
+						<th>브랜드</th>
+						<td>
 							<select name="supplyCompCd" id="supplyCompCd">
 								<option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
 								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
@@ -51,21 +54,40 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th rowspan="3">키워드<em class="required" title="필수"></em></th>
+						<th rowspan="3">키워드</th>
 						<td rowspan="3">
 							<select name="search" id="search">
 								<option value="searchGoodsCd">상품코드</option>
-								<option value="searchGoodsNm">상품명</option>
-								<option value="searchGoodsNum">품번</option>
 							</select>
 							<textarea class="textareaR3 w150" name="condition" id="condition"></textarea>
 						</td>
 					</tr>
+					<tr>
+						<th rowspan="2">년도/시즌</th>
+						<td rowspan="2">
+							<div class="multiCheckBox" style="width:140px;">
+								<button type="button" class="sltBtn">[전체]</button>
+								<ul style="overflow:auto; height:140px">
+									<li><label class="chkBox"><input type="checkbox" name="전체선택" id="multiStyleYear" onclick="uifnAllCheck('multiStyleYear')">전체선택</label></li>
+									<li th:if="${styleYearList}" th:each="oneData, status : ${styleYearList}"><label class="chkBox"><input type="checkbox" name="multiStyleYear" th:id="${'styleYear' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
+								</ul>
+							</div>
+							<div class="multiCheckBox" style="width:170px;">
+								<button type="button" class="sltBtn">[전체]</button>
+								<ul style="overflow:auto; height:170px">
+									<li><label class="chkBox"><input type="checkbox" name="전체선택" id="multiSeasonCd" onclick="uifnAllCheck('multiSeasonCd')">전체선택</label></li>
+									<li th:if="${seasonList}" th:each="oneData, status : ${seasonList}"><label class="chkBox"><input type="checkbox" name="multiSeasonCd" th:id="${'seasonCd' + oneData.cd}" th:value="${oneData.cd}" ><th:block th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></th:block></label></li>
+								</ul>
+							</div>		
+						</td>
+					</tr>
 				</table>
 				<ul class="panelBar">
 					<li class="center">
 						<button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
 						<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+						&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+						<button type="button" class="btn btn-primary btn-lg" id="btnNaverPriceSearch" >네이버 최저가 조회</button>
 					</li>
 				</ul>
 			</div>
@@ -79,25 +101,10 @@
 				<li>
 					<button type="button" class="btn btn-default btn-lg" onclick="fnGoodsExcelDownLoad('');">엑셀다운로드</button>
 				</li>
-				<li class="aR">
-					검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
-					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
-					<select id="pageSize" name="pageSize">
-						<option value="50" selected="selected">50개씩 보기</option>
-						<option value="100">100개씩 보기</option>
-						<option value="500">500개씩 보기</option>
-						<option value="1000">1000개씩 보기</option>
-					</select>
-					<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
-				</li>
 			</ul>
 			<!-- //상단버튼 영역  -->
-			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham lh60"></div>
-			<ul class="panelBar">
-				<li class="center">
-					<div class="tablePaging" id="goodsListPagination"></div>
-				</li>
-			</ul>
+			<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
+			
 			<label class="off">
 				<a href="javascript:void(0);" id="GoodsExcelList" style="display: none;">상품목록 엑셀다운로드</a>
 			</label>
@@ -107,13 +114,12 @@
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
 <script th:inline="javascript">
 /*<![CDATA[*/
-
+	
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
 	var columnDefs = [];
 	columnDefs = [
 		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: 'No', width: 50, cellClass: 'text-center',
-			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
-		},
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "브랜드", field: "brandCd", width: 80, cellClass: 'text-center'},
 		{headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
 		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
@@ -132,23 +138,50 @@
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "자사즉시할인가", field: "currPrice" , width: 120, cellClass: 'text-right'
+		{headerName: "자사즉시할인가", field: "benefitPrice" , width: 120, cellClass: 'text-right'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'integer'}
 		},
-		{headerName: "네이버최저가", field: "currPrice" , width: 120, cellClass: 'text-right'
+		{headerName: "네이버최저가", field: "lowestPrice" , width: 120, cellClass: 'text-right'
 			,valueFormatter: function(params) {return params.value.addComma();},
 			cellEditor: 'textCellEditor',
 			cellEditorParams: { maxlength: 14, validType: 'numeric'}
 		},
-		{headerName: "차액", field: "currPrice" , width: 100, cellClass: 'text-right'
-			,valueFormatter: function(params) {return params.value.addComma();},
-			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		{headerName: "차액", field: "currPrice" , width: 100, cellClass: 'text-right',
+			valueFormatter: function(params) {
+				var priceVal =  params.data.benefitPrice - params.data.lowestPrice;
+				return priceVal.addComma();
+			},
+			cellStyle : function(params){
+				var color = "";
+				var priceVal =  params.data.benefitPrice - params.data.lowestPrice;
+				if (priceVal > 0){
+					//color = '#ff96689c';
+					color = "red";
+					//background-color
+				}
+				return { 'color': color};
+			}
+		},
+		{headerName: "최저가몰명", field: "mallNm", width: 140, cellClass: 'text-center'},
+		{headerName: "최저가몰링크", field: "mallLink", width: 200, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
 		},
-		{headerName: "최저가몰명", field: "goodsCd", width: 140, cellClass: 'text-center'},
-		{headerName: "최저가몰링크", field: "goodsCd", width: 200, cellClass: 'text-center'}
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
 	];
 
 	// Get GridOptions
@@ -157,7 +190,6 @@
 	// 중복 선택 가능
 	gridOptions.rowSelection = 'multiple';
 	gridOptions.suppressRowClickSelection = true;
-	gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
 
 	gridOptions.stopEditingWhenGridLosesFocus = true;
 
@@ -167,152 +199,93 @@
 		if (event.colDef.field == "goodsCd"){
 			cfnOpenGoodsDetailPopup('U',goodsCd);
 			//cfnOpenFrontGoodsPopup(goodsCd, event.data.siteCd);
+		}else if (event.colDef.field == "mallLink"){
+			window.open(event.data.mallLink, "_blank, scrollbars=yes");
+			
 		}
 	}
 
-	var fnChangeSelect = function(val, selLvl){
-		$("#cateCd").val('');
-		$('#tcateCd').val('');
-		$('#mcateCd').val('');
-		$('#scateCd').val('');
-		$('#dcateCd').val('');
-		if(val==''){
-			if(selLvl>1){
-				selLvl = selLvl - 1;
-				if(selLvl>2){
-					$("#cateCd").val($("#selCate"+(selLvl-1)).val());
-				}
-			}else{
-				selLvl = '';
-			}
-		}else{
-			if(selLvl>2){
-				$("#cateCd").val(val);
-			}
-		}
-		$("#searchForm input[name=selLvl]").val(selLvl);
-		$("#searchForm input[name=searchGb]").val("BASIC");
-		gagajf.ajaxFormSubmit('/display/category/list', "#searchForm", fnChangeCategory);
-	}
+	// 초기화 클릭시
+	$('#btnInit').on('click', function() {
 
-	var fnChangeCategory = function(data){
-		var selLvl = $("#searchForm input[name=selLvl]").val();
-		var html = '<option value="">[선택]</option>';
-		for(var i=1; i<6; i++){
-			if(i>selLvl){
-				$("#selCate"+i).html(html);
-			}
-		}
-		for(var i=0; i<data.length; i++){
-			var cd = '';
-			var nm = '';
-			if(data[i].useYn=='Y'){
-				if(selLvl=='1'){
-					cd = data[i].cateGb;
-					nm = gagaAgGrid.lookupValue(cateGbList, cd);
-				}else{
-					cd = data[i].cateCd;
-					nm = data[i].cateNm;
-					$("#cateType").val(data[i].cateType);
-				}
-				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
-			}
-		}
-		$("#selCate"+selLvl).html(html);
-	}
+		$('#searchForm')[0].reset();
+		//$("#searchForm input[type=radio]").removeClass("checked");
+		$("#searchForm input[type=checkbox]").removeClass("checked");
+		//$("#searchForm input[type=radio]").parent("label").removeClass("checked");
+		$("#searchForm input[type=checkbox]").parent("label").removeClass("checked");
+		$("#searchForm input[type=radio][checked]").parent("label").addClass("checked");
 
-	// 조회
-	$('#btnSearch').on('click', function() {
-		if($("#selCate2").val()=='' && $("#condition").val()=='' && $("#brandGrpNm").val()=='' && $("#itemkindCdSearch").val()==''
-			&& $("#styleYear").val()=='' && $("#formalGb").val()=='' && $("#mdId").val()==''){
-			mcxDialog.alert('검색조건을 입력해 주세요.');
-			return;
-		}
-		$("#searchForm input[name=searchGb]").val("BASIC");
-		fnSearch();
 	});
 
-	$("#pageSize").on("change", function(){
-		var rowCnt = gridOptions.api.getDisplayedRowCount();
-		if(rowCnt > 0){
-			fnSearch();
-		}
+	// 조회클릭시
+	$('#btnSearch').on('click', function() {
+		fnGoodsListSearch('BASIC');
 	});
 
-	var fnSearch = function(){
-		gagaPaging.init('searchForm', fnSearchCallBack, 'goodsListPagination', $('#searchForm').find('#pageSize').val());
-		gagaPaging.load(1);
-	};
+	// 조회
+	var fnGoodsListSearch = function(gbn) {
+		
+		if (typeof(gbn) != 'undefined' &&  gbn == 'EXCEL'){
+			$("#searchForm input[name=searchGb]").val("EXCEL");
+		}else{
+			$("#searchForm input[name=searchGb]").val("BASIC");
+		}
 
-	var fnSearchCallBack = function(result){
+		if(!fnConditionCheck()) return;
+ 		
+ 		var formId = "#searchForm";
+ 		gagaAgGrid.fetch($(formId).prop('action'), gridOptions, formId);
 
-		$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
-		$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
-		$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
-		$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
-		gridOptions.api.setRowData(result.goodsList);
-		gagaPaging.createPagination(result.pageing.pageable);
 	}
 
-	//엑셀 상품 조회
-	$('#btnGoodsExcelUpLoad').on('click', function() {
-		cfnExcelUploadPopup('goodsExcelUpload', 'goodsExcelUpload');
-	});
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var formId = '#searchForm';
+		var form = document.searchForm;
 
-	var goodsExcelUpload = function(result){
-		var data = {procJob : result.procJob
-					,excelFileNm : result.excelFileNm
-					};
-		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsExcelUploadCallBack);
-	}
+		if($("#searchForm input[name=searchGb]").val() == "EXCEL") return true;
 
-	var fnGoodsExcelUploadCallBack = function(result){
-		$("#searchForm input[name=searchGb]").val("EXCEL");
-		fnSearch();
-	}
+		var searchFlag = false;
+		var cnt = 0;
 
-	$("#btnInit").on("click", function(){
-		$("#searchForm")[0].reset();
-	});
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
 
-	$("#btnChangeItemKindCd").on("click", function(){
-		if($("#itemKindCd").val()==''){
-			mcxDialog.alert('품목코드를 입력해 주세요.');
-			return;
-		}
-		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
-		selectedData.forEach(function(data){
-			data.itemkindCdNew = $("#itemKindCd").val();
-		});
-		gridOptions.api.refreshCells();
-	});
-
-	$("#btnSave").on("click", function(){
-		var rowData = gagaAgGrid.getAllRowData(gridOptions);
-		var dataArr = [];
-		rowData.forEach(function(row){
-			if(typeof row.itemkindCdNew!='undefined' && row.itemkindCdNew!=''){
-				var data = {  goodsCd : row.goodsCd
-							, itemkindCd : row.itemkindCdNew
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
 				}
-				dataArr.push(data);
 			}
-		});
-		if(dataArr.length==0){
-			mcxDialog.alert('변경된 데이터가 없습니다.');
+		}
+		
+		var mulYearSize = $('input:checkbox[name="multiStyleYear"]:checked').length;
+		var mulSeasonSize = $('input:checkbox[name="multiSeasonCd"]:checked').length;
+
+		if (mulYearSize > 0 || mulSeasonSize > 0){
+			cnt++;
+		}
+
+		if(cnt > 0) searchFlag = true;
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+
+		return true;
+	}
+
+	//엑셀다운로드
+	var fnGoodsExcelDownLoad = function(flag){
+		var formId = '#searchForm';
+		if (gridOptions.api.getDisplayedRowCount() <= 0){
+			mcxDialog.alert("조회된 데이터가 없습니다.<br/>다시 조회 후 다운로드 받으세요.");
 			return;
 		}
-		mcxDialog.confirm('저장하시겠습니까?',{
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var jsonData = JSON.stringify(dataArr);
-				console.log(jsonData);
-				gagajf.ajaxJsonSubmit('/goods/itemKind/change/save', jsonData, fnSearch);
-			}
-		});
-	});
+
+		var params =  $(formId).serialize();
+		$('#GoodsExcelList').attr({ href : '/goods/info/excel/list?' + params }).get(0).click();
+	}
 	
 	// 업체변경시
 	$('#searchForm select[name=supplyCompCd]').on('change', function() {
@@ -324,6 +297,19 @@
 
 		cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]", "");
 	});
+	
+	// 네이버 최저가 조회 클릭시
+	$('#btnNaverPriceSearch').on('click', function() {
+		if (gagajf.isNull($("#searchForm textarea[name=condition]").val())) {
+			mcxDialog.alert("상품코드 입력 후 네이버최저가 조회를 해주세요.");
+			return;
+		}
+		
+		var formId = "#searchForm";
+ 		gagaAgGrid.fetch('/goods/naver/lowest/price/save', gridOptions, formId);
+		
+	});
+
 
 	$(document).ready(function() {