Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/bin2107' into card007

card007 4 gadi atpakaļ
vecāks
revīzija
a2a5ab3cd9
23 mainītis faili ar 272 papildinājumiem un 131 dzēšanām
  1. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaSystemDao.java
  2. 11 0
      src/main/java/com/style24/admin/biz/service/TsaSystemService.java
  3. 15 0
      src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  4. 13 0
      src/main/java/com/style24/admin/biz/web/TsaSystemController.java
  5. 6 0
      src/main/java/com/style24/persistence/domain/IfIncomelot.java
  6. 3 3
      src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml
  7. 45 21
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  8. 8 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaSystem.xml
  9. 1 0
      src/main/webapp/WEB-INF/views/display/CategoryGoodsForm.html
  10. 1 4
      src/main/webapp/WEB-INF/views/display/LookbookBannerPopupForm.html
  11. 22 24
      src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html
  12. 2 8
      src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html
  13. 2 0
      src/main/webapp/WEB-INF/views/goods/GoodsContentsForm.html
  14. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsEpSkipPopupForm.html
  15. 2 0
      src/main/webapp/WEB-INF/views/goods/GoodsNoticeForm.html
  16. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsPriceReservePopupForm.html
  17. 23 42
      src/main/webapp/WEB-INF/views/goods/GoodsReinboundInformForm.html
  18. 1 1
      src/main/webapp/WEB-INF/views/goods/GoodsReserveSellPopupForm.html
  19. 13 0
      src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html
  20. 2 2
      src/main/webapp/WEB-INF/views/goods/GoodsTitleReservePopupForm.html
  21. 6 6
      src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotSkuForm.html
  22. 61 3
      src/main/webapp/WEB-INF/views/system/MenuForm.html
  23. 22 13
      src/main/webapp/ux/plugins/gaga/gaga.validation.js

+ 9 - 0
src/main/java/com/style24/admin/biz/dao/TsaSystemDao.java

@@ -109,6 +109,15 @@ public interface TsaSystemDao {
 	 */
 	Collection<Menu> getMenuList(Menu menu);
 
+	/**
+	 * 메뉴ID 건수 조회
+	 * @param menuId - 메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 16
+	 */
+	int getMenuIdCount(String menuId);
+
 	/**
 	 * 메뉴 등록/수정
 	 * @param menu - 메뉴 정보

+ 11 - 0
src/main/java/com/style24/admin/biz/service/TsaSystemService.java

@@ -289,6 +289,17 @@ public class TsaSystemService {
 		}
 	}
 
+	/**
+	 * 메뉴ID 건수 조회
+	 * @param menuId - 메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 16
+	 */
+	public int getMenuIdCount(String menuId) {
+		return systemDao.getMenuIdCount(menuId);
+	}
+
 	/**
 	 * 메뉴 등록/수정 및 메뉴권한 생성
 	 * @param menu - 메뉴 정보

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

@@ -1991,6 +1991,16 @@ public class TsaGoodsController extends TsaBaseController {
 
 		GagaMap result = new GagaMap();
 
+		// multi row 검색관련 처리
+		if (!StringUtils.isBlank(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").trim().split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
 		goodsSearch.setPageable(new TscPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
 		goodsSearch.getPageable().setTotalCount(goodsService.getReinboundInformCount(goodsSearch));
 
@@ -3259,6 +3269,11 @@ public class TsaGoodsController extends TsaBaseController {
 
 		GagaMap result = new GagaMap();
 
+		// multi row 검색관련 처리 
+		if (!StringUtils.isBlank(ifIncomelot.getCondition())) {
+			ifIncomelot.setConditionList(ifIncomelot.getCondition().replaceAll("\r", "").trim().split("\n"));
+		}
+		
 		ifIncomelot.setPageable(new TscPageRequest(ifIncomelot.getPageNo() - 1, ifIncomelot.getPageSize()));
 		ifIncomelot.getPageable().setTotalCount(goodsService.getGoodsWmsIncomelotSkuListCount(ifIncomelot));
 

+ 13 - 0
src/main/java/com/style24/admin/biz/web/TsaSystemController.java

@@ -310,6 +310,19 @@ public class TsaSystemController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 
+	/**
+	 * 메뉴ID 조회
+	 * @param menuId - 메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 7. 16
+	 */
+	@GetMapping("/menu/id/{menuId}")
+	@ResponseBody
+	public int getMenuIdCount(@PathVariable("menuId") String menuId) {
+		return systemService.getMenuIdCount(menuId);
+	}
+
 	/**
 	 * 메뉴 등록/수정 처리
 	 * @return

+ 6 - 0
src/main/java/com/style24/persistence/domain/IfIncomelot.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
 
@@ -39,6 +40,11 @@ public class IfIncomelot extends TscBaseDomain {
 	private String goodsCd;
 	private String stDate;
 	private String edDate;
+	
+	private String condition; 
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] conditionList;
 
 	// Pagination
 	private TscPageRequest pageable;

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

@@ -707,7 +707,7 @@
 				<when test='search != null and search == "searchGoodsCd"'>
 					AND (
 					<foreach collection="conditionList" item="item" index="index" separator="or">
-						UPPER(G.GOODS_CD) LIKE CONCAT(UPPER(#{item}),'%')
+						G.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%')
 					</foreach>
 					)
 				</when>
@@ -744,10 +744,10 @@
 			</choose>
 		</if>
 		<if test='goodsCd != null and goodsCd != ""'>
-			AND UPPER(G.GOODS_CD) LIKE CONCAT(UPPER(#{goodsCd}),'%')
+			AND G.GOODS_CD LIKE CONCAT(UPPER(#{goodsCd}),'%')
 		</if>
 		<if test="arrGoodsCd != null and arrGoodsCd.length>0">
-			AND UPPER(G.GOODS_CD) IN
+			AND G.GOODS_CD IN
 			<foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
 				UPPER(#{item})
 			</foreach>

+ 45 - 21
src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -3598,14 +3598,22 @@
 		<if test='alarmYn != null and alarmYn == "N"'>
 		AND IA.INFORM_DT IS NULL
 		</if>
-		<if test='condition != null and condition != "" '>
+		<if test='conditionList != null and conditionList.length>0'>
 		    <choose>
-		        <when test='search != null and search == "searchGoodsNm"'>
-		AND UPPER(G.GOODS_NM) LIKE  CONCAT(UPPER(#{condition}),'%')
-		        </when>
-				<when test='search != null and search == "searchGoodsCd"'>
-		AND G.GOODS_CD LIKE  CONCAT(UPPER(#{condition}),'%')
-				</when>
+		      <when test='search != null and search == "searchGoodsCd"'>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       G.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </when>
+		      <otherwise>
+		AND (
+		      <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(G.GOODS_NM) LIKE CONCAT(UPPER(#{item}),'%') 
+		      </foreach>
+		     )
+		      </otherwise>
 		    </choose>
 		</if>
 		<if test='dateGbn != null and dateGbn == "reqDt"'>
@@ -3687,14 +3695,22 @@
 		              <if test='alarmYn != null and alarmYn == "N"'>
 		              AND IA.INFORM_DT IS NULL
 		              </if>
-		              <if test='condition != null and condition != "" '>
+		              <if test='conditionList != null and conditionList.length>0'>
 		                  <choose>
-		                      <when test='search != null and search == "searchGoodsNm"'>
-		              AND UPPER(G.GOODS_NM) LIKE  CONCAT(UPPER(#{condition}),'%')
-		                      </when>
-		                      <when test='search != null and search == "searchGoodsCd"'>
-		              AND G.GOODS_CD LIKE  CONCAT(UPPER(#{condition}),'%')
-		                      </when>
+		                    <when test='search != null and search == "searchGoodsCd"'>
+		              AND (
+		                    <foreach collection="conditionList" item="item" index="index" separator="or">
+		                     G.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%') 
+		                    </foreach>
+		                   )
+		                    </when>
+		                    <otherwise>
+		              AND (
+		                    <foreach collection="conditionList" item="item" index="index" separator="or">
+		                     UPPER(G.GOODS_NM) LIKE CONCAT(UPPER(#{item}),'%') 
+		                    </foreach>
+		                   )
+		                    </otherwise>
 		                  </choose>
 		              </if>
 		              <if test='dateGbn != null and dateGbn == "reqDt"'>
@@ -4841,9 +4857,13 @@
 		    <if test="brandCd != null and brandCd != ''">
 		    AND B.BRAND_CD = #{brandCd}
 		    </if>
-		    <if test="goodsCd != null and goodsCd != ''">
-		    AND Z.GOODS_CD = #{goodsCd}
-		    </if>
+		    <if test='conditionList != null and conditionList.length>0'>
+		    AND (
+		        <foreach collection="conditionList" item="item" index="index" separator="or">
+		       Z.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%') 
+		        </foreach>
+		     )
+		     </if>
 	</select>
 	
 	<!-- WMS입고단품목록 -->
@@ -4890,9 +4910,13 @@
 		          <if test="brandCd != null and brandCd != ''">
 		          AND B.BRAND_CD = #{brandCd}
 		          </if>
-		          <if test="goodsCd != null and goodsCd != ''">
-		          AND Z.GOODS_CD = #{goodsCd}
-		          </if>
+		          <if test='conditionList != null and conditionList.length>0'>
+		           AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               Z.GOODS_CD LIKE CONCAT(UPPER(#{item}),'%') 
+		              </foreach>
+		           )
+		           </if>
 		            ORDER BY LOTNO, DATEINCOME, SKUCODE
 		          ) Q
 		LIMIT #{pageable.limitStartRow} ,  #{pageable.pageSize}
@@ -5110,7 +5134,7 @@
 	</delete>
 	
 	<!-- 상품 상세 컨텐츠 저장 -->
-	<insert id="createGoodsContents" parameterType="GoodsContents" keyProperty="goodsContentsType">
+	<insert id="createGoodsContents" parameterType="GoodsContents" keyProperty="goodsContentsSq">
 		/* TsaNotice.createGoodsContents */
 		INSERT INTO TB_GOODS_CONTENTS (
 		       GOODS_CONTENTS_SQ

+ 8 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaSystem.xml

@@ -330,6 +330,14 @@
 		ORDER  BY ORDBY
 	</select>
 
+	<!-- 메뉴ID 건수 -->
+	<select id="getMenuIdCount" parameterType="String" resultType="int">
+		/* TsaSystem.getMenuIdCount */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_MENU
+		WHERE  MENU_ID = #{menuId}
+	</select>
+	
 	<!-- 메뉴 등록/수정 -->
 	<insert id="saveMenu" parameterType="Menu">
 		/* TsaSystem.saveMenu */

+ 1 - 0
src/main/webapp/WEB-INF/views/display/CategoryGoodsForm.html

@@ -211,6 +211,7 @@
 		{headerName: "공급업체상품코드", field: "supplyGoodsCd", width: 120, cellClass: 'text-center'},
 		{headerName: "스타일구분", field: "styleYear", width: 80, cellClass: 'text-center'},
 		{headerName: "정상/이월", field: "formalGb", width: 80, cellClass: 'text-center'},
+		{headerName: "등록자ID", field: "regNo", width: 80, cellClass: 'text-center'},
 		{headerName: "등록자", field: "regNm", width: 80, cellClass: 'text-center'},
 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center'}
 	];

+ 1 - 4
src/main/webapp/WEB-INF/views/display/LookbookBannerPopupForm.html

@@ -188,10 +188,7 @@
 
 	var fnBannerImgFileUpload = function (obj, idx){
 		var file = obj.files[0];
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
+
 		file.name = 'test';
 		if (typeof(file) == 'undefined'){
 			return;

+ 22 - 24
src/main/webapp/WEB-INF/views/display/MainContentsPopupForm.html

@@ -111,7 +111,7 @@
 					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>';
 				}
 				if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
-					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddBrandDescRow(this);">브랜드소개추가</button>';
+					html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddBrandDescRow(this ,\'add\','+i+');">브랜드소개추가</button>';
 				}
 				if(contentsLoc!='SMM005' && contentsLoc!='SBM005' && contentsLoc!='SBMM005' && contentsLoc!='SGNB001' && contentsLoc!='SGNB002'  && contentsLoc!='SMM011' && contentsLoc!='SBM012' && contentsLoc!='SBMM012' && contentsLoc!='SMM001' && contentsLoc!='SOM001' && contentsLoc!='SMM003' && contentsLoc!='SMM004' && contentsLoc!='SMM006'
 					&& contentsLoc!='SBM007' && contentsLoc!='SBM008' && contentsLoc!='SBM009' && contentsLoc!='SBM010' && contentsLoc!='SBM011' && contentsLoc!='SBM013' && contentsLoc!='SBM017' && contentsLoc!='SBM018' && contentsLoc!='SBM019' && contentsLoc!='SOM003' && contentsLoc!='SOM004'  && contentsLoc!='SCM004' && contentsLoc!='SBM004' && contentsLoc!='SCM001'){
@@ -695,7 +695,7 @@
 				html += ' onclick="fnAddSubTextPopRow(this);">서브텍스트추가</button>\n';
 			}
 			if(contentsLoc=='SBM005' || contentsLoc=='SBMM005'){
-				html += '<button type="button" class="btn btn-base btn-lg" id="addBrandDesc'+dataIdx+'" onclick="fnAddBrandDescRow(this);">브랜드소개추가</button>\n';
+				html += '<button type="button" class="btn btn-base btn-lg" id="addBrandDesc'+dataIdx+'" onclick="fnAddBrandDescRow(this,\'add\','+dataIdx+');">브랜드소개추가</button>\n';
 			}
 			if(contentsLoc!='SBM005' && contentsLoc!='SBMM005' && contentsLoc!='SGNB001' && contentsLoc!='SGNB002' && contentsLoc!='SMM005') {
 				html += '<button type="button" class="btn btn-base btn-lg"';
@@ -973,10 +973,7 @@
 
 	var fnVideoFileUpload = function (obj, idx){
 		var file = obj.files[0];
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
+
 		gagaKollus.upload('Display', file, $(obj).find('input[name=kufKey]'));
 	}
 
@@ -1526,10 +1523,6 @@
 	var fnPopFileUpload = function (obj, ind){
 		var file = obj.files[0];
 
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
 		file.name = 'test';
 		if (typeof(file) == 'undefined'){
 			return;
@@ -1553,11 +1546,6 @@
 	var fnGnbFileUpload = function (obj, ind, num){
 		var file = obj.files[0];
 
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
-
 		file.name = 'test';
 		if (typeof(file) == 'undefined'){
 			return;
@@ -1638,8 +1626,17 @@
 	 * 브랜드 소개추가
 	 */
 	var brandDescIndex = 0;
-	var fnAddBrandDescRow = function (param){
+	var fnAddBrandDescRow = function (param , gubun, idx){
+		if(gubun=='add'){
+			var thisIdx = $("#mcTable"+idx).find("input[name=tableIdx]").val();
+			brandDescIndex = thisIdx;
+		}
+
 		var val = typeof param=='object'?'':param;
+		if(!gagajf.isNull()){
+			val = val.replaceAll('&lt;','<').replaceAll('&gt;', '>').replaceAll('&quot;', '"');
+		}
+
 		var html = '<tr name="subTextPopRow">'
 		html += '<th>브랜드소개';
 		html += '<br/>';
@@ -1751,18 +1748,18 @@
 		html += '<th>모바일용 이미지';
 		html += '</th>';
 		html += '<td><div class="uFile w300 mobImgFile">';
-		html += '<input id="filePop_'+imgMobIndex+'" name="file" type="file" class="uFileInput w300" onchange="fnPopFileUpload(this, '+imgMobIndex+')"/>';
-		html += '<label for="filePop_'+imgMobIndex+'" class="uFileLabel">파일선택</label>';
+		html += '<input id="filePop_100'+imgMobIndex+'" name="file" type="file" class="uFileInput w300" onchange="fnPopFileUpload(this, 100'+imgMobIndex+')"/>';
+		html += '<label for="filePop_100'+imgMobIndex+'" class="uFileLabel">파일선택</label>';
 		html += '<input type="hidden" name="imgPath" value="'+imgPath+'"/>';
 		html += '<input type="hidden" name="newImgFile" value="" />';
 		html += '</div>';
-		html += '<div id="imgViewPop_'+imgMobIndex+'" class=';
+		html += '<div id="imgViewPop_100'+imgMobIndex+'" class=';
 		if(src!=''){
 			html += '"on">';
 		}else{
 			html += '"off">';
 		}
-		html += '<img id="bannerPreViewUrlPop_'+imgMobIndex+'" src="'+src+'" style="height:100px; max-width:500px;"  onclick="cfnOpenImagePreViewPopup(\'bannerPreimgViewPop\',$(this).attr(\'src\'));"/>';
+		html += '<img id="bannerPreViewUrlPop_100'+imgMobIndex+'" src="'+src+'" style="height:100px; max-width:500px;"  onclick="cfnOpenImagePreViewPopup(\'bannerPreimgViewPop\',$(this).attr(\'src\'));"/>';
 		html += '</div></td>';
 		if(contentsLoc!='SMM001' && contentsLoc!='SOM001' && contentsLoc!='SCM001' && contentsLoc!='SBM004'){
 			html += '<td class="aL"><button type="button" class="btn icn" onclick="fnDeleteTrRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button></td>';
@@ -1863,10 +1860,7 @@
 	// 동영상파일 선택 시
 	$('#popSortable input[name=file]').on('change', function() {
 		var file = this.files[0];
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
+
 		gagaKollus.upload('Display', file, $('input[name=kufKey]'));
 	});
 
@@ -1878,6 +1872,10 @@
 	var fnResetDispOrd = function (){
 		$('.mcTable').each(function (idx){
 			$(this).find('input[name=dispOrd]').val(idx+1);
+			if(contentsLoc=='SBM005'){
+				var thisIdx = $(this).find("input[name=tableIdx]").val();
+				$(this).find('textarea[name=subText]').attr('id','brandDesc'+thisIdx);
+			}
 		});
 	}
 

+ 2 - 8
src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html

@@ -454,10 +454,7 @@ console.log('brandGroupNo:'+brandGroupNo);
 	 */
 	var fnBrandImgFileUpload = function (obj, ind){
 		var file = obj.files[0];
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
+
 		file.name = 'test';
 		if (typeof(file) == 'undefined'){
 			return;
@@ -588,10 +585,7 @@ console.log('brandGroupNo:'+brandGroupNo);
 	// 기획전/배너 파일첨부
 	var fnPlanFileUpload = function (obj, ind){
 		var file = obj.files[0];
-		// 파일 용량 체크 10MB
-		if(!gagajf.checkFileSize(file)){
-			return;
-		}
+
 		file.name = 'test';
 		if (typeof(file) == 'undefined'){
 			return;

+ 2 - 0
src/main/webapp/WEB-INF/views/goods/GoodsContentsForm.html

@@ -644,6 +644,7 @@
 		
 		// 신규 상세 공지일경우 화면에서만 삭제
 		if (gagajf.isNull($('#goodsContentsForm input[name=goodsContentsSq]').val())){
+			var removedData = gagaAgGrid.removeRowData(gridContentsGoodsOptions, false);
 			return;
 		}
 		
@@ -814,6 +815,7 @@
 				var jsonData = JSON.stringify(data);
 				gagajf.ajaxJsonSubmit($('#goodsContentsForm').prop('action'), jsonData, function() {
 					$('#btnSearch').trigger('click');
+					$("#btnNew").trigger('click');
 					//fnGetContentsGoodsList($('#goodsContentsForm input[name=goodsContentsSq]').val());
 					
 				});

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

@@ -31,10 +31,10 @@
 					<tr>
 						<th>비노출예약일<em class="required" title="필수"></em></th>
 						<td>
-							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" />
+							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<input name="applyStdt" id="applyStdt" type="hidden" />
 							~
-							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" />
+							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<input name="applyEddt" id="applyEddt" type="hidden" />
 						</td>
 					</tr>

+ 2 - 0
src/main/webapp/WEB-INF/views/goods/GoodsNoticeForm.html

@@ -407,6 +407,7 @@
 		
 		// 신규 상세 공지일경우 화면에서만 삭제
 		if (gagajf.isNull($('#goodsNoticeForm input[name=noticeSq]').val())){
+			var removedData = gagaAgGrid.removeRowData(gridNoticeGoodsOptions, false);
 			return;
 		}
 		
@@ -495,6 +496,7 @@
 				var jsonData = JSON.stringify($('#goodsNoticeForm').serializeObject());
 				gagajf.ajaxJsonSubmit($('#goodsNoticeForm').prop('action'), jsonData, function() {
 					$('#btnSearch').trigger('click');
+					$("#btnNew").trigger('click');
 					//fnGetNoticeGoodsList($('#goodsNoticeForm input[name=noticeSq]').val());
 					
 				});

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

@@ -34,7 +34,7 @@
 						<td><input type="text" class="w100p aR" id="resGoodsPrice" name="resGoodsPrice" maxlength="10" data-valid-type="numeric" /></td>
 						<th>예약일시<em class="required" title="필수"></em></th>
 						<td>
-							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" />
+							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<select name="applyStHH" id="applyStHH" required="required" data-valid-name="예약 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
 								<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
@@ -42,7 +42,7 @@
 							</select>
 							<input name="applyStdt" id="applyStdt" type="hidden" />
 							~
-							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" />
+							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<select name="applyEdHH" id="applyEdHH" required="required" data-valid-name="예약 종료시간">
 								<th:block th:each="num: ${#numbers.sequence(0,23)}">
 								<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>

+ 23 - 42
src/main/webapp/WEB-INF/views/goods/GoodsReinboundInformForm.html

@@ -33,15 +33,15 @@
 				<table class="frmStyle">
 					<colgroup>
 						<col width="10%"/>
-						<col width="30%"/>
+						<col width="28%"/>
 						<col width="10%"/>
-						<col width="20%"/>
+						<col width="25%"/>
 						<col width="10%"/>
 						<col/>
 					</colgroup>
 					<tr>
 						<th>업체/브랜드</th>
-						<td>
+						<td colspan="3">
 							<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>
@@ -50,18 +50,19 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th>키워드</th>
-						<td>
+						<th rowspan="3">키워드</th>
+						<td rowspan="3">
 							<select name="search" id="search">
 								<option value="searchGoodsCd">상품코드</option>
 								<option value="searchGoodsNm">상품명</option>
-<!-- 								<option value="searchColorNm">색상명</option>
-								<option value="searchSizeNm">사이즈명명</option>
- -->							</select>
-							<input type="text" class="w50p" name="condition" id="condition" maxlength="50"/>
+ 							</select>
+							<textarea class="textareaR3 w60p" name="condition" id="condition"></textarea>
 						</td>
+						
+					</tr>
+					<tr>
 						<th>발송여부</th>
-						<td>
+						<td colspan="3">
 							<select id="alarmYn" name="alarmYn">
 								<option value="">[전체]</option>
 								<option value="N">미발송</option>
@@ -71,28 +72,28 @@
 					</tr>
 					<tr>
 						<th>카테고리</th>
-						<td colspan="5">
+						<td colspan="3">
 							<input name="siteCd" id="siteCd" type="hidden" value="G000_10"/>
 							<input name="selLvl" id="selLvl" type="hidden"/>
 							<input name="cateNo" id="cateNo" type="hidden"/>
 							<input name="cateType" id="cateType" type="hidden"/>
-							<select name="cateGb" id="selCate1" onchange="fnChangeSelect($(this).val(), 2);">
+							<select name="cateGb" id="cateGb" onchange="fnChangeSelect($(this).val(), 1);">
 								<option value="">[카테고리구분]</option>
 								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							<select id="selCate2" name="cate1No" onchange="fnChangeSelect($(this).val(), 3);">
+							<select id="selCate1" name="cate1No" onchange="fnChangeSelect($(this).val(), 2);">
 								<option value="">[카테고리1]</option>
 							</select>
-							<select id="selCate3" name="cate2No" onchange="fnChangeSelect($(this).val(), 4);">
+							<select id="selCate2" name="cate2No" onchange="fnChangeSelect($(this).val(), 3);">
 								<option value="">[카테고리2]</option>
 							</select>
-							<select id="selCate4" name="cate3No" onchange="fnChangeSelect($(this).val(), 5);">
+							<select id="selCate3" name="cate3No" onchange="fnChangeSelect($(this).val(), 4);">
 								<option value="">[카테고리3]</option>
 							</select>
-							<select id="selCate5" name="cate4No" onchange="fnChangeSelect($(this).val(), 6);">
+							<select id="selCate4" name="cate4No" onchange="fnChangeSelect($(this).val(), 5);">
 								<option value="">[카테고리4]</option>
 							</select>
-							<select id="selCate6" name="cate5No" onchange="fnChangeSelect($(this).val(), 7);">
+							<select id="selCate5" name="cate5No" >
 								<option value="">[카테고리5]</option>
 							</select>
 						</td>
@@ -300,26 +301,9 @@
 
 	var fnChangeSelect = function(val, selLvl){
 		$("#cateNo").val('');
-		/* $('#cate1No').val('');
-		$('#cate2No').val('');
-		$('#cate3No').val('');
-		$('#cate4No').val('');
-		$('#cate5No').val(''); */
-		if(val==''){
-			if(selLvl>1){
-				selLvl = selLvl - 1;
-				if(selLvl>2){
-					$("#cateNo").val($("#selCate"+(selLvl-1)).val());
-				}
-			}else{
-				selLvl = '';
-			}
-		}else{
-			if(selLvl>2){
-				$("#cateNo").val(val);
-			}
+		if (1 < selLvl){ //상품검색용 카테고리 설정
+			$("#cateNo").val(val);
 		}
-		
 		$("#searchForm input[name=selLvl]").val(selLvl);
 		$("#searchForm input[name=searchGb]").val("BASIC");
 		gagajf.ajaxFormSubmit('/display/category/list', "#searchForm", fnChangeCategory);
@@ -328,7 +312,7 @@
 	var fnChangeCategory = function(data){
 		var selLvl = $("#searchForm input[name=selLvl]").val();
 		var html = '<option value="">[선택]</option>';
-		for(var i=1; i<7; i++){
+		for(var i=1; i<6; i++){
 			if(i>selLvl){
 				$("#selCate"+i).html(html);
 			}
@@ -337,14 +321,11 @@
 			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].cateNo;
 					nm = data[i].cateNm;
 					$("#cateType").val(data[i].cateType);
-				}
+				
 				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
 			}
 		}

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

@@ -30,7 +30,7 @@
 					<tr>
 						<th>출고예정일<em class="required" title="필수"></em></th>
 						<td>
-							<input name="delvResDt" id="delvResDt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="출고예정일" />
+							<input name="delvResDt" id="delvResDt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="출고예정일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 						</td>
 					</tr>
 				</table>

+ 13 - 0
src/main/webapp/WEB-INF/views/goods/GoodsSalfRegisterForm.html

@@ -900,6 +900,19 @@
 			return false;
 		}
 	
+		var fromDate = $("#goodsDetailForm input[name=sellStYMD]").val().replaceAll('-', '')+ $("#goodsDetailForm select[name=sellStHH]").val();
+		var toDate = $("#goodsDetailForm input[name=sellEdYMD]").val().replaceAll('-', '')+ $("#goodsDetailForm select[name=sellEdHH]").val();
+
+		if (fromDate > toDate) {
+			mcxDialog.alertC("판매기간의 시작일시는 종료일시 보다 클 수 없습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#goodsDetailForm input[name=sellStYMD]').focus();
+				}
+			});
+			return false;
+		}
+		
 		idx = 0;
 		
 		//고시정보가 등록되지 않은 상품 체크

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

@@ -34,7 +34,7 @@
 					<tr>
 						<th>예약일시<em class="required" title="필수"></em></th>
 						<td>
-							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" />
+							<input name="applyStYMD" id="applyStYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약시작일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<select name="applyStHH" id="applyStHH" required="required" data-valid-name="예약 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
 								<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
@@ -42,7 +42,7 @@
 							</select>
 							<input name="applyStdt" id="applyStdt" type="hidden" />
 							~
-							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" />
+							<input name="applyEdYMD" id="applyEdYMD" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="예약 종료일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
 							<select name="applyEdHH" id="applyEdHH" required="required" data-valid-name="예약 종료시간">
 								<th:block th:each="num: ${#numbers.sequence(0,23)}">
 								<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시간</option>

+ 6 - 6
src/main/webapp/WEB-INF/views/goods/GoodsWmsIncomelotSkuForm.html

@@ -32,7 +32,7 @@
 				<table class="frmStyle">
 					<colgroup>
 						<col width="10%"/>
-						<col width="40%"/>
+						<col width="70%"/>
 						<col width="10%"/>
 						<col/>
 					</colgroup>
@@ -47,14 +47,14 @@
 								<option value="">[전체]</option>
 							</select>
 						</td>
-						<th>상품코드<em class="required" title="필수"></em></th>
-						<td>
-							<input id="goodsCd" name=goodsCd type="text" class="w150"  maxlength="20"/>
+						<th rowspan="2">상품코드<em class="required" title="필수"></em></th>
+						<td rowspan="2">
+							<textarea class="textareaR2 w100p" name="condition" id="condition"></textarea>
 						</td>
 					</tr>
 					<tr>
 						<th>입고일<em class="required" title="필수"></em></th>
-						<td colspan="3" id="sellTerms"></td>
+						<td id="sellTerms"></td>
 					</tr>
 				</table>
 				<ul class="panelBar">
@@ -190,7 +190,7 @@
 			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" )) {
+				if ($(el).prop("type") == "text" || $(el).prop("type") == "textarea" || ($(el).prop("type") == "select-one"  &&  el.name != "search" && el.name != "pageSize" )) {
 					if (!(el.value == null || el.value == "")) {
 						cnt++;
 					}

+ 61 - 3
src/main/webapp/WEB-INF/views/system/MenuForm.html

@@ -91,7 +91,8 @@
 								<tr>
 									<th>메뉴ID<i class="required" title="필수" aria-hidden="true"></i></th>
 									<td>
-										<input type="text" name="menuId" placeholder="" maxlength="20" required="required" data-valid-type="alphaNumeric" data-valid-name="메뉴ID" onkeyup="$(this).val($(this).val().toUpperCase());"/>
+										<input type="text" name="menuId" class="w150" placeholder="" maxlength="20" required="required" data-valid-type="alphaNumeric" data-valid-name="메뉴ID" onkeyup="$(this).val($(this).val().toUpperCase());"/>
+										<button type="button" class="btn btn-default btn-sm" id="menuIdDupCheck">중복체크</button>
 									</td>
 									<th>메뉴명<i class="required" title="필수" aria-hidden="true"></i></th>
 									<td>
@@ -101,7 +102,7 @@
 								<tr>
 									<th>메뉴구분<i class="required" title="필수" aria-hidden="true"></i></th>
 									<td>
-										<label class="rdoBtn"><input type="radio" name="menuGb" value="M"/>메뉴</label>
+										<label class="rdoBtn"><input type="radio" name="menuGb" value="M" checked="checked"/>메뉴</label>
 										<label class="rdoBtn"><input type="radio" name="menuGb" value="P"/>프로그램</label>
 									</td>
 									<th>상위메뉴</th>
@@ -378,16 +379,73 @@
 		$('#detailForm input[name=menuNm]').focus();
 	}
 	
+	// 메뉴ID 중복 체크
+	var isUnique = true;
+	$('#menuIdDupCheck').on('click', function() {
+		var $e = $('#registerForm input[name=menuId]');
+		if (gagajf.isNull($e.val())) {
+			mcxDialog.alertC('메뉴ID를 입력해 주세요.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$e.focus();
+				}
+			});
+			return;
+		}
+		
+		$.get('/system/menu/id/' + $e.val()
+			, function(data) {
+				if (data > 0) {
+					mcxDialog.alertC('이 ID는 이미 사용중입니다. 다른 ID를 입력해 주세요.', {
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+							isUnique = false;
+							$e.val('');
+							$e.focus();
+						}
+					});
+				} else {
+					mcxDialog.alert('이 ID는 사용 가능합니다.');
+					isUnique = true;
+				}
+			});
+	});
+	
 	// 저장 처리
 	var fnSave = function(formId) {
 		// 입력 값 체크
 		if (!gagajf.validation(formId))
 			return false;
 		
+		if (formId == '#registerForm') {
+			if (!isUnique) {
+				mcxDialog.alert('메뉴ID를 중복체크해 주세요.');
+				return;
+			}
+		}
+		
 		$(formId + ' input[name=useYn]').val($(formId + ' input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
 		$(formId + ' input[name=roleCds]').val($(formId + ' select[name=roleCd]').val());
 		
-		gagajf.ajaxFormSubmit($(formId).prop('action'), formId, fnSaveCallback);
+		if ($(formId + " input:radio[name=menuGb]").eq(1).is(':checked')) {
+			if (gagajf.isNull($(formId + ' input[name=menuUrl]').val())) {
+				mcxDialog.alertC('메뉴URL을 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$(formId + ' input[name=menuUrl]').focus();
+					}
+				});
+				return;
+			}
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($(formId).prop('action'), formId, fnSaveCallback);
+			}
+		});
 	}
 	
 	// 등록/수정 처리 후 콜백함수

+ 22 - 13
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -714,6 +714,11 @@ var gagajf = {
 		if (typeof policy != 'undefined') {
 			formData.append("policy", policy);
 		}
+		
+		// 파일 사이즈 체크
+		if (!gagajf.checkFileSize(file)) {
+			return;
+		}
 
 		$.ajax({
 			type : 'POST',
@@ -1042,22 +1047,26 @@ var gagajf = {
 		});
 
 		return arrValue;
-	} ,
-	checkFileSize : function (data){
-		var isInvalid = true;
-
-		var fileSize = data.size;
-		var maxSize = 1024 * 1024 * 10;
-		if(fileSize > maxSize){
-			alert("파일용량이 10MB을 초과했습니다.");
-			isInvalid = false;
+	},
+	
+	/**
+	 * 파일의 사이즈를 체크한다.
+	 * 예)
+	 * 		gagajf.checkFileSize(file);
+	 * @param  : file - 선택된 파일
+	 * @author : gagamel
+	 * @since  : 2021. 7. 16
+	 */
+	checkFileSize : function(file) {
+		var fileSize = file.size;
+		var maxSize = 1024 * 1024 * 10; // 10MByte
+		
+		if (fileSize > maxSize) {
+			mcxDialog.alert('파일 용량이 10MB를 초과했습니다.');
 			return false;
-		}else{
-			isInvalid = true
-			return true;
 		}
 
-		return isInvalid;
+		return true;
 	}
 };