Explorar o código

브랜드 메인 - 로고 이미지, 노출언어, rgb

eskim %!s(int64=5) %!d(string=hai) anos
pai
achega
1b851f4435

+ 39 - 3
style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -1,11 +1,14 @@
 package com.style24.admin.biz.service;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import com.style24.admin.biz.dao.TsaBusinessDao;
 import com.style24.admin.support.security.session.TsaSession;
@@ -23,6 +26,9 @@ import com.style24.persistence.domain.SupplyCompany;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+
 /**
  * 영업관리 Service
  *
@@ -33,6 +39,9 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class TsaBusinessService {
 
+	@Autowired
+	private Environment env;
+
 	@Autowired
 	private TscMessageByLocale message;
 
@@ -57,7 +66,7 @@ public class TsaBusinessService {
 	 * @since 2020. 10. 14
 	 */
 	public void saveSupplyCompany(SupplyCompany supplyComp) {
-		if (StringUtils.isNotBlank(supplyComp.getSupplyCompCd())) {
+		if (!StringUtils.isEmpty(supplyComp.getSupplyCompCd())) {
 			businessDao.updateSupplyCompany(supplyComp);
 		} else {
 			businessDao.createSupplyCompany(supplyComp);
@@ -86,7 +95,7 @@ public class TsaBusinessService {
 			delvFeePolicy.setRegNo(TsaSession.getInfo().getUserNo());
 			delvFeePolicy.setUpdNo(TsaSession.getInfo().getUserNo());
 
-			if (StringUtils.isNotBlank(delvFeePolicy.getDelvFeeCd())) {
+			if (!StringUtils.isEmpty(delvFeePolicy.getDelvFeeCd())) {
 				businessDao.updateDeliveryFeePolicy(delvFeePolicy);
 			} else {
 				businessDao.createDeliveryFeePolicy(delvFeePolicy);
@@ -204,6 +213,33 @@ public class TsaBusinessService {
 	 */
 	@Transactional("shopTxnManager")
 	public void saveBrand(Brand brand) {
+
+		if (brand.getNewSysFileNm() != null && !"".equals(brand.getNewSysFileNm())) {
+			String brandImgName = "BRAND_" + brand.getBrandCd() + "_" + GagaDateUtil.getTodayDateTime() + "." + StringUtils.getFilenameExtension(brand.getNewSysFileNm());
+
+			String brandUploadPath = env.getProperty("upload.default.target.path");
+			brandUploadPath = GagaFileUtil.getConcatenationPath(brandUploadPath, "display");
+
+			//기존이미지 삭제
+			try {
+				GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(brandUploadPath, brand.getLogoFileNm()));
+			} catch (IOException e) {
+				//  nothing
+				log.info("[saveBanner 기존 이미지 삭제중 error]");
+				//e.printStackTrace();
+			}
+
+			File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(brandUploadPath, brandImgName)));
+
+			File file = new File(GagaFileUtil.getConcatenationPath(brandUploadPath, brand.getNewSysFileNm()));
+
+			// Rename a file
+			file.renameTo(uniqueFile);
+
+			brand.setLogoFileNm(brandImgName);
+
+		}
+
 		if (brand.getMode().equals("N")) { // 신규
 			businessDao.createBrand(brand);
 		} else { // 수정

+ 5 - 0
style24.admin/src/main/java/com/style24/persistence/domain/Brand.java

@@ -18,6 +18,8 @@ public class Brand extends TscBaseDomain {
 	private String brandCd;			// 브랜드코드
 	private String brandEnm;		// 브랜드영문명
 	private String brandKnm;		// 브랜드한글명
+	private String dispNmLang;		// 노출명언어
+	private String rgbCd;			// RGB코드(front 브랜드메인 GNB 색상)
 	private String brandGrpNm;		// 브랜드그룹명
 	private String supplyCompCd;	// 공급업체코드
 	private String supplyCompNm;	// 공급업체명
@@ -33,10 +35,13 @@ public class Brand extends TscBaseDomain {
 	private float pntMrate10;		// 포인트적립율(모바일정상)
 	private float pntPrate20;		// 포인트적립율(PC이월)
 	private float pntMrate20;		// 포인트적립율(모바일이월)
+	private String logoFileNm;		// 로고파일명
 	private String distributionGb;	// 유통구분(공통코드 G065)
 	private int dispOrd;			// 표시순서
 	private String useYn;			// 사용여부(Y:사용)
 
+	private String newSysFileNm;	//신규이미지파일명
+
 	// 검색조건
 	private String searchTxt;		// 검색어
 	private String callbackFn;	// 콜백함수

+ 12 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -385,6 +385,8 @@
 		     , A.BRAND_ENM                   /*브랜드영문명*/
 		     , A.BRAND_KNM                   /*브랜드한글명*/
 		     , A.BRAND_GRP_NM                /*브랜드그룹명*/
+		     , A.DISP_NM_LANG                /*노출명언어*/
+		     , A.RGB_CD                      /*RGB코드*/
 		     , A.DISTRIBUTION_GB             /*유통구분*/
 		     , A.SUPPLY_COMP_CD              /*업체코드*/
 		     , B.SUPPLY_COMP_NM              /*업체명*/
@@ -399,6 +401,7 @@
 		     , A.PNT_MRATE10                 /*포인트적립율(모바일)*/
 		     , A.PNT_PRATE20                 /*포인트적립율(PC)*/
 		     , A.PNT_MRATE20                 /*포인트적립율(모바일)*/
+		     , A.LOGO_FILE_NM                 /*로고파일명*/
 		     , A.DISP_ORD                    /*표시순서*/
 		     , D.MIN_ORD_AMT                 /*무료배송최소금액*/
 		     , D.DELV_FEE                    /*배송비*/
@@ -549,6 +552,8 @@
 		     , BRAND_ENM
 		     , BRAND_KNM
 		     , BRAND_GRP_NM
+		     , DISP_NM_LANG
+		     , RGB_CD
 		     , SUPPLY_COMP_CD
 		     , DISTRIBUTION_GB
 		     , SELF_YN
@@ -560,6 +565,7 @@
 		     , PNT_MRATE10
 		     , PNT_PRATE20
 		     , PNT_MRATE20
+		     , LOGO_FILE_NM
 		     , DISP_ORD
 		     , USE_YN
 		     , REG_NO
@@ -575,6 +581,8 @@
 		     , #{brandEnm}
 		     , #{brandKnm}
 		     , #{brandGrpNm}
+		     , #{dispNmLang}
+		     , #{rgbCd}
 		     , #{supplyCompCd}
 		     , #{distributionGb}
 		     , CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
@@ -588,6 +596,7 @@
 		     , IFNULL(#{pntMrate10},0)
 		     , IFNULL(#{pntPrate20},0)
 		     , IFNULL(#{pntMrate20},0)
+		     , #{logoFileNm}
 		     , #{dispOrd}
 		     , #{useYn}
 		     , #{regNo}
@@ -604,6 +613,8 @@
 		SET    BRAND_ENM = #{brandEnm}
 		     , BRAND_KNM = #{brandKnm}
 		     , BRAND_GRP_NM = #{brandGrpNm}
+		     , DISP_NM_LANG = #{dispNmLang}
+		     , RGB_CD = #{rgbCd}
 		     , SUPPLY_COMP_CD = #{supplyCompCd}
 		     , DISTRIBUTION_GB = #{distributionGb}
 		     , SELF_YN = CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
@@ -617,6 +628,7 @@
 		     , PNT_MRATE10 = IFNULL(#{pntMrate10},0)
 		     , PNT_PRATE20 = IFNULL(#{pntPrate20},0)
 		     , PNT_MRATE20 = IFNULL(#{pntMrate20},0)
+		     , LOGO_FILE_NM = #{logoFileNm}
 		     , DISP_ORD = #{dispOrd}
 		     , USE_YN = #{useYn}
 		     , UPD_NO = #{updNo}

+ 122 - 17
style24.admin/src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -115,7 +115,7 @@
 							<input type="text" class="w100" name="brandCd" placeholder="자동생성" maxlength="5" readonly="readonly"/>
 							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 자사브랜드인 경우 먼저 WMS에 등록되어 있는지를 확인해야 합니다.</span>
 						</td>
-						<th>브랜드명<i class="required" title="필수"></i></th>
+						<th>브랜드명(영문/국문)<i class="required" title="필수"></i></th>
 						<td>
 							<input type="text" class="w200" name="brandEnm" placeholder="브랜드영문명" maxlength="50" required="required" data-valid-name="브랜드영문명"/> / 
 							<input type="text" class="w200" name="brandKnm" placeholder="브랜드국문명" maxlength="50" required="required" data-valid-name="브랜드국문명"/>
@@ -126,14 +126,19 @@
 						<td>
 							<input type="text" class="w200" name="brandGrpNm" maxlength="50" required="required" data-valid-name="브랜드그룹명"/>
 						</td>
+						<th>브랜드명노출언어<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="dispNmLang" value="EN" checked="checked">영문</label>
+							<label class="rdoBtn"><input type="radio" name="dispNmLang" value="KR">국문</label>
+						</td>
+					</tr>
+					<tr>	
 						<th>공급업체<i class="required" title="필수"></i></th>
 						<td>
 							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
 								<option value="">[선택]</option>
 							</select>
 						</td>
-					</tr>
-					<tr>
 						<th>유통구분<i class="required" title="필수"></i></th>
 						<td>
 							<select name="distributionGb" required="required" data-valid-name="유통구분">
@@ -141,14 +146,14 @@
 								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
+					</tr>
+					<tr>	
 						<th>출고처<i class="required" title="필수"></i></th>
 						<td>
 							<select name="delvLocCd">
 								<option value="">[선택]</option>
 							</select>
 						</td>
-					</tr>
-					<tr>
 						<th>배송비정책<i class="required" title="필수"></i></th>
 						<td>
 							<select name="delvFeeCd" required="required" data-valid-name="배송비정책">
@@ -156,10 +161,13 @@
 							</select>
 							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 변경된 배송정책은 이후 등록된 상품부터 적용됩니다.</span>
 						</td>
+					</tr>	
+					<tr>
 						<th>판매수수료율<i class="required" title="필수"></i></th>
 						<td>
 							<input type="text" class="w100 aR" name="sellFeeRate" value="0" maxlength="3" required="required" data-valid-name="판매수수료율" data-valid-type="real"/>%
 						</td>
+						<td colspan="2"></td>
 					</tr>
 					<tr>
 						<th>포인트적립율(PC정상)<i class="required" title="필수"></i></th>
@@ -181,6 +189,43 @@
 							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="real"/>%
 						</td>
 					</tr>
+					<tr>
+						<th>노출순서<i class="required" title="필수"></i></th>
+						<td class="infoTxt">
+							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>RGB코드</th>
+						<td>
+							<input type="text" class="w100 aR" name="rgbCd" maxlength="6" data-valid-name="REG코드" />
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 브랜드메인 GBN 배경색으로 적용, 미 입력시 기본색상으로 설정됩니다.</span>
+						</td>
+						<td colspan="2">
+						</td>
+					</tr>
+					<tr id="brandImgArea" class="off">
+						<th>브랜드이미지</th>
+						<td colspan="3">
+							<div class="uFile w300">
+								<input id="file" name="file" type="file" class="uFileInput w300"/>
+								<label for="file" class="uFileLabel">파일선택</label>
+								<input type="hidden" name="logoFileNm" id="logoFileNm"/>
+								<input type="hidden" name="sysFileNm" id="sysFileNm"/>
+								<input type="hidden" name="newSysFileNm" id="newSysFileNm"/>
+							</div>
+							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.default.view') + '/display/'}"/>
+							<div id="imgView" class="off">
+								<img id="bannerPreViewUrl" src="" style="height:100px"/>
+							</div>
+						</td>
+					</tr>
 					<tr id="brandMdArea" class="off">
 						<th>담당MD</th>
 						<td colspan="3" id="tdBrandMd">
@@ -205,18 +250,8 @@
 							<button type="button" class="btn btn-success btn-lg" id="btnSaveSiteBrand">전시사이트 수정</button>
 						</td>
 					</tr>
-					<tr>
-						<th>노출순서<i class="required" title="필수"></i></th>
-						<td class="infoTxt">
-							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
-						</td>
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
-							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
-						</td>
-					</tr>
+					
+					
 				</table>
 			</form>
 			
@@ -298,6 +333,9 @@
 		$("#detailForm input[name=brandCd]").val(event.data.brandCd);
 		$("#detailForm input[name=brandEnm]").val(event.data.brandEnm);
 		$("#detailForm input[name=brandKnm]").val(event.data.brandKnm);
+		$("#detailForm input:radio[name=dispNmLang]:input[value=" + event.data.dispNmLang + "]").click();
+		$("#detailForm input[name=rgbCd]").val(event.data.rgbCd);
+		$("#detailForm input[name=brandKnm]").val(event.data.brandKnm);
 		$("#detailForm input[name=brandGrpNm]").val(event.data.brandGrpNm);
 		$("#detailForm input[name=erpBrandCd]").val(event.data.erpBrandCd);
 		$("#detailForm select[name=distributionGb]").val(event.data.distributionGb);
@@ -326,6 +364,15 @@
 		$("#detailForm input:radio[name=useYn]:input[value=" + event.data.useYn + "]").click();
 		$("#detailForm input[name=dispOrd]").val(event.data.dispOrd);
 		
+		var brandImg = event.data.logoFileNm;
+		if(!gagajf.isNull(brandImg)){
+			$("#logoFileNm").val(brandImg);
+			$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+brandImg);
+			$("#imgView").removeClass("off").addClass("on");
+		}else {
+			$("#orgFileNm").val('');
+		}
+		$('#detailForm input[name=file]').closest('div').find('label').text('파일선택');
 		
 		// 담당MD 영역 노출
 		$("#brandMdArea").removeClass("off").addClass("on");
@@ -335,6 +382,9 @@
 		$("#siteArea").removeClass("off").addClass("on");
 		fnGetBrandSiteList(event.data.brandCd);
 		
+		// 로고이미지 영역 노출
+		$("#brandImgArea").removeClass("off").addClass("on");
+		
 		$("#detailForm select[name=supplyCompCd]").val(event.data.supplyCompCd);
 	}
 
@@ -607,6 +657,35 @@
 		
 		// 전시사이트 영역은 수정 시 노출
 		$("#siteArea").removeClass("on").addClass("off");
+		
+		// 로고이미지 영역은 수정 시 노출
+		$("#brandImgArea").removeClass("on").addClass("off");
+		
+	});
+	
+	//이미지 클릭시 미리보기
+	$("#bannerPreViewUrl").click(function(){
+		cfnOpenImagePreViewPopup('bannerPreimgView',$('#bannerPreViewUrl').attr('src'));
+	});
+	
+	//첨부파일 등록
+	$('#detailForm input[name=file]').on('change', function() {
+		var file = this.files[0];
+		file.name = 'test';
+		if (typeof(file) == 'undefined'){
+			return;
+		}
+		
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display'
+				, file
+				, function(result) {
+					$('#detailForm input[name=newSysFileNm]').val(result.newFileName);
+					$('#detailForm input[name=sysFileNm]').val(result.newFileName);
+					$("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+result.newFileName);
+					$("#imgView").removeClass("off").addClass("on");
+				}
+				, 'image'
+		);
 	});
 
 	// 저장
@@ -615,6 +694,32 @@
 		if (!gagajf.validation('#detailForm'))
 			return false;
 		
+		// RGB 체크
+		if (!gagajf.isNull($('#detailForm input[name=rgbCd]')) ){
+			
+			var rgbCd = $('#detailForm input[name=rgbCd]').val();
+			if (rgbCd.indexOf('#') >= 0){
+				
+				mcxDialog.alertC("'#은 입력하지 마세요.", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#detailForm input[name=rgbCd]").focus();
+					}
+				});
+				return false;
+			}
+			
+			if (rgbCd.length != 6){
+				mcxDialog.alertC("6자리로 입력해 주세요", {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$("#detailForm input[name=rgbCd]").focus();
+					}
+				});
+				return false;
+			}
+		}
+		
 		mcxDialog.confirm('저장하시겠습니까?', {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",