Ver Fonte

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.admin into develop

jsshin há 4 anos atrás
pai
commit
eaca0911c6

+ 18 - 0
src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java

@@ -379,4 +379,22 @@ public interface TsaDisplayDao {
 	 * @since 2021. 6. 9
 	 */
 	Collection<Goods> getContentsForGoodsList(Contents contents);
+
+	/**
+	 * 검색키워드 등록
+	 *
+	 * @param searchKeyword
+	 * @author bin2107
+	 * @since 2021. 7. 1
+	 */
+	void createSearchKeyword(SearchKeyword searchKeyword);
+
+	/**
+	 * 검색키워드 수정
+	 *
+	 * @param searchKeyword
+	 * @author bin2107
+	 * @since 2021. 7. 1
+	 */
+	void updateSearchKeyword(SearchKeyword searchKeyword);
 }

+ 29 - 8
src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -4,6 +4,15 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
 
+import com.style24.persistence.domain.Category;
+import com.style24.persistence.domain.CategoryGoods;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCategory;
+import com.style24.persistence.domain.ItemkindCategory;
+import com.style24.persistence.domain.MainDisplay;
+import com.style24.persistence.domain.SearchKeyword;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.core.env.Environment;
@@ -13,14 +22,6 @@ import org.springframework.util.StringUtils;
 
 import com.style24.admin.biz.dao.TsaDisplayDao;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.Category;
-import com.style24.persistence.domain.CategoryGoods;
-import com.style24.persistence.domain.Contents;
-import com.style24.persistence.domain.GnbTab;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsCategory;
-import com.style24.persistence.domain.ItemkindCategory;
-import com.style24.persistence.domain.MainDisplay;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -757,4 +758,24 @@ public class TsaDisplayService {
 	public Category getCategory4srch(Category category){
 		return displayDao.getCategory4srch(category);
 	}
+
+	/**
+	 * 검색 키워드 저장
+	 * @param searchKeyword
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 1
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSearchKeyword(SearchKeyword searchKeyword) {
+		searchKeyword.setRegNo(TsaSession.getInfo().getUserNo());
+		searchKeyword.setUpdNo(TsaSession.getInfo().getUserNo());
+
+//		if(searchKeyword.getKeywordSq() == null || searchKeyword.getKeywordSq() == 0){
+//			displayDao.createSearchKeyword(searchKeyword);
+//		}else{
+//			displayDao.updateSearchKeyword(searchKeyword);
+//		}
+		displayDao.createSearchKeyword(searchKeyword);
+	}
 }

+ 42 - 11
src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -3,6 +3,18 @@ package com.style24.admin.biz.web;
 import java.util.Collection;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.Category;
+import com.style24.persistence.domain.CategoryGoods;
+import com.style24.persistence.domain.Contents;
+import com.style24.persistence.domain.GnbTab;
+import com.style24.persistence.domain.GoodsCategory;
+import com.style24.persistence.domain.ItemkindCategory;
+import com.style24.persistence.domain.Lookbook;
+import com.style24.persistence.domain.LookbookGoods;
+import com.style24.persistence.domain.MainDisplay;
+import com.style24.persistence.domain.Popup;
+import com.style24.persistence.domain.SearchKeyword;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -24,17 +36,6 @@ import com.style24.core.biz.service.TscLookbookService;
 import com.style24.core.biz.service.TscPopupService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.Category;
-import com.style24.persistence.domain.CategoryGoods;
-import com.style24.persistence.domain.Contents;
-import com.style24.persistence.domain.GnbTab;
-import com.style24.persistence.domain.GoodsCategory;
-import com.style24.persistence.domain.ItemkindCategory;
-import com.style24.persistence.domain.Lookbook;
-import com.style24.persistence.domain.LookbookGoods;
-import com.style24.persistence.domain.MainDisplay;
-import com.style24.persistence.domain.Popup;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -993,4 +994,34 @@ public class TsaDisplayController extends TsaBaseController {
 		return mav;
 	}
 
+	/**
+	 * 검색키워드 관리 화면
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 7. 1
+	 */
+	@GetMapping("/keyword/form")
+	public ModelAndView searchKeywordForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("display/SearchKeywordForm");
+
+		return mav;
+	}
+
+	/**
+	 * 검색 키워드 저장/등록
+	 *
+	 * @param adKeyword
+	 * @return
+	 * @author eskim
+	 * @since 2020. 12. 15
+	 */
+	@PostMapping("/search/keyword/save")
+	@ResponseBody
+	public GagaResponse saveSearchKeyword(@RequestBody SearchKeyword searchKeyword) {
+		displayService.saveSearchKeyword(searchKeyword);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 }

+ 1 - 0
src/main/java/com/style24/persistence/domain/ReinboundInform.java

@@ -26,6 +26,7 @@ public class ReinboundInform extends TscBaseDomain {
 	private String optCd2;
 	private String reqDt;
 	private String informDt;
+	private int pastDays;
 
 	private String custId;
 	private String brandEnm;

+ 24 - 0
src/main/java/com/style24/persistence/domain/SearchKeyword.java

@@ -0,0 +1,24 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+import java.util.Collection;
+
+/**
+ * 검색 키워드 Domain
+ *
+ * @author bin2107
+ * @since 2021. 07. 01
+ */
+@SuppressWarnings("serial")
+@Data
+public class SearchKeyword extends TscBaseDomain {
+
+	private Integer keywordSq;
+	private String keyword;
+	private String linkUrl;
+	private String dispStdt;
+	private String dispEddt;
+
+}

+ 34 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -2081,4 +2081,38 @@
 		AND CG.CONTENTS_SQ = #{dispOrd}
 		ORDER BY CG.BRAND_GROUP_NO , CG.CATE_NO ,CG.LEAF_CATE_NO ,CG.CONTENTS_LOC ,CG.PRE_CONTENTS_SQ , CG.CONTENTS_SQ , CG.DISP_ORD
 	</select>
+
+	<!-- 검색키워드  등록 -->
+	<insert id="createSearchKeyword" parameterType="SearchKeyword" keyProperty="keywordSq">
+		/* TsaDisplay.createSearchKeyword */
+		INSERT INTO TB_SEARCH_KEYWORD
+		(
+		  KEYWORD_SQ
+		  ,KEYWORD
+		  ,LINK_URL
+		  ,DISP_STDT
+		  ,DISP_EDDT
+		  ,REG_NO
+		  ,REG_DT
+		  ,UPD_NO
+		  ,UPD_DT
+		) VALUES (
+		  #{keywordSq}
+		  , #{keyword}
+		  , #{linkUrl}
+		  , #{dispStdt}
+		  , #{dispEddt}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		    KEYWORD = #{keyword}
+		  , LINK_URL = #{linkUrl}
+		  , DISP_STDT = #{dispStdt}
+		  , DISP_EDDT = #{dispEddt}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+	</insert>
 </mapper>

+ 24 - 27
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -2017,7 +2017,8 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		    SELECT A.*
+		    FROM (
 		        SELECT
 		                G.GOODS_CD
 		              , B.BRAND_ENM
@@ -2037,7 +2038,6 @@
 		              , FN_GET_USER_NM(GR.REG_NO) AS REG_NM
 		              , DATE_FORMAT(GR.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
 		        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_TNM_RES GR ON G.GOODS_CD = GR.GOODS_CD
@@ -2087,7 +2087,7 @@
 		        <if test="searchGb != null and searchGb =='EXCEL'">
 		        ORDER BY SD.TMP_DISP_ORD
 		        </if>
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 
 	<!-- 상품 타이틀 예약조회(기간 체크용) -->
@@ -2245,7 +2245,7 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		      SELECT A.*, @rownum := @rownum + 1 AS RNUM
+		      SELECT A.*
 		      FROM (
 		            SELECT
 		                   G.GOODS_CD
@@ -2265,7 +2265,6 @@
 		                   , FN_GET_USER_NM(GR.UPD_NO) AS UPD_NM
 		                   , DATE_FORMAT(GR.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		            FROM TB_GOODS G
-		            JOIN ( SELECT @rownum := 0) R
 		            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_RES_SELL GR ON G.GOODS_CD = GR.GOODS_CD
@@ -2312,7 +2311,7 @@
 		            <if test="searchGb != null and searchGb =='EXCEL'">
 		            ORDER BY SD.TMP_DISP_ORD
 		            </if>
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 
 	<!-- 상품예약판매 조회(기간 체크용) -->
@@ -2421,7 +2420,8 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		    SELECT A.*
+		    FROM (
 		        SELECT
 		                G.GOODS_CD
 		              , B.BRAND_ENM
@@ -2440,7 +2440,6 @@
 		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
 		              , DATE_FORMAT(GE.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
 		        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_EP_SKIP GE ON G.GOODS_CD = GE.GOODS_CD
@@ -2487,7 +2486,7 @@
 		         <if test="searchGb != null and searchGb =='EXCEL'">
 		        ORDER BY SD.TMP_DISP_ORD
 		        </if>
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 
 	<!-- 네이버 EP 제외 상품 조회(기간 체크용) -->
@@ -2499,7 +2498,7 @@
 		<![CDATA[
 		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d')
 		]]>
-		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%')
+		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt}, '%Y%m%d')
 		AND GOODS_CD = #{goodsCd}
 	</select>
 
@@ -2726,7 +2725,8 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		    SELECT A.* 
+		    FROM (
 		        SELECT
 		                G.GOODS_CD
 		              , G.CURR_PRICE
@@ -2757,7 +2757,6 @@
 		              , FN_GET_USER_NM(GR.UPD_NO) AS UPD_NM
 		              , DATE_FORMAT(GR.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
 		        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_PRICE_RES GR ON G.GOODS_CD = GR.GOODS_CD
@@ -2813,7 +2812,7 @@
 		        <if test="searchGb != null and (searchGb =='EXCEL' or searchGb =='EXCELRESULT')">
 		        ORDER BY SD.TMP_DISP_ORD, GR.APPLY_STDT DESC, GR.APPLY_EDDT DESC, G.GOODS_CD, GR.GOODS_PRICE_RES_SQ
 		        </if>
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 
 	<!-- 상품 가격예약 조회(기간 체크용) -->
@@ -2825,7 +2824,7 @@
 		<![CDATA[
 		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d%H%i%S')
 		]]>
-		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%H%i%S')
+		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt}, '%Y%m%d%H%i%S')
 	</select>
 
 	<!-- 상품 가격예약 등록 -->
@@ -3542,7 +3541,7 @@
 		              AND DATE_FORMAT(IA.REQ_DT, '%Y%m%d')  >= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -15 DAY), '%Y%m%d') 
 		              </if>
 		<include refid="getGoodsListCondition_sql"/>
-		ORDER BY IA.REG_DT DESC
+		ORDER BY IA.RINBD_INFO_SQ
 	</select>
 
 	<!-- 재입고알림 목록 -->
@@ -3552,7 +3551,7 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		       SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		       SELECT A.*
 		       FROM (
 		              SELECT IA.RINBD_INFO_SQ
 		                   , IA.GOODS_CD
@@ -3565,6 +3564,7 @@
 		                   , DATE_FORMAT(IA.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		                   , FN_GET_USER_NM(IA.UPD_NO)             AS UPD_NM
 		                   , DATE_FORMAT(IA.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		                   , DATEDIFF(CURRENT_DATE(),IA.REQ_DT)    AS PAST_DAYS
 		                   , IA.CUST_NO
 		                   , C.CUST_ID
 		                   , C.CUST_NM
@@ -3578,7 +3578,6 @@
 		                   , VS.CURR_STOCK_QTY
 		                   , VS.SOLDOUT_YN
 		              FROM TB_REINBOUND_INFORM IA
-		              JOIN ( SELECT @rownum := 0) R
 		              INNER JOIN TB_GOODS G ON IA.GOODS_CD = G.GOODS_CD
 		                                    AND G.GOODS_STAT IN ('G008_70', 'G008_90', 'G008_96')
 		              INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
@@ -3628,12 +3627,12 @@
 		                  </if>
 		              </if>
 		              <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		              AND DATE_FORMAT(IA.REQ_DT, '%Y%m%d')  >= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -15 DAY), '%Y%m%d') 
+		              AND DATEDIFF(CURRENT_DATE(),IA.REQ_DT) <![CDATA[<=]]> 15
 		              </if>
 		              <include refid="getGoodsListCondition_sql"/>
-		              ORDER BY IA.REG_DT DESC
-		<include refid="getListPagingCondition_sql"/>
-	</select>
+		              ORDER BY IA.REQ_DT DESC
+		<include refid="getListLimitPagingCondition_sql"/>
+	</select> 
 	
 	<!-- 재입고 알림톡 발송처리 -->
 	<update id="updateReinboundInform" parameterType="ReinboundInform">
@@ -3812,7 +3811,7 @@
 		/* TsaGoods.getGoodsWmsIncomelotList */
 		SELECT Q.* FROM (
 		SELECT Z.* FROM (
-		SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		SELECT A.*
 		    FROM (
 		SELECT A.PRODUCT_NO
 		     , A.PRODUCT_CODE
@@ -3833,7 +3832,6 @@
 		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
 		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
 		FROM TB_WMS_GOODS A
-		JOIN ( SELECT @rownum := 0) R
 		INNER JOIN TB_BRAND B ON A.BRAND_NO = B.BRAND_NO 
 		                           AND B.SELF_YN  = 'Y'
 		                           AND B.USE_YN  = 'Y'
@@ -3857,7 +3855,7 @@
 		AND B.BRAND_CD = #{brandCd}
 		</if>
 		ORDER BY A.UPD_DT DESC
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 	
 	<!-- 사은품 등록 -->
@@ -4578,7 +4576,7 @@
 		FROM (
 		SELECT Z.*
 		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM 
+		    SELECT A.*
 		    FROM (
 		SELECT G.GOODS_CD
 		     , G.GOODS_NM
@@ -4598,7 +4596,6 @@
 		         </otherwise>
 		     </choose>
 		FROM TB_GOODS_SHOT_DELV_SKIP A
-		JOIN ( SELECT @rownum := 0) R
 		INNER JOIN TB_GOODS G ON A.GOODS_CD = G.GOODS_CD
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO  = D.BRAND_GROUP_NO
@@ -4628,7 +4625,7 @@
 		            </if>
 		        <include refid="getGoodsListCondition_sql"/>
 		</if>
-		<include refid="getListPagingCondition_sql"/>
+		<include refid="getListLimitPagingCondition_sql"/>
 	</select>
 	
 	<!-- 총알배송 제외 상품 저장 -->

+ 300 - 0
src/main/webapp/WEB-INF/views/display/SearchKeywordForm.html

@@ -0,0 +1,300 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SearchKeywordForm.html
+ * @desc    : 검색키워드관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.07.01   bin2107     최초 작성
+  *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<!-- TITLE -->
+			<div class="panelTitle">
+<!--				<h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>-->
+			</div>
+			<!-- //TITLE -->
+			<div class="panelContent">
+			
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/display/search/keyword/list'}">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>등록일</th>
+						<td colspan="3" id="sellTerms">
+						</td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-default btn-lg" id="btnInit">초기화</button>
+						<button type="button" class="btn btn-success btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</form>
+			</div>
+		</div>
+		<!-- //검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 450px;" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" >
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<td colspan='6'>키워드등록(상세)</td>
+					</tr>
+					<tr>
+						<th>키워드번호</th>
+						<td>
+							<input type="text" class="w100" name="keywordSq" maxlength="20" placeholder="자동부여" readonly="readonly"/>
+						</td>
+						<th>키워드<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" class="w150" name="keyword" maxlength="20" required="required" data-valid-name="키워드"/>
+						</td>
+						<th>링크URL<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" class="w150" name="linkUrl" maxlength="20" required="required" data-valid-name="링크URL"/>
+						</td>
+					</tr>
+					<tr>
+						<th>기간<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<input type="text" class="schDate w100" name="dispStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+							~
+							<input type="text" class="schDate w100" name="dispEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+						</td>
+					</tr>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+						<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+	</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.kollus.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var videoGbList = {'Y':'유투브', 'M':'MP4'};
+	// specify the columns
+	var columnDefs = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "키워드번호", field: "keywordSq", width: 150, cellClass: 'text-center'},
+		{headerName: "키워드", field: "keyword", width: 300, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "링크URL", field: "linkUrl", width: 300, cellClass: 'text-center'},
+		{headerName: "시작일", field: "dispStdt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "종료일", field: "dispEddt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "등록자", field: "regNm", width:90, cellClass: 'text-center'},
+		{headerName: "등록일자", field: "regDt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "수정자", field: "updNm", width:90, cellClass: 'text-center'},
+		{headerName: "수정일자", field: "updDt", width:150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		}
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+	
+	// 상품코드 셀 클릭
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == "keyword"){
+			var formId = '#detailForm';
+			$(formId + " input[name=keywordSq]").val(event.data.keywordSq);
+			$(formId + " input[name=keyword]").val(event.data.keyword);
+			$(formId + " input[name=linkUrl]").val(event.data.linkUrl);
+			$(formId + " input[name=dispStdt]").val(event.data.dispStdt);
+			$(formId + " input[name=dispEddt]").val(event.data.dispEddt);
+		}
+	}
+	
+	// 신규 버튼 클릭
+	$("#btnNew").on('click', function() {
+		$("#detailForm")[0].reset();
+		$("#detailForm input[name=videoSq]").val('');
+		$("#detailForm input[name=goodsCd]").prop("disabled", false);
+		$("#detailForm select[name=videoGb]").prop("disabled", false);
+		$('#youtubeArea').show();
+		$('#fileArea').hide();
+	});
+	
+	// 조회
+	$('#btnSearch').on('click', function() {
+		$("#goodsCd").val('');
+		$("#goodsNm").val('');
+		$("#goodsNum").val('');
+		$("#supplyGoodsCd").val('');
+		$("#"+$("#searchForm select[name=keyWord]").val()).val($("#searchForm input[name=searchTxt]").val());
+		
+		if(!fnConditionCheck()) return;
+		
+		
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+		$("#btnNew").click();
+	});
+	
+	//검색 조건 확인
+	var fnConditionCheck = function(){
+		var form = document.searchForm;
+
+		var searchFlag = false;
+		var cnt = 0;
+
+		for (i = 0; i < form.elements.length; i++ ) {
+			var el = form.elements[i];
+
+			if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize" && el.name != "keyWord")) {
+				if (!(el.value == null || el.value == "")) {
+					cnt++;
+				}
+			}
+		}
+		if(cnt > 0) searchFlag = true;
+
+		
+		if(searchFlag == false){
+			mcxDialog.alert("검색조건을 입력하세요.");
+			return false;
+		}
+		
+		// 기간 값 체크
+		if (!fnCalendarDateValidation('#sellTerms', 'stDate', 'edDate')){
+			return false;
+		}
+
+		return true;
+	}
+	
+	// 검색조건 초기화
+	$('#btnInit').on('click', function() {
+		$("#searchForm")[0].reset();
+	});
+	
+	// 동영상 저장
+	$("#btnSave").on('click', function() {
+		
+		var formId = '#detailForm';
+		var keywordSq = $(formId + " input[name=keywordSq]").val();
+		var keyword = $(formId + " input[name=keyword]").val();
+		var linkUrl = $(formId + " input[name=linkUrl]").val();
+
+		// 날짜 체크
+		if (gagajf.isNull($('#detailForm input[name=dispStdt]').val())) {
+			mcxDialog.alertC('시작일자를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#detailForm input[name=dispStdt]').focus();
+				}
+			});
+			return;
+		}
+
+		if (gagajf.isNull($('#detailForm input[name=dispEddt]').val())) {
+			mcxDialog.alertC('종료일자를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#detailForm input[name=dispEddt]').focus();
+				}
+			});
+			return;
+		}
+		var stDate = $('#detailForm input[name=dispStdt]').val();
+		var edDate = $('#detailForm input[name=dispEddt]').val();
+
+		if (stDate > edDate) {
+			mcxDialog.alert("기간 종료일자는 시작일자 보다 클 수 없습니다.");
+			return;
+		}
+
+		// validation
+		if (!gagajf.validation('#detailForm'))
+			return false;
+		
+		mcxDialog.confirm('저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = { keywordSq : keywordSq
+							,keyword : keyword
+							,linkUrl : linkUrl
+							,dispStdt : stDate
+							,dispEddt : edDate
+							};
+				var jsonData = JSON.stringify(data);
+				console.log(data);
+				console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/display/search/keyword/save', jsonData, fnSaveCallback);
+			}
+		})
+	});
+	
+	var fnSaveCallback = function() {
+		$('#btnSearch').click();
+	}
+	
+	// 동영상파일 선택 시
+	$('#detailForm input[name=file]').on('change', function() {
+		var file = this.files[0];
+		gagaKollus.upload('Goods', file, $('input[name=kufKey]'));
+	});
+	
+	$(document).ready(function() {
+		
+		cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '등록일', true);
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		
+		//$('#btnSearch').click();
+	});
+/*]]>*/
+</script>
+
+</html>

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

@@ -24,7 +24,6 @@
 		</div>
 		<form id="goodsEpSkipListForm" name="goodsEpSkipListForm" action="#" th:action="@{'/goods/ep/skip/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
-		<input type="hidden" id="arrGoodsCd" name="arrGoodsCd" />
  		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
 			<!-- TITLE -->

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

@@ -251,7 +251,7 @@
 	
 	//창종료
 	var fnGoodsRsvtEpSkipListFormClose = function(){
-		uifnPopClose('popupGoodsEpSkip');
+		uifnPopupClose('popupGoodsEpSkip');
 		fnGoodsEpSkipResDeleteCallBack();
 	}
 

+ 5 - 12
src/main/webapp/WEB-INF/views/goods/GoodsReinboundInformForm.html

@@ -116,7 +116,7 @@
 			<!-- 상단버튼 영역  -->
 			<ul class="panelBar">
 				<li class="right">
-					<button type="button" class="btn btn-primary btn-lg" id="reinboundInformSend">재입고알림 발송</button>
+					<!-- <button type="button" class="btn btn-primary btn-lg" id="reinboundInformSend">재입고알림 발송</button> -->
 					검색결과 : <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">
@@ -145,20 +145,11 @@
 <script th:inline="javascript">
 /*<![CDATA[*/
 
-	//var toDateStr = new Date().format("YYYYMMDD");
-	var date = new Date();
-	var beforeDay = date.before(0, 0, 15).format("YYYYMMDD");
-		
 	var sessRoleCd = [[${sessionInfo.roleCd}]];
 	var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
 	var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
 
 	var columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, filter: false
-			, checkboxSelection: function (params) {
-				return (beforeDay > params.data.reqDt ) ? false : true;
-			}
-		},
 		{headerName: 'No', width: 60, cellClass: 'text-center',
 			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
 		},
@@ -205,7 +196,9 @@
 				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
 			}
 		},
-		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "경과일수", field: "pastDays" , width: 100, cellClass: 'text-center', hide: true}
+		
 		
 	];
 	
@@ -411,7 +404,7 @@
 				return false;
 			}
 			
-			if (beforeDay > item.reqDt){
+			if (item.pastDays > 15){
 				chkFlag = true;
 				mcxDialog.alert("요청일이 15일경과한 재입고알림은 발송할 수 없습니다.");
 				return false;

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

@@ -24,8 +24,7 @@
 		</div>
 		<form id="goodsTnmListForm" name="goodsTnmListForm" action="#" th:action="@{'/goods/title/reserve/list'}">
 		<input type="hidden" id="searchGb" name="searchGb" />
-		<input type="hidden" id="arrGoodsCd" name="arrGoodsCd" />
- 		<!-- 패널 영역1 -->
+		 		<!-- 패널 영역1 -->
 		<div class="panelStyle" >
 			<!-- TITLE -->
 			<div class="panelTitle">

+ 1 - 1
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -748,7 +748,7 @@
 
 		var jsonData = JSON.stringify(data);
 
-		// gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
+		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, fnMorebetterSaveCollback);
 	});
 
 	var fnMorebetterSaveCollback = function(result){

+ 288 - 287
src/main/webapp/WEB-INF/views/marketing/ShotDeliveryForm.html

@@ -1,288 +1,289 @@
-<!DOCTYPE html>
-<html lang="ko" xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : ShotDeliveryForm.html
- * @desc    : 총알배송 Page
- *============================================================================
- * SISUN
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2021.06.29   sowon        최초 작성
- *******************************************************************************
- -->
- 
- <div id="main">
-	<div class="main-title"></div>
-	<div class="panelStyle" style="height: 750px;">
-		<div class="panelContent">
-			<form id="shotBrandListForm" name="shotBrandListForm" action="#" th:action="@{'/marketing/shot/delivery/brand/list'}" th:method="post">
-				<div class="panelContent">
-					<ul class="panelBar">
-						<!-- <li class="boxContentBtnT" style="margin-left: -20px; margin-right: -23px;">
-							<span class="btnLeft">
-								<button type="button" class="btn btn-warning btn-sm"  id="btnAddRow">행추가</button>
-								<button type="button" class="btn btn-danger btn-sm" id="btnDeleteRow">행삭제</button>
-							</span> 
-						</li> -->
-						<li class="right">
-							<span class="btnRight"> 
-								<button type="button" class="btn btn-success btn-lg" onclick="fnShotBrandSave();">저장</button>
-						   </span>
-					   </li>
-					</ul>
-					<div id="gridListBrand" style="width: 100%; max-height: 230px; height: 230px;" class="ag-theme-balham"></div>
-				</div>
-			</form>
-		</div>
-
-		<div class="panelContent">
-			<div>
-				<h4>
-					브랜드명 : <label id="brandNm"></label>
-				</h4>
-				<div class="aR" style="float: right; margin-top: 10px;">
-					<!-- <button type="button" class="btn btn-Right btn-default btn-lg"onclick="fnGoodsExcelUpload();">엑셀상품추가</button>
-					<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF012');">엑셀상품추가 양식 다운로드</button> -->
-					<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
-					<button type="button" class="btn btn-danger btn-lg"	onclick="fnDeleteGoods();">선택삭제</button>
-				</div>
-			</div>
-
-			<div id="gridListGoods"	style="width: 100%; max-height: 350px; height: 350px;" class="ag-theme-balham lh60"></div>
-			<ul class="panelBar">
-				<li class="center">
-					<div class="tablePaging" id="brandGoodsPagination"></div>
-				</li>
-			</ul>
-		</div>
-	</div>
-</div>
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
-<script th:inline="javascript">
-	var cornerDispTypeList = gagajf.convertToArray([[${cornerDispTypeList}]]);
-	var goodsStatList =gagajf.convertToArray([[${goodsStatList}]]);
-	// 브랜드 그룹번호 전역변수
-	var _brandGroupNo = '';
-	
-	var columnDefsBrand = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "브랜드번호"		, field:'brandGroupNo'			, width:150, cellClass: 'text-center', editable: false },
-		{headerName: "브랜드그룹명"			, field:'brandNm'			, width:400, cellClass: 'text-center',
-			cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; },
-			cellEditorParams: { maxlength: 50, required: true }
-		},
-		{headerName: "코너유형"		, field:'cornerDispType'		, width:180, cellClass: 'text-center',
-			cellEditor: 'agRichSelectCellEditor',
-			cellEditorParams: { values: gagaAgGrid.extractValues(cornerDispTypeList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cornerDispTypeList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(cornerDispTypeList, params.newValue); }
-		},
-		{headerName: "전시순서"		, field:'dispOrd'				, width:100, cellClass: 'text-right',
-			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 3, required: true }
-		},
-		{headerName: "등록일"			, field:'regDt'				, width:200, cellClass: 'text-center', editable: false }
-	];
-	
-	var columnDefsGoods = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "상품코드"	, field:'goodsCd'		, width:150, cellClass: 'text-left'
-			, cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; }
-		},
-		{headerName: "상품명"		, field:'goodsNm'		, width:300, cellClass: 'text-left'},
-		{headerName: "이미지"		, field:'sysImgNm'		, width:100 , height:60, cellClass: 'text-right'
-			,cellRenderer: function(params) {
-				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '?RS=60" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ _goodsUrl+ "/" + params.value +'\')" onerror="this.src=\'/image/no.png\';"/>';
-			}
-		},
-		{headerName: "재고"		, field:'stockQtySum'			, width:80 , cellClass: 'text-center'
-			, cellRenderer: function(params) {return !gagajf.isNull(params.value) ? params.value : '0'; }
-		},
-		{headerName: "할인율(%)"		, field:'dcRate'		, width:80 , cellClass: 'text-center'},
-		{headerName: "정상가"		, field:'listPrice'		, width:100, cellClass: 'text-right' , hide : true
-			, valueFormatter: function(params) { return params.value.addComma(); }
-		},
-		{headerName: "판매가"		, field:'currPrice'		, width:100, cellClass: 'text-right'
-			, valueFormatter: function(params) { return params.value.addComma(); }
-		},
-		{headerName: "정상/이월여부", field:'formalGb'		, width:120, cellClass: 'text-center'},
-		{headerName: "상품상태"	, field:'goodsStat'		, width:100, cellClass: 'text-center'
-			, valueFormatter: function(params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); }
-		},
-		{headerName: "업체"		, field:'supplyCompNm'	, width:150, cellClass: 'text-left'},
-		{headerName: "기획전상세"	, field:'planDtlSq'		, width:200, cellClass: 'text-left', hide: true},
-		{headerName: "등록일"		, field:'regDt'			, width:100,  cellClass: 'text-left'
-			, cellRenderer: function(params) { return !gagajf.isNull(params.value) ? params.value.toDate("YYYY-MM-DD HH:MM:SS").format("YYYY-MM-DD") : ''; }
-		},
-	];
-	
-	var gridOptionsBrand = gagaAgGrid.getGridOptions(columnDefsBrand);
-	gridOptionsBrand.suppressRowClickSelection = true;
-	gridOptionsBrand.stopEditingWhenGridLosesFocus = true;
-	gridOptionsBrand.defaultColDef.editable = true;
-	//gridOptionsBrand.rowSelection = 'multiple';
-	
-	var gridOptionsGoods = gagaAgGrid.getGridOptions(columnDefsGoods);
-	gridOptionsGoods.rowSelection = 'multiple';
-	gridOptionsGoods.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
-	gridOptionsGoods.suppressRowClickSelection = true;
-
-	gridOptionsGoods.onCellClicked = function(event) {
-		if (event.colDef.field == 'goodsCd') {
-			// 상품 상세 팝업
-			cfnOpenGoodsDetailPopup('U',event.data.goodsCd);
-		}
-	}
-
-	// 브랜드 셀 클릭 이벤트
-	gridOptionsBrand.onCellClicked = function(event) {
-		var field = event.colDef.field;
-		if (field != 'brandNm') return;
-
-		fnBindSearch(event.data);
-	}
-
-	// 코너 상품 조회 바인딩
-	var fnBindSearch = function(data) {
-		if (!gagajf.isNull(data.brandNm)) {
-
-			$('#brandNm').html(data.brandNm);
-			_brandGroupNo = data.brandGroupNo;
-
-			fnShotGoodsSearch();
-		}
-	}
-	// 상품 추가 버튼 클릭시 
-	var fnOpenGoodsPopup = function() {
-		var allData = gagaAgGrid.getAllRowData(gridOptionsBrand);
-		if (allData.length < 1 ) {
-			mcxDialog.alert('브랜드가 존재 하지 않습니다.');
-			return;
-		}
-
-		if ($("#brandNm").text() == null || $("#brandNm").text()=='') {
-			mcxDialog.alert('브랜드를 선택해주세요.');
-			return;
-		}
-		cfnOpenGoodsPopup('fnCreateGoods');
-	}
-
-	// 브랜드 조회
-	var fnBrandSearch = function() {
-		var formId = '#shotBrandListForm';
-		gagaAgGrid.fetch($(formId).prop('action'), gridOptionsBrand, formId
-						, function() {
-								$('#gridListGoods').html('');
-								$('#brandNm').html('');
-								gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
-				});
-		
-		uifnPopupClose('fnCreateGoods');
-	}
-	
-	// 코너 저장
-	var fnShotBrandSave = function() {
-		var changeData = gagaAgGrid.getChangedData(gridOptionsBrand);
-
-		if (changeData.length < 1) {
-			mcxDialog.alert('변경 된 코너가 없습니다.');
-			return;
-		}
-
-		// Validation
-		if (!gagaAgGrid.validation(gridOptionsBrand, changeData))
-			return;
-
-
-		mcxDialog.confirm('저장 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(changeData);
-				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/brand/update', jsonData, fnBrandSearch);
-			}
-		});
-	}
-	
-	// 상품추가
-	var fnCreateGoods = function(result) {
-		if (result.length < 1) return;
-	
-		var oldGoodsList = gagaAgGrid.getAllRowData(gridOptionsGoods);
-		for (var disp = 0; disp < result.length; disp++) {
-			let addChk = true;
-			
-			// 받아온 data for
-			for(let j = 0 ; j < oldGoodsList.length ; j++) {
-				if(oldGoodsList[j].goodsCd == result[disp].goodsCd) {	addChk = false;	}					// 중복체크
-			}
-			
-			if(addChk) {
-				var goods = { brandGroupNo : _brandGroupNo ,
-						      goodsCd : result[disp].goodsCd ,
-						      dispOrd : oldGoodsList.length+1
-						    };
-				oldGoodsList.unshift(goods);
-			}
-		}
-		
-		mcxDialog.confirm('선택하신 상품을 추가 하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(oldGoodsList);
-				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/goods/save', jsonData, fnShotGoodsSearch);
-			}
-		});
-	}
-
-
-	// 브랜드 상품 조회
-	var fnShotGoodsSearch = function() {
-		uifnPopupClose('popupGoods');
-		var actionUrl = '/marketing/shot/delivery/goods/list';
-		var data = {brandGroupNo:_brandGroupNo};
-		var jsonData = JSON.stringify(data);
-
-		gagajf.ajaxJsonSubmit(actionUrl, jsonData, function(data) {
-			gridOptionsGoods.api.setRowData(data.brandGoodsList);
-		});
-	}
-	
-	//선택삭제
-	var fnDeleteGoods = function() {
-		var removedData = gagaAgGrid.removeRowData(gridOptionsGoods);
-
-		if (removedData.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
-			return;
-		}
-
-		mcxDialog.confirm('선택된 상품을 삭제하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(removedData);
-
-				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/goods/delete', jsonData, function() {
-					fnShotGoodsSearch();
-				});
-			}
-		});
-	}
-	
-	// 엑셀상품추가
-	//var fnGoodsExcelUpload = function() {
-	//	cfnExcelUploadPopup('createGoods', 'fnCreatePlanGoodsExcel');
-	//}
-
-
-	$(document).ready(function() {
-		gagaAgGrid.createGrid('gridListBrand', gridOptionsBrand);
-		gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
-		fnBrandSearch();
-	});
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ShotDeliveryForm.html
+ * @desc    : 총알배송 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.06.29   sowon        최초 작성
+ *******************************************************************************
+ -->
+ 
+ <div id="main">
+	<!-- 메인타이틀 영역 -->
+	<div class="main-title">
+	</div>
+	<!-- //메인타이틀 영역 -->
+	
+	<!-- 메뉴 설명 -->
+	<div class="infoBox menu-desc">
+	</div>
+	<!-- //메뉴 설명 -->
+	
+	<div class="panelStyle" style="height: 750px;">
+		<div class="panelContent">
+			<ul class="panelBar">
+				<li>
+					<h4>브랜드 목록</h4> 
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-success btn-lg" onclick="fnShotBrandSave();">브랜드 저장</button>
+				</li>
+			</ul>
+			<form id="shotBrandListForm" name="shotBrandListForm" action="#" th:action="@{'/marketing/shot/delivery/brand/list'}" th:method="post">
+				<div class="panelContent">
+					<div id="gridListBrand" style="width: 100%; max-height: 230px; height: 230px;" class="ag-theme-balham"></div>
+				</div>
+			</form>
+		</div>
+
+		<div class="panelContent">
+			<ul class="panelBar">
+				<li>
+					<h4>브랜드명 : <label id="brandNm"></label></h4> 
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
+					<button type="button" class="btn btn-danger btn-lg"	onclick="fnDeleteGoods();">선택삭제</button>
+				</li>
+			</ul>
+			
+			<div id="gridListGoods"	style="width: 100%; max-height: 350px; height: 350px;" class="ag-theme-balham lh60"></div>
+<!-- 			<ul class="panelBar"> -->
+<!-- 				<li class="center"> -->
+<!-- 					<div class="tablePaging" id="brandGoodsPagination"></div> -->
+<!-- 				</li> -->
+<!-- 			</ul> -->
+		</div>
+	</div>
+</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+	var cornerDispTypeList = gagajf.convertToArray([[${cornerDispTypeList}]]);
+	var goodsStatList =gagajf.convertToArray([[${goodsStatList}]]);
+	// 브랜드 그룹번호 전역변수
+	var _brandGroupNo = '';
+	
+	var columnDefsBrand = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "브랜드번호"		, field:'brandGroupNo'			, width:150, cellClass: 'text-center', editable: false },
+		{headerName: "브랜드그룹명"			, field:'brandNm'			, width:400, cellClass: 'text-center',
+			cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; },
+			cellEditorParams: { maxlength: 50, required: true }
+		},
+		{headerName: "코너유형"		, field:'cornerDispType'		, width:180, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(cornerDispTypeList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cornerDispTypeList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(cornerDispTypeList, params.newValue); }
+		},
+		{headerName: "전시순서"		, field:'dispOrd'				, width:100, cellClass: 'text-right',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 3, required: true }
+		},
+		{headerName: "등록일"			, field:'regDt'				, width:200, cellClass: 'text-center', editable: false }
+	];
+	
+	var columnDefsGoods = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "상품코드"	, field:'goodsCd'		, width:150, cellClass: 'text-left'
+			, cellRenderer: function(params) {return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "상품명"		, field:'goodsNm'		, width:300, cellClass: 'text-left'},
+		{headerName: "이미지"		, field:'sysImgNm'		, width:100 , height:60, cellClass: 'text-right'
+			,cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '?RS=60" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ _goodsUrl+ "/" + params.value +'\')" onerror="this.src=\'/image/no.png\';"/>';
+			}
+		},
+		{headerName: "재고"		, field:'stockQtySum'			, width:80 , cellClass: 'text-center'
+			, cellRenderer: function(params) {return !gagajf.isNull(params.value) ? params.value : '0'; }
+		},
+		{headerName: "할인율(%)"		, field:'dcRate'		, width:80 , cellClass: 'text-center'},
+		{headerName: "정상가"		, field:'listPrice'		, width:100, cellClass: 'text-right' , hide : true
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "판매가"		, field:'currPrice'		, width:100, cellClass: 'text-right'
+			, valueFormatter: function(params) { return params.value.addComma(); }
+		},
+		{headerName: "정상/이월여부", field:'formalGb'		, width:120, cellClass: 'text-center'},
+		{headerName: "상품상태"	, field:'goodsStat'		, width:100, cellClass: 'text-center'
+			, valueFormatter: function(params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); }
+		},
+		{headerName: "업체"		, field:'supplyCompNm'	, width:150, cellClass: 'text-left'},
+		{headerName: "기획전상세"	, field:'planDtlSq'		, width:200, cellClass: 'text-left', hide: true},
+		{headerName: "등록일"		, field:'regDt'			, width:100,  cellClass: 'text-left'
+			, cellRenderer: function(params) { return !gagajf.isNull(params.value) ? params.value.toDate("YYYY-MM-DD HH:MM:SS").format("YYYY-MM-DD") : ''; }
+		},
+	];
+	
+	var gridOptionsBrand = gagaAgGrid.getGridOptions(columnDefsBrand);
+	gridOptionsBrand.suppressRowClickSelection = true;
+	gridOptionsBrand.stopEditingWhenGridLosesFocus = true;
+	gridOptionsBrand.defaultColDef.editable = true;
+	//gridOptionsBrand.rowSelection = 'multiple';
+	
+	var gridOptionsGoods = gagaAgGrid.getGridOptions(columnDefsGoods);
+	gridOptionsGoods.rowSelection = 'multiple';
+	gridOptionsGoods.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	gridOptionsGoods.suppressRowClickSelection = true;
+
+	gridOptionsGoods.onCellClicked = function(event) {
+		if (event.colDef.field == 'goodsCd') {
+			// 상품 상세 팝업
+			cfnOpenGoodsDetailPopup('U',event.data.goodsCd);
+		}
+	}
+
+	// 브랜드 셀 클릭 이벤트
+	gridOptionsBrand.onCellClicked = function(event) {
+		var field = event.colDef.field;
+		if (field != 'brandNm') return;
+
+		fnBindSearch(event.data);
+	}
+
+	// 코너 상품 조회 바인딩
+	var fnBindSearch = function(data) {
+		if (!gagajf.isNull(data.brandNm)) {
+
+			$('#brandNm').html(data.brandNm);
+			_brandGroupNo = data.brandGroupNo;
+
+			fnShotGoodsSearch();
+		}
+	}
+	// 상품 추가 버튼 클릭시 
+	var fnOpenGoodsPopup = function() {
+		var allData = gagaAgGrid.getAllRowData(gridOptionsBrand);
+		if (allData.length < 1 ) {
+			mcxDialog.alert('브랜드가 존재 하지 않습니다.');
+			return;
+		}
+
+		if ($("#brandNm").text() == null || $("#brandNm").text()=='') {
+			mcxDialog.alert('브랜드를 선택해주세요.');
+			return;
+		}
+		cfnOpenGoodsPopup('fnCreateGoods');
+	}
+
+	// 브랜드 조회
+	var fnBrandSearch = function() {
+		var formId = '#shotBrandListForm';
+		gagaAgGrid.fetch($(formId).prop('action'), gridOptionsBrand, formId
+						, function() {
+								$('#gridListGoods').html('');
+								$('#brandNm').html('');
+								gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
+				});
+		
+		uifnPopupClose('fnCreateGoods');
+	}
+	
+	// 코너 저장
+	var fnShotBrandSave = function() {
+		var changeData = gagaAgGrid.getChangedData(gridOptionsBrand);
+
+		if (changeData.length < 1) {
+			mcxDialog.alert('변경된 브랜드 목록이 없습니다.');
+			return;
+		}
+
+		// Validation
+		if (!gagaAgGrid.validation(gridOptionsBrand, changeData))
+			return;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(changeData);
+				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/brand/update', jsonData, fnBrandSearch);
+			}
+		});
+	}
+	
+	// 상품추가
+	var fnCreateGoods = function(result) {
+		if (result.length < 1) return;
+	
+		var oldGoodsList = gagaAgGrid.getAllRowData(gridOptionsGoods);
+		for (var disp = 0; disp < result.length; disp++) {
+			let addChk = true;
+			
+			// 받아온 data for
+			for(let j = 0 ; j < oldGoodsList.length ; j++) {
+				if(oldGoodsList[j].goodsCd == result[disp].goodsCd) {	addChk = false;	}					// 중복체크
+			}
+			
+			if(addChk) {
+				var goods = { brandGroupNo : _brandGroupNo ,
+						      goodsCd : result[disp].goodsCd ,
+						      dispOrd : oldGoodsList.length+1
+						    };
+				oldGoodsList.unshift(goods);
+			}
+		}
+		
+		mcxDialog.confirm('선택하신 상품을 추가 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(oldGoodsList);
+				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/goods/save', jsonData, fnShotGoodsSearch);
+			}
+		});
+	}
+
+
+	// 브랜드 상품 조회
+	var fnShotGoodsSearch = function() {
+		uifnPopupClose('popupGoods');
+		var actionUrl = '/marketing/shot/delivery/goods/list';
+		var data = {brandGroupNo:_brandGroupNo};
+		var jsonData = JSON.stringify(data);
+
+		gagajf.ajaxJsonSubmit(actionUrl, jsonData, function(data) {
+			gridOptionsGoods.api.setRowData(data.brandGoodsList);
+		});
+	}
+	
+	//선택삭제
+	var fnDeleteGoods = function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptionsGoods);
+
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('선택된 상품을 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(removedData);
+
+				gagajf.ajaxJsonSubmit('/marketing/shot/delivery/goods/delete', jsonData, function() {
+					fnShotGoodsSearch();
+				});
+			}
+		});
+	}
+	
+	// 엑셀상품추가
+	//var fnGoodsExcelUpload = function() {
+	//	cfnExcelUploadPopup('createGoods', 'fnCreatePlanGoodsExcel');
+	//}
+
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridListBrand', gridOptionsBrand);
+		gagaAgGrid.createGrid('gridListGoods', gridOptionsGoods);
+		fnBrandSearch();
+	});
 </script>

+ 20 - 2
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerGoodsSendForm.html

@@ -161,7 +161,11 @@
 		{headerName: "IF결과메세지", field: "apiMessage", width: 300, cellClass: 'text-left'},
 		{headerName: "자사 상품코드", field: "goodsCd", width: 150, cellClass: 'text-center'},
 		{headerName: "옵션코드", field: "optCd", width: 150, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm", width: 300, cellClass: 'text-left'},
+		{headerName: "상품명", field: "goodsNm", width: 300, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
 		{headerName: "xml", field: "xmlTxt", width: 100, cellClass: 'text-center', editable: true,
 			cellEditor: 'agLargeTextCellEditor',
 			cellRenderer: function(params) {
@@ -190,7 +194,11 @@
 		},
 		{headerName: "IF결과메세지", field: "apiMessage", width: 300, cellClass: 'text-left'},
 		{headerName: "자사 상품코드", field: "goodsCd", width: 150, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm", width: 300, cellClass: 'text-left'},
+		{headerName: "상품명", field: "goodsNm", width: 300, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
 		{
 			headerName: "전송일자", field: "regDt", width: 150, cellClass: 'text-center',
@@ -205,6 +213,16 @@
 		gridOptions = gagaAgGrid.getGridOptions(columnDefs2);
 	}
 
+	// Row Click
+	gridOptions.onCellClicked = function(event) {
+		var goodsCd = event.data.goodsCd;
+		if (event.colDef.field == "goodsNm"){
+			cfnOpenGoodsDetailPopup('U',goodsCd);
+		}else if (event.colDef.field == "goodsCd"){
+
+			//cfnOpenFrontGoodsPopup(goodsCd, event.data.siteCd);
+		}
+	}
 
 	//페이징
 	$('#searchForm select[name=pageSize]').on('change', function() {

+ 12 - 12
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderDetailForm.html

@@ -93,13 +93,13 @@
 						<th>주문수량</th>
 						<td class="aL padL10" th:text="${slkOrderInfo.quantity}"></td>
 						<th>주문금액</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.orderPrice}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.orderPrice, 0,'COMMA', 0,'POINT')}"></td>
 						<th>판매단가</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.salePrice}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.salePrice, 0,'COMMA', 0,'POINT')}"></td>
 					</tr>
 					<tr>
 						<th>공급가</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.supplyPrice}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.supplyPrice, 0,'COMMA', 0,'POINT')}"></td>
 						<th>옵션명</th>
 						<td class="aL padL10" th:text="${slkOrderInfo.sku}"></td>
 						<th>주문일자</th>
@@ -123,15 +123,15 @@
 					</tr>
 					<tr>
 						<th>쇼핑몰부담할인액</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.disPriceMall}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.disPriceMall, 0,'COMMA', 0,'POINT')}"></td>
 						<th>판매자부담할인액</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.disPriceSeller}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.disPriceSeller, 0,'COMMA', 0,'POINT')}"></td>
 						<th>쿠폰할인액</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.disPriceCoupon}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.disPriceCoupon, 0,'COMMA', 0,'POINT')}"></td>
 					</tr>
 					<tr>
 						<th>포인트할인액</th>
-						<td class="aL padL10" th:text="${slkOrderInfo.disPricePoint}"></td>
+						<td class="aL padL10" th:text="${#numbers.formatDecimal(slkOrderInfo.disPricePoint, 0,'COMMA', 0,'POINT')}"></td>
 						<th>물류배송여부</th>
 						<td class="aL padL10" th:text="${slkOrderInfo.distributionDelivery}"></td>
 						<th>옵션매칭코드</th>
@@ -234,19 +234,19 @@
 						</tr>
 						<tr>
 							<th>현재판매가</th>
-							<td class="aL padL10" th:text="${extOrderInfo.currPrice}"></td>
+							<td class="aL padL10" th:text="${#numbers.formatDecimal(extOrderInfo.currPrice, 0,'COMMA', 0,'POINT')}"></td>
 							<th>주문수량</th>
 							<td class="aL padL10" th:text="${extOrderInfo.ordQty}"></td>
 							<th>주문금액</th>
-							<td class="aL padL10" th:text="${extOrderInfo.ordAmt}"></td>
+							<td class="aL padL10" th:text="${#numbers.formatDecimal(extOrderInfo.ordAmt, 0,'COMMA', 0,'POINT')}"></td>
 						</tr>
 						<tr>
 							<th>쿠폰할인금액</th>
-							<td class="aL padL10" th:text="${extOrderInfo.cpnDcAmt}"></td>
+							<td class="aL padL10" th:text="${#numbers.formatDecimal(extOrderInfo.cpnDcAmt, 0,'COMMA', 0,'POINT')}"></td>
 							<th>포인트할인금액</th>
-							<td class="aL padL10" th:text="${extOrderInfo.pntDcAmt}"></td>
+							<td class="aL padL10" th:text="${#numbers.formatDecimal(extOrderInfo.pntDcAmt, 0,'COMMA', 0,'POINT')}"></td>
 							<th>배송비</th>
-							<td class="aL padL10" th:text="${extOrderInfo.delvFee}"></td>
+							<td class="aL padL10" th:text="${#numbers.formatDecimal(extOrderInfo.delvFee, 0,'COMMA', 0,'POINT')}"></td>
 						</tr>
 						<tr>
 							<th>주문수집일</th>

+ 25 - 4
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html

@@ -51,7 +51,7 @@
 							</td>
 						</tr>
 					</table>
-					<p class="dot">실패사유가 <font color="red">가용재고없음</font>일 경우 고객에게 림이 발송된 건으로 엑셀업로드를 하지 말아주세요.</p>
+					<p class="dot">실패사유가 <font color="red">가용재고없음</font>일 경우 고객에게 림이 발송된 건으로 엑셀업로드를 하지 말아주세요.</p>
 					<p class="dot">샵링커 주문수집 => 제휴몰 주문등록 => (제휴몰 주문등록 성공목록만) STYLE24에 주문등록이 됩니다.</p>
 					<p class="dot">샵링커 주문수집 시 동일한 목록은 '제휴몰 주문등록'이 되지 않습니다. </p>
 					<p class="dot">[제휴몰 주문등록 상태]가 <font color="red">미매핑</font>건은 옵션정보가 없는것으로 <font color="red">제휴몰주문업로드</font> 해주세요.(딜상품)</p>
@@ -228,9 +228,21 @@
 		{headerName: "자사 상품코드", field: "partnerProductId", width: 130, cellClass: 'text-center'},
 		{headerName: "상품명", field: "productName", width: 130, cellClass: 'text-center'},
 		{headerName: "주문수량", field: "quantity", width: 130, cellClass: 'text-center'},
-		{headerName: "주문금액", field: "orderPrice", width: 130, cellClass: 'text-center'},
-		{headerName: "판매단가", field: "salePrice", width: 130, cellClass: 'text-center'},
-		{headerName: "공급가", field: "supplyPrice", width: 130, cellClass: 'text-center'},
+		{headerName: "주문금액", 			field: "orderPrice",				width: 100, cellClass: 'text-center'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		{headerName: "판매단가", 			field: "salePrice",				width: 100, cellClass: 'text-center'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		{headerName: "공급가", 			field: "supplyPrice",				width: 100, cellClass: 'text-center'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
 		{headerName: "옵션명", field: "sku", width: 130, cellClass: 'text-center'},
 		{headerName: "주문수집일자", field: "orderRegDate", width: 150, cellClass: 'text-center',
 			cellRenderer: function(params) {
@@ -450,6 +462,15 @@
 					$("#btnCollection").addClass("btn-primary");
 					$("#btnCollection").removeClass("btn-dark");
 
+					if( 5 < $(".runable_info").html().length){
+						var resultTxt = result.txt;
+						if( null != resultTxt ){
+							resultTxt = resultTxt.replace("제휴몰", "제휴몰남은수 "+result.remainExtCnt.addComma());
+							resultTxt = resultTxt.replace("스타일24", "스타일24남은수 "+result.remainStyleCnt.addComma() )
+							$(".runable_info").html(resultTxt);
+						}
+					}
+
 				}else{
 					// 현재 진행중
 					$("#btnCollection").html("주문수집중");