소스 검색

기획전 제휴채널 추가

sowon4187 5 년 전
부모
커밋
c2f20c9bc5

+ 46 - 0
src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java

@@ -139,6 +139,34 @@ public interface TsaPlanDao {
 	 */
 	void deletePlanBrand(Plan param);
 	
+	/**
+	 * 기획전 제휴채널 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void createPlanAfChannel(Plan param);
+	
+	/**
+	 * 기획전 제휴채널 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	Collection<Plan> getPlanAfChannelList(Plan param);
+	
+	/**
+	 * 기획전 제휴채널 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanAfChannel(Plan param);
+	
 	/**
 	 * 기획전 브랜드 목록
 	 *
@@ -290,6 +318,15 @@ public interface TsaPlanDao {
 	 */
 	void createPlanCustGb(Plan param);
 	
+	/**
+	 * 기획전 회원구분 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanCustGb(Plan param);
+	
 	/**
 	 * 기획전 회원등급 등록
 	 *
@@ -299,6 +336,15 @@ public interface TsaPlanDao {
 	 */
 	void createPlanCustGrade(Plan param);
 	
+	/**
+	 * 기획전 회원등급 삭제
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	void deletePlanCustGrade(Plan param);
+	
 	/**
 	 * 기획전 회원구분 조회
 	 *

+ 67 - 1
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -88,6 +88,15 @@ public class TsaPlanService {
 			planDao.createPlanCate(plan);
 		}
 		
+		String[] channel = param.getMultiChannel();
+		// 기획전 제휴채널 insert
+		for (int j = 0; j < channel.length; j++) {
+			plan.setAfChannel(channel[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanAfChannel(plan);
+		}
+		
 		// 기획전 회원구분 insert
 		String[] custGb = param.getUsableCustGbArr();
 		for (int j = 0; j < custGb.length; j++) {
@@ -297,7 +306,7 @@ public class TsaPlanService {
 			planDao.createPlanCate(plan);
 		}
 		
-		// 기존 기획전 카테고리 삭제
+		// 기존 기획전 브랜드 삭제
 		for (int i = 0; i < param.getMultiBrand().length; i++) {
 			planDao.deletePlanBrand(param);;
 		}
@@ -313,6 +322,50 @@ public class TsaPlanService {
 			planDao.createPlanBrand(plan);
 		}
 		
+		// 기존 기획전 제휴채널 삭제
+		for (int i = 0; i < param.getMultiChannel().length; i++) {
+			planDao.deletePlanAfChannel(param);
+		}
+		
+		
+		String[] channel = param.getMultiChannel();
+		// 기획전 제휴채널 insert
+		for (int j = 0; j < channel.length; j++) {
+			plan.setAfChannel(channel[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanAfChannel(plan);
+		}
+		
+		//기존 회원구분 삭제
+		for (int i = 0; i < param.getUsableCustGbArr().length; i++) {
+			planDao.deletePlanCustGb(param);
+		}
+		
+		
+		// 기획전 회원구분 insert
+		String[] custGb = param.getUsableCustGbArr();
+		for (int j = 0; j < custGb.length; j++) {
+			plan.setCustGb(custGb[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGb(plan);
+		}
+		
+		//기존 회원등급 삭제
+		for (int i = 0; i < param.getUsableCustGradeArr().length; i++) {
+			planDao.deletePlanCustGrade(param);
+		}
+		
+		// 기획전 회원등급 insert
+		String[] custGrade = param.getUsableCustGradeArr();
+		for (int j = 0; j < custGrade.length; j++) {
+			plan.setCustGrade(custGrade[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGrade(plan);
+		}
+		
 		// 최종업데이트 
 		planDao.updatePlanInfo(param);
 
@@ -417,6 +470,19 @@ public class TsaPlanService {
 		return planDao.getPlanCateList(param);
 	}
 	
+
+	/**
+	 * 기획전 제휴채널 목록
+	 *
+	 * @param 
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 4
+	 */
+	public Collection<Plan> getPlanAfChannelList(Plan param){
+		return planDao.getPlanAfChannelList(param);
+	}
+	
 	/**
 	 * 기획전 코너 목록 조회
 	 *

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

@@ -151,6 +151,9 @@ public class Plan extends TscBaseDomain{
 		private String pageYn;				// 페이징 사용 여부
 		private String changeGb;			// 순서변경 updown 구분
 		private int stockQtySum;			// 재고
+		private String afLinkCd;			// 제휴채널
+		private String afChannel;			// 제휴채널 공통코드
+		private String afLinkNm;			// 제휴채널 명
 
 		// 기획전 팝업
 		private String callBackFun;			// 콜백함수명
@@ -182,6 +185,9 @@ public class Plan extends TscBaseDomain{
 		private String[] multiPlanCoupon;		//쿠폰목록
 		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 		private String[] multiPlanFile;			//이미지목록
+		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+		private String[] multiChannel;			//제휴채널목록
+		
 
 		
 		// 템플릿 저장하기 위한 임시 변수

+ 51 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -446,6 +446,31 @@
 		WHERE PLAN_SQ = ${planSq}
 	</delete>
 	
+	<insert id="createPlanAfChannel" parameterType="Plan">
+		/* TsaPlan.createPlanAfChannel */
+		INSERT INTO TB_PLAN_AF_CHANNEL
+			(
+				PLAN_SQ
+			  , AF_CHANNEL
+			  , REG_NO
+			  , REG_DT
+			)
+		VALUES
+		   (
+			    #{planSq}
+			  , #{afChannel}
+			  , #{regNo}
+			  , CURRENT_TIMESTAMP
+		   )
+	</insert>
+	
+	<delete id="deletePlanAfChannel" parameterType="Plan">
+		/* TsaPlan.deletePlanAfChannel */
+		DELETE 
+		FROM TB_PLAN_AF_CHANNEL
+		WHERE PLAN_SQ = ${planSq}
+	</delete>
+	
 	<select id="getPlanBrandList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.getPlanBrandList */
 		SELECT TP.PLAN_NM AS PLAN_NM
@@ -463,6 +488,18 @@
 		    AND TP.DEL_YN = 'N'
 	</select>
 	
+	<select id="getPlanAfChannelList" parameterType="Plan" resultType="Plan">
+			SELECT A.PLAN_SQ 
+			      ,A.AF_CHANNEL AS afLinkCd
+			      ,B.AF_LINK_NM  
+			      ,A.REG_DT 
+			      ,B.FEE_RATE 
+			      ,B.DISP_ORD 
+			      ,B.AF_CHANNEL 
+			FROM TB_PLAN_AF_CHANNEL A LEFT JOIN tb_af_link B ON A.AF_CHANNEL = B.AF_LINK_CD 
+			WHERE PLAN_SQ = #{planSq}
+	</select>
+	
 	<insert id="createPlanBrandCopy" parameterType="Plan">
 		/* TsaPlan.createPlanBrandCopy */
 			INSERT INTO
@@ -872,6 +909,13 @@
 					  )
 	</insert>
 	
+	<delete id="deletePlanCustGb" parameterType="Plan">
+		/* TsaPlan.deletePlanCustGb */
+		DELETE 
+		FROM TB_PLAN_CUST_DIVISION
+		WHERE PLAN_SQ= #{planSq}
+	</delete>
+	
 	<insert id="createPlanCustGrade" parameterType="Plan">
 		/* TsaPlan.createPlanCustGrade */
 		INSERT INTO TB_PLAN_CUST_GRADE
@@ -889,6 +933,13 @@
 				 )
 	</insert>
 	
+	<delete id="deletePlanCustGrade" parameterType="Plan">
+		/* TsaPlan.deletePlanCustGrade */
+		DELETE 
+		FROM TB_PLAN_CUST_GRADE
+		WHERE PLAN_SQ= #{planSq}
+	</delete>
+	
 	<select id="getPlanCustGbList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.createPlanCustGrade */
 		SELECT CUST_GB 

+ 118 - 44
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -140,9 +140,17 @@
 					<tr>
 						<th>제휴채널<em class="required" title="필수"></em></th>
 						<td colspan="3">
-							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
-								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
+							<!-- 수정시 프로모션명 입력 : before -->
+							<div class="padding10"	style="display: inline-block; width: 49%;">
+								<!--<span>공급업체 설정</span>-->
+								<div class="padding10 inner-tb-solid">
+									<span class="buttonSpan">
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddAf">제휴채널 추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg"id="btnDeleteAf">선택삭제</button>
+									</span> <br />
+									<div id="gridAfPlanList" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+								</div>
+							</div>
   						</td>
 						
 					</tr>
@@ -472,9 +480,17 @@
 					<tr>
 						<th>제휴채널<em class="required" title="필수"></em></th>
 						<td colspan="3">
-							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
-								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
+							<!-- 수정시 프로모션명 입력 : before -->
+							<div class="padding10"	style="display: inline-block; width: 49%;">
+								<!--<span>공급업체 설정</span>-->
+								<div class="padding10 inner-tb-solid">
+									<span class="buttonSpan">
+										<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddAf">제휴채널 추가</button>
+										<button type="button" class="btn btnRight btn-success btn-lg"id="btnDeleteAf">선택삭제</button>
+									</span> <br />
+									<div id="gridAfPlanList" style="width: 100%; height: 200px;" class="ag-theme-balham"></div>
+								</div>
+							</div>
   						</td>
 					</tr>
 					<tr>
@@ -629,8 +645,38 @@
 	var planCateList = [[${planCateList}]];
 	var custGbList = [[${gbList}]];
 	var custGradeList =	[[${gradeList}]]; 
+	var afChannelList = [[${afChannelList}]]; 
 	var snOptions;
 
+	let useYnList = { "Y":"Yes", "N":"No" };
+	let channelName = {"G053_01":"직접","G053_02":"네이버","G053_03":"다음","G053_04":"크리데오","G053_05":"카카오","G053_06":"인스타그램","G053_07":"페이스북","G053_08":"구글"
+			          ,"G053_09":"바이럴","G053_10":"모비온","G053_11":"YES24","G053_12":"한세드림"}
+	
+	let columnAfDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴채널코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴채널명", field: "afLinkNm", width: 180,
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "상위제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(channelName) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(channelName, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(channelName, params.newValue); }	
+		}
+
+	];
+	
+	// 제휴채널 그리드 설정
+	var gridOptionsAfList = gagaAgGrid.getGridOptions(columnAfDefs);
+	gridOptionsAfList.rowSelection = "multiple";
+	gridOptionsAfList.suppressRowClickSelection = true;
+	
+    
+    
 	// 카테고리 전시 여부
 	var fnCataCheck = function(is, formId) {
 		if (is.checked) {
@@ -724,7 +770,7 @@
 					}
 				}
 			}
-	}else{
+	}else if($('#planUpdateForm select[name=replyYn]').val()=='N'){
 		$("#append1").css('display','none');
 		$("#append2").css('display','none');
 		$("#append3").css('display','none');
@@ -762,6 +808,10 @@
 				}
 			}
 		}
+	}else{
+		$("#append1").css('display','none');
+		$("#append2").css('display','none');
+		$("#append3").css('display','none');
 	}
 	
 	
@@ -905,17 +955,13 @@
 			multiCate.push(item.cateNo);
 		});
 		
-		var usableCustGradeArr = [];
-		var chkCustGrade = $('#planRegisterForm input:checkbox[name=usableCustGradeArr]:checked');
-		for(let i=0; i< chkCustGrade.length; i++){
-			usableCustGradeArr.push(chkCustGrade.eq(i).val());
-		}
+		let allChannelData = gagaAgGrid.getAllRowData(gridOptionsAfList);
+		var multiChannel = [];
+		$.each(allChannelData, function(idx, item) {
+			multiChannel.push(item.afLinkCd);
+		});
 		
-		var usableCustGbArr = [];
-		var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
-		for(let i=0; i< chkCustGb.length; i++){
-			usableCustGbArr.push(chkCustGb.eq(i).val());
-		}
+	
 		
 		// 기획전 등록
 		if (formId == '#planRegisterForm') {
@@ -923,6 +969,17 @@
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
+					var usableCustGradeArr = [];
+					var chkCustGrade = $('#planRegisterForm input:checkbox[name=usableCustGradeArr]:checked');
+					for(let i=0; i< chkCustGrade.length; i++){
+						usableCustGradeArr.push(chkCustGrade.eq(i).val());
+					}
+					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
 					
 					let data = {
 							 multiBrand : multiBrand
@@ -931,6 +988,7 @@
 							,CateList : allCateData
 							,usableCustGradeArr : usableCustGradeArr
 							,usableCustGbArr : usableCustGbArr
+							,multiChannel : multiChannel
 						    ,mode : $('#planRegisterForm input[name=mode]').val()
 						    ,planSq : $('#planRegisterForm input[name=planSq]').val()
 							,planGb	: $('#planRegisterForm select[name=planGb]').val()
@@ -974,12 +1032,25 @@
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
+					var usableCustGradeArr = [];
+					var chkCustGrade = $('#planUpdateForm input:checkbox[name=usableCustGradeArr]:checked');
+					for(let i=0; i< chkCustGrade.length; i++){
+						usableCustGradeArr.push(chkCustGrade.eq(i).val());
+					}
 					
+					var usableCustGbArr = [];
+					var chkCustGb = $('#planUpdateForm input:checkbox[name=usableCustGbArr]:checked');
+					for(let i=0; i< chkCustGb.length; i++){
+						usableCustGbArr.push(chkCustGb.eq(i).val());
+					}
 					let data = {
 							 multiBrand : multiBrand
 							,brandList : allBrandData
 							,multiCate : multiCate
+							,multiChannel : multiChannel
 							,CateList : allCateData
+							,usableCustGradeArr : usableCustGradeArr
+							,usableCustGbArr : usableCustGbArr
 						    ,mode : $('#planUpdateForm input[name=mode]').val()
 						    ,planSq : $('#planUpdateForm input[name=planSq]').val()
 							,planGb	: $('#planUpdateForm select[name=planGb]').val()
@@ -1105,9 +1176,6 @@
 		{headerName: "브랜드그룹명", field: "brandGroupKnm", width: 120, cellClass: 'text-center'},
 		{headerName: "브랜드영문명", field: "brandGroupEnm", width: 150, cellClass: 'text-center'},
 		{headerName: "", field: "brandKnm", width: 150, cellClass: 'text-center'},
-		/* {headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "시퀀스", field: "tmtbGoodsSq", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "삭제여부", field: "delYn", width: 150, cellClass: 'text-center', hide: true}  */
 	];
 	
 	// 브랜드 그리드 설정
@@ -1163,7 +1231,7 @@
     	gridOptionsFGCateList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsFGCateList)});
     });
 	
-	
+
 	
 	// 카테고리 추가
 	$('#btnAddCate').on('click' , function () {
@@ -1194,7 +1262,34 @@
 		}
 	}
 	
+	// 제휴채널 추가
+	$('#btnAddAf').on('click' , function () {
+		cfnOpenAfChannelPopup("callBackAf");
+	});
 	
+	// 제휴채널 콜백
+	var callBackAf = function(result) {
+		// 기존 리스트 데이터 for
+		for(let i = 0 ; i < result.length ; i++) {
+			let addChk = true, gridListValue = gagaAgGrid.getAllRowData(gridOptionsAfList);		// 받아온 모든 데이터
+
+			// 받아온 data for
+			for(let j = 0 ; j < gridListValue.length ; j++) {
+				// 동일한 data는 추가하지 않음
+				if(gridListValue[j].afLinkCd == result[i].afLinkCd) {	addChk = false;	}		// 중복체크
+			}
+
+			// 중복되지 않은 데이터 리스트에 추가
+			if(addChk) {
+				gagaAgGrid.addRowData(gridOptionsAfList, {"afLinkCd":result[i].afLinkCd , "afLinkNm":result[i].afLinkNm, "afChannel":result[i].afChannel});
+			}
+		}
+	}
+	
+	// 제츄채널 선택삭제 버튼 클릭시
+    $('#btnDeleteAf').on('click', function() {
+    	gridOptionsAfList.api.updateRowData({remove:gagaAgGrid.selectedRowData(gridOptionsAfList)});
+    });
 
 	$(document).ready(function() {
 		
@@ -1207,22 +1302,12 @@
 		// 그리드 그리기
 		gagaAgGrid.createGrid("gridFGBrandList", gridOptionsFGBrandList);
 		gagaAgGrid.createGrid("gridFGCateList", gridOptionsFGCateList);
+		gagaAgGrid.createGrid("gridAfPlanList", gridOptionsAfList);
 		
 		 if (mode =='U') {
-			/* $('#planDetailForm input[name=badgeFcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			});
-
-			$('#planDetailForm input[name=badgeBcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			}); */
-			
 			gridOptionsFGBrandList.api.setRowData(planBrandList);
 			gridOptionsFGCateList.api.setRowData(planCateList);
+			gridOptionsAfList.api.setRowData(afChannelList);
 
 			if (planInfo.goodsLimitYn == 'N') {
 				$('#planDetailForm input[name=goodsLimitQty]').hide();
@@ -1238,17 +1323,6 @@
 			}
 
 		} else {
-			/* $('#planRegisterForm input[name=badgeFcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			});
-
-			$('#planRegisterForm input[name=badgeBcolor]').spectrum({
-				preferredFormat: "hex",
-				showInput: true,
-				allowEmpty: true
-			}); */
 
 			$("#viewStartDtNew").val(_today);
 			$("#viewEndDtNew").val(_today);

+ 4 - 4
src/main/webapp/WEB-INF/views/marketing/PlanListForm.html

@@ -97,9 +97,9 @@
 			</table>
 
 			<ul class="panelBar">
-				<li class="center"><input type="button" value="초기화"
-					class="btn btn-gray btn-lg" id="btnInit" /> <input type="button"
-					value="조회" class="btn btn-base btn-lg" id="btnSearch" /></li>
+				<li class="center"><input type="button" value="초기화" class="btn btn-gray btn-lg" id="btnInit" /> 
+				<input type="button" value="조회" class="btn btn-base btn-lg" id="btnSearch" />
+				</li>
 			</ul>
 	</div>
 
@@ -361,7 +361,7 @@
 		$("#planListSearchForm input[name=pageNo]").val('1');
 		fnPlanListSearch($("#planListSearchForm input[name=searchGb]").val());
 	});
-	
+
 	
 	$(document).ready(function() {
 

+ 7 - 5
src/main/webapp/WEB-INF/views/marketing/PlanPopupForm.html

@@ -44,11 +44,13 @@
 					<tbody>
 						<tr>
 							<th>사이트</th>
-						 	<td><label th:if="${siteList}"
-								th:each="oneData, status : ${siteList}"> <input
-									type="checkbox" name="siteCds" th:value="${oneData.cd}"
-									th:text="${oneData.cdNm}" />
-							</label></td>
+							<td><select name="siteCd">
+									<th:block th:if="${siteList}"
+										th:each="oneData, status : ${siteList}">
+										<option th:value="${oneData.cd}"
+											th:text="${oneData.cdNm}"></option>
+									</th:block>
+							</select></td>
 
 							<th>기획전명</th>
 							<td><input type="text" name="planNm" id="planNm" /></td>

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

@@ -219,7 +219,7 @@
 <table class="frmStyle" style="display: none;" id="rowQuestion">
 	<tr id="trRowQuestion">
 	<td>
-		<input type="checkbox" name="chkIdx" style="margin-left: 10px; top: 50%;  left: 0;  width: 18px; height: 18px; transform: translate(0,-50%);"/>
+		<input type="checkbox" name="chkIdx" style="top: 50%; width: 18px; height: 18px;"/>
 		<input type="hidden" name="crud" value="C"/>
 		<input type="hidden" name="pollQsq" value=""/>
 	</td>