Kaynağa Gözat

Merge remote-tracking branch '112.172.147.34/style' into 제휴몰검색기능

jsh77b 4 yıl önce
ebeveyn
işleme
725c1201cb
20 değiştirilmiş dosya ile 553 ekleme ve 85 silme
  1. 11 7
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  2. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaShoplinkerDao.java
  3. 22 10
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  4. 18 2
      src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java
  5. 3 3
      src/main/java/com/style24/admin/biz/service/TsaStockService.java
  6. 115 0
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  7. 19 3
      src/main/java/com/style24/admin/biz/web/TsaOcmController.java
  8. 17 1
      src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java
  9. 11 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  10. 25 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml
  11. 2 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaStock.xml
  12. 176 4
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  13. 31 3
      src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  14. 2 0
      src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html
  15. 10 5
      src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html
  16. 15 0
      src/main/webapp/WEB-INF/views/goods/GoodsListForm.html
  17. 14 4
      src/main/webapp/WEB-INF/views/goods/GoodsPriceReservePopupForm.html
  18. 6 0
      src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderDetailForm.html
  19. 34 30
      src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html
  20. 13 11
      src/main/webapp/WEB-INF/views/stock/GoodsSizeStockForm.html

+ 11 - 7
src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java

@@ -1,5 +1,9 @@
 package com.style24.admin.biz.dao;
 
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
@@ -7,17 +11,11 @@ import com.style24.persistence.domain.CustContactHst;
 import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
-import com.style24.persistence.domain.Delivery;
 import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 
-import org.springframework.stereotype.Repository;
-
-import java.util.Collection;
-
-
 /**
  * 회원 Dao
  * 
@@ -62,7 +60,6 @@ public interface TsaCustomerDao {
 	 */
 	void updateCustomerCellPhnno(Customer customer);
 
-
 	/**
 	 * 회원 주문내역
 	 * @param customerSearch - 고객번호
@@ -216,5 +213,12 @@ public interface TsaCustomerDao {
 	 */
 	int getCustomerFindByCellPhone(CustomerSearch customerSearch);
 
+	/**
+	 * 휴대전화번호와 CI 삭제
+	 * @param customer - 고객 정보
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	void deleteCellPhnno(Customer customer);
 
 }

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

@@ -240,4 +240,13 @@ public interface TsaShoplinkerDao {
 	 */
 	Collection<GagaMap> getInvoiceExcelList(ShoplinkerInvoice shoplinkerInvoice);
 
+	/**
+	 * 샵링커 주문수집 목록 - 제휴몰업로드 메모 저장 
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 11. 17
+	 */
+	void updateExtmallUploadMemo(ExtmallOrder extmallOrder);
 }

+ 22 - 10
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -1,7 +1,12 @@
 package com.style24.admin.biz.service;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.security.GagaPasswordEncoder;
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.style24.admin.biz.dao.TsaCustomerDao;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.service.TscCustomerService;
@@ -19,13 +24,11 @@ import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
+
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collection;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.security.GagaPasswordEncoder;
 
 /**
  * 회원 Service
@@ -60,7 +63,7 @@ public class TsaCustomerService {
 	 * @since 2021. 2. 01
 	 */
 	public int getCustomerActiveListCount(CustomerSearch customerSearch) {
-		return  customerDao.getCustomerActiveListCount(customerSearch);
+		return customerDao.getCustomerActiveListCount(customerSearch);
 	}
 
 	/**
@@ -276,7 +279,7 @@ public class TsaCustomerService {
 	 * @author jsshin
 	 * @since 2021. 1. 25
 	 */
-	public Point getCustomerPoint(Integer custNo){
+	public Point getCustomerPoint(Integer custNo) {
 		return customerDao.getCustomerPoint(custNo);
 	}
 
@@ -496,6 +499,15 @@ public class TsaCustomerService {
 		return coreCustomerService.deleteSecedeCustomer(custNo);
 	}
 
-
+	/**
+	 * 휴대전화번호와 CI 삭제
+	 * @param customer - 고객 정보
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteCellPhnno(Customer customer) {
+		customerDao.deleteCellPhnno(customer);
+	}
 
 }

+ 18 - 2
src/main/java/com/style24/admin/biz/service/TsaShoplinkerService.java

@@ -8,6 +8,7 @@ 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 com.gagaframework.excel.GagaExcelUtil;
 import com.gagaframework.excel.env.GagaExcelConstants;
@@ -1091,12 +1092,12 @@ public class TsaShoplinkerService {
 		// 헤더 title 설정
 		String[] listTitles = { "제휴몰주문등록상태", "실패사유", "업로드실패사유", "스타일24 주문번호", "샵링커 주문번호", "쇼핑몰 주문번호", "배송번호", "쇼핑몰 명", "배송상태[발주확인]"
 				,"주문 상품번호", "샵링커 상품번호", "자사 상품코드", "상품명", "주문수량", "주문금액", "판매단가", "공급가"
-				, "옵션코드", "옵션명", "옵션1", "옵션2", "교환접수여부", "주문수집일자", "제휴몰등록일", "등록자"};
+				, "옵션코드", "옵션명", "옵션1", "옵션2", "교환접수여부", "주문수집일자", "제휴몰등록일", "등록자", "CS메모", "CS메모수정일시"};
 
 		// DB 처리 시 사용되는 파라미터명(셀명) 설정
 		String[] cellNames = {"UPLOAD_STAT", "UPLOAD_FAIL_CD", "UPLOAD_FAIL_REASON", "ORD_NO", "SHOPLINKER_ORDER_ID", "MALL_ORDER_ID", "SHIP_NO", "MALL_NAME", "BAESONG_STATUS"
 				, "ORDER_PRODUCT_ID", "SHOPLINKER_PRODUCT_ID", "PARTNER_PRODUCT_ID", "PRODUCT_NAME", "QUANTITY", "ORDER_PRICE", "SALE_PRICE", "SUPPLY_PRICE"
-				, "SKU_MATCH_CODE", "SKU", "OPT_CD1", "OPT_CD2", "EXCHANGE_ORDER_YN", "ORDER_REG_DATE", "EXTMALL_REG_DT", "REG_NM"};
+				, "SKU_MATCH_CODE", "SKU", "OPT_CD1", "OPT_CD2", "EXCHANGE_ORDER_YN", "ORDER_REG_DATE", "EXTMALL_REG_DT", "REG_NM", "CS_MEMO", "CS_MEMO_UPD_DT"};
 
 		String[] cellTypes = {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
@@ -1111,6 +1112,7 @@ public class TsaShoplinkerService {
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name()};
 
 		shoplinkerOrder.setExcelDownType("1");
@@ -1461,4 +1463,18 @@ public class TsaShoplinkerService {
 
         return resultQty;
     }
+	
+	/**
+	 * 샵링커 주문수집 목록 - 제휴몰업로드 메모 저장 
+	 *
+	 * @param extmallOrder
+	 * @return
+	 * @author jmh
+	 * @since 2021. 11. 17
+	 */
+	@Transactional("shopTxnManager")
+	public void updateExtmallUploadMemo(ExtmallOrder extmallOrder) {
+		admShoplinkerDao.updateExtmallUploadMemo(extmallOrder);
+	}
+	
 }

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

@@ -87,18 +87,18 @@ public class TsaStockService {
 	 */
 	public void getGoodsSizeStockExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
 		// 헤더 title 설정
-		String[] listTitles = {"브랜드명","상품명", "품목", "상품상태", "상품코드",  "옵션코드", "색상" , "사이즈", "품절여부",
+		String[] listTitles = {"브랜드명","상품명", "품목", "상품상태", "상품코드",  "옵션코드", "색상" , "사이즈", "SKUModelNo(WMS)", "품절여부",
 			"재고", "안전재고","출고대기", "판매가능재고"};
 
 		// DB 처리 시 사용되는 파라미터명(셀명) 설정
-		String[] cellNames = { "BRAND_ENM", "GOODS_NM", "ITEMKIND_NM","GOODS_STAT_NM","GOODS_CD", "OPT_CD", "OPT_CD1","OPT_CD2", "SOLDOUT_YN",
+		String[] cellNames = { "BRAND_ENM", "GOODS_NM", "ITEMKIND_NM","GOODS_STAT_NM","GOODS_CD", "OPT_CD", "OPT_CD1","OPT_CD2", "SKU_MODEL_NO", "SOLDOUT_YN",
 			"CURR_STOCK_QTY", "BASE_STOCK_QTY", "SALE_STOCK_QTY", "ABLE_STOCK_QTY"};
 
 		String[] cellTypes = {GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
 			GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
 			GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name()
 		};

+ 115 - 0
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -20,8 +20,11 @@ import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.service.TscAnswerPhaseService;
+import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.biz.service.TscKakaotalkService;
+import com.style24.core.biz.service.TscKcpService;
 import com.style24.core.biz.service.TscMailService;
+import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.session.TscSession;
@@ -30,6 +33,7 @@ import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.AnswerPhase;
 import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.CustContactHst;
 import com.style24.persistence.domain.CustDeliveryAddr;
 import com.style24.persistence.domain.CustGrade;
@@ -78,6 +82,15 @@ public class TsaCustomerController extends TsaBaseController {
 	@Autowired
 	private TscMailService mailService;
 
+	@Autowired
+	private TscCustomerService coreCustomerService;
+
+	@Autowired
+	private TscOrderChangeService coreOrderChangeService;
+
+	@Autowired
+	private TscKcpService coreKcpService;
+
 	/**
 	 * 1:1문의관리 화면
 	 * @return
@@ -546,6 +559,9 @@ public class TsaCustomerController extends TsaBaseController {
 		// 상품권유형
 		mav.addObject("giftCardOccurGbList", rendererService.getCommonCodeList("G074"));
 
+		// 은행
+		mav.addObject("bankList", rendererService.getCommonCodeList("G940"));
+
 		mav.addObject("custNo", custNo);
 
 		mav.setViewName("customer/CustomerDetailForm");
@@ -1353,4 +1369,103 @@ public class TsaCustomerController extends TsaBaseController {
 		return mav;
 	}
 
+	/**
+	 * 계좌정보 조회
+	 * @return custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@GetMapping("/account/info/{custNo}")
+	@ResponseBody
+	public CustAccount getCustomerAccuontInfo(@PathVariable Integer custNo) {
+		return coreCustomerService.getCustomerAccuontInfo(custNo);
+	}
+
+	/**
+	 * 계좌정보 삭제
+	 * @return custNo - 고객번호
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@PostMapping("/account/delete/{custNo}")
+	@ResponseBody
+	public GagaResponse deleteCustomerAccuont(@PathVariable Integer custNo) {
+		// 환불계좌 삭제
+		coreOrderChangeService.deleteRefundAccount(custNo);
+
+		// 고객이력 생성
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setRegNo(TsaSession.getInfo().getUserNo());
+		coreCustomerService.createCustomerHistory(customer);
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 계좌인증
+	 * @return GagaMap - 결과
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@PostMapping("/account/check")
+	@ResponseBody
+	public GagaMap getAccountCheck(@RequestBody CustAccount custAccount) {
+		boolean isValid = false;
+		GagaMap result = coreKcpService.checkAccount(custAccount);
+		if ("0000".equals(result.get("resCd"))) {
+			isValid = true;
+		}
+		result.setBoolean("isValid", isValid);
+		return result;
+	}
+
+	/**
+	 * 계좌등록
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@PostMapping("/account/create")
+	@ResponseBody
+	public GagaResponse createAccount(@RequestBody CustAccount custAccount) {
+		// 계좌등록
+		Order refundAccount = new Order();
+		refundAccount.setCustNo(custAccount.getCustNo());
+		refundAccount.setBankCd(custAccount.getBankCd());
+		refundAccount.setAccountNo(custAccount.getAccountNo());
+		refundAccount.setAccountNm(custAccount.getAccountNm());
+		refundAccount.setRegNo(TsaSession.getInfo().getUserNo());
+		refundAccount.setUpdNo(TsaSession.getInfo().getUserNo());
+		refundAccount.encryptData();
+		coreOrderChangeService.saveRefundAccount(refundAccount);
+
+		// 고객이력 생성
+		Customer customer = new Customer();
+		customer.setCustNo(custAccount.getCustNo());
+		customer.setRegNo(TsaSession.getInfo().getUserNo());
+		coreCustomerService.createCustomerHistory(customer);
+
+		return super.ok("계좌가 등록되었습니다.");
+	}
+
+	/**
+	 * 휴대전화번호와 CI 삭제
+	 * @return GagaMap - 결과
+	 * @author gagamel
+	 * @since 2021. 11. 22
+	 */
+	@PostMapping("/cellphnno/delete")
+	@ResponseBody
+	public GagaResponse deleteCellPhnno(@RequestBody Customer customer) {
+		customer.setUpdNo(TsaSession.getInfo().getUserNo());
+		customerService.deleteCellPhnno(customer);
+
+		// 고객이력 생성
+		customer.setRegNo(TsaSession.getInfo().getUserNo());
+		coreCustomerService.createCustomerHistory(customer);
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
 }

+ 19 - 3
src/main/java/com/style24/admin/biz/web/TsaOcmController.java

@@ -353,10 +353,20 @@ public class TsaOcmController extends TsaBaseController {
 		String resultMsg = "";
 		int userNo = TsaSession.getInfo().getUserNo();
 		int wateCnt = orderOcmService.getExtmallOrderExceluploadWateCnt(userNo);
-		if( 0 == wateCnt) {
+		int uploadTmpCnt = orderOcmService.getExtmallOrderExceluploadTmpCnt(userNo);	// 엑셀업로드건수
+		if( 0 == wateCnt && 0 < uploadTmpCnt) {
+			// 주문등록 시작된 시간 기록(세션이 살아있는 동안 결과페이지에서 이 시간 기준으로 등록된 데이터 보여주기 위함)
+			TsaSession.setAttribute("extmallOrdDtTime", GagaDateUtil.getTodayDateTime());
+			
 			resultMsg = orderOcmService.saveExtmallorder(extmallOrder);
+			
+			orderOcmService.deleteExtmallOrderUploadTmpList(userNo);
 		}else {
-			resultMsg = "자신이 먼저 업로드한 건이 현재 처리중입니다. 완료 된 후 진행해주세요. (남은 대기건 수: " + wateCnt+")";
+			if( 0 == uploadTmpCnt ) {
+				resultMsg = "엑셀업로드를 먼저 진행해주세요.";
+			}else {
+				resultMsg = "자신이 먼저 업로드한 건이 현재 처리중입니다. 완료 된 후 진행해주세요. (남은 대기건 수: " + wateCnt+")";
+			}
 		}
 		
 		return super.ok(resultMsg);
@@ -375,7 +385,13 @@ public class TsaOcmController extends TsaBaseController {
 	public Collection<ExtmallOrder> getExtmallOrderUploadSecondList() {
 		ExtmallOrder extmallOrder = new ExtmallOrder();
 		extmallOrder.setRegNo(TsaSession.getInfo().getUserNo());
-
+		extmallOrder.setResultDtTime(TsaSession.getAttribute("extmallOrdDtTime"));	// 마지막 주문등록된 시작시간
+		
+		if( StringUtils.isBlank(TsaSession.getAttribute("extmallOrdDtTime"))) {
+			TsaSession.setAttribute("extmallOrdDtTime", GagaDateUtil.getTodayDateTime());	// 조회안되도록
+			extmallOrder.setResultDtTime(TsaSession.getAttribute("extmallOrdDtTime"));
+		}
+		
 		return orderOcmService.getExtmallOrderUploadSecondList(extmallOrder);
 	}
 

+ 17 - 1
src/main/java/com/style24/admin/biz/web/TsaShoplinkerController.java

@@ -44,6 +44,7 @@ import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.CommonCode;
 import com.style24.persistence.domain.Extmall;
+import com.style24.persistence.domain.ExtmallOrder;
 import com.style24.persistence.domain.ShoplinkerGoods;
 import com.style24.persistence.domain.ShoplinkerInvoice;
 import com.style24.persistence.domain.ShoplinkerOrder;
@@ -905,7 +906,22 @@ log.info(" #### SHOPLINKER CHKE 1 - "+runMap.getRunCnt()+" | "+runMap.getSidOver
 		return runMap;
 	}
 
-
+	/**
+	 * 샵링커 주문수집 목록 - 제휴몰업로드 메모 저장 
+	 * 
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author jmh
+	 * @since 2021. 11. 17
+	 */
+	@PostMapping("/extmall/order/memo/save")
+	@ResponseBody
+	public GagaResponse updateExtmallUploadMemoSave(@RequestBody ExtmallOrder extmallOrder) {
+		admShoplinkerService.updateExtmallUploadMemo(extmallOrder);
+		
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
 
 	/*
 	 *

+ 11 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -907,5 +907,16 @@
 		) B
 		WHERE NUMB = 1
 	</select>
+	
+	<!-- 휴대전화번호와 CI 삭제 -->
+	<update id="deleteCellPhnno" parameterType="Customer">
+		/* TsaCustomer."deleteCellPhnno" */
+		UPDATE TB_CUSTOMER
+		SET    CELL_PHNNO = NULL
+		     , CI = NULL
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CUST_NO = #{custNo}
+	</update>
 
 </mapper>

+ 25 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsaShoplinker.xml

@@ -564,7 +564,11 @@
 		WHERE RANKING = 1
 	</select>
 
-	<!-- 샵링커주문수집-목록 -->
+	<!-- 
+		샵링커주문수집-목록
+		※ 원래 샵링커 주문목록만 보여주고 있었으나, 오픈 후 엑셀업로드도 보여달라고 요청 옴. => 메뉴를 나누는게 맞으나 이곳에 같이 넣어달라고 하였음.
+		TB_EXTMALL_ORDER_UPLOAD만 바라보는 메뉴가 있는게 쿼리(성능)나 이력 확인용으로 맞음 
+	-->
 	<select id="getShoplinkerOrderList" parameterType="ShoplinkerOrder" resultType="ShoplinkerOrder">
 		/* TsaShoplinker.getShoplinkerOrderList */
 		SELECT * FROM
@@ -620,6 +624,8 @@
 				, B.DELV_ADDR_SQ
 				, B.REG_DT AS EXTMALL_REG_DT
 				, FN_GET_USER_NM(ifnull(B.REG_NO, 99999)) AS REG_NM
+				, B.CS_MEMO
+				, B.CS_MEMO_UPD_DT
 				
 				, OP.OPT_CD1 
 				, OP.OPT_CD2 
@@ -682,6 +688,8 @@
 				, B.DELV_ADDR_SQ
 				, B.REG_DT AS EXTMALL_REG_DT
 				, FN_GET_USER_NM(B.REG_NO) AS REG_NM 
+				, B.CS_MEMO
+				, B.CS_MEMO_UPD_DT
 				
 				, OP.OPT_CD1 
 				, OP.OPT_CD2 
@@ -851,6 +859,8 @@
 				, B.DELV_ADDR_SQ
 				, B.REG_DT AS EXTMALL_REG_DT
 				, FN_GET_USER_NM(ifnull(B.REG_NO, 99999)) AS REG_NM
+				, B.CS_MEMO
+				, B.CS_MEMO_UPD_DT
 				
 				, OP.OPT_CD1 
 				, OP.OPT_CD2 
@@ -913,6 +923,8 @@
 				, B.DELV_ADDR_SQ
 				, B.REG_DT AS EXTMALL_REG_DT
 				, FN_GET_USER_NM(B.REG_NO) AS REG_NM 
+				, B.CS_MEMO
+				, B.CS_MEMO_UPD_DT
 				
 				, OP.OPT_CD1 
 				, OP.OPT_CD2 
@@ -1181,7 +1193,18 @@
 	            </choose>
 	        </if>
 	</sql>
-
+	
+	<!-- 샵링커 주문수집 목록 - 제휴몰업로드 메모 저장 
+	※ 쇼핑몰주문번호, 샵링커주문번호의 값이 동일한 데이터들 일괄 업데이트(실패, 성공 여러건 목록으로 존재함. 조회목록에서는 전체이력을 보여주지 않으므로)
+	-->
+	<update id="updateExtmallUploadMemo" parameterType="ExtmallOrder">
+		UPDATE TB_EXTMALL_ORDER_UPLOAD
+		SET CS_MEMO = #{csMemo}
+			, CS_MEMO_UPD_DT = NOW()
+		WHERE EXTMALL_ORDER_ID = #{extmallOrderId} 
+		AND AGENT_ORDER_ID = #{agentOrderId} 
+	</update>
+	
 </mapper>
 
 

+ 2 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaStock.xml

@@ -385,6 +385,7 @@
 		              , X.OPT_CD
 		              , X.OPT_CD1
 		              , X.OPT_CD2
+		              , X.SKU_MODEL_NO
 		              , X.SOLDOUT_YN
 		              , X.CURR_STOCK_QTY
 		              , X.BASE_STOCK_QTY
@@ -406,6 +407,7 @@
 		                          , ST.OPT_CD
 		                          , ST.OPT_CD1
 		                          , ST.OPT_CD2
+		                          , ST.SKU_MODEL_NO
 		                          , ST.SOLDOUT_YN
 		                          , ST.CURR_STOCK_QTY
 		                          , ST.BASE_STOCK_QTY

+ 176 - 4
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -164,6 +164,7 @@
 											<input type="text" name="maskingCellPhnno" class="w130" readonly="readonly"/>
 											<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
 											<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
+											<button type="button" class="btn btn-info btn-lg" id="btnInitializeCI">CI초기화</button>
 										</td>
 										<th class="dashR">SMS수신여부<em class="required" title="필수"></em></th>
 										<td class="dashR">
@@ -194,6 +195,25 @@
 											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
 										</td>
 									</tr>
+									<tr>
+										<th class="dashR">환불계좌</th>
+										<td class="dashR" colspan="3">
+											<div id="divRefundAccountTxt" style="display: none;">
+												<span id="refundAccount"></span>
+												<button type="button" class="btn btn-info btn-lg" id="btnDeleteRefundAccount">등록계좌삭제</button>
+											</div>
+											<div id="divRefundAccountInput" style="display: none;">
+												<select name="bankCd">
+													<option value="">[은행 선택]</option>
+													<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] '+oneData.cdNm}"></option>
+												</select>
+												<input type="text" name="accountNo" class="w200" placeholder="계좌번호" maxlength="20" data-valid-type="numeric"/>
+												<input type="text" name="accountNm" class="w100" placeholder="예금주" maxlength="10"/>
+												<button type="button" class="btn btn-info btn-lg" id="btnCertifyRefundAccount">계좌인증</button>
+												<button type="button" class="btn btn-info btn-lg" id="btnRegisterRefundAccount">계좌등록</button>
+											</div>
+										</td>
+									</tr>
 									<tr>
 										<th class="dashR">가입일시</th>
 										<td class="dashR" id="joinDt" name="joinDt"></td>
@@ -1270,13 +1290,165 @@
 					fnDisplayCellPhnno(data.cellPhnno, data.maskingCellPhnno);
 					fnDisplayManaged(data.managedRsn);
 
-					orgData = data;									// 기존 데이터
-
+					orgData = data; // 기존 데이터
+					
+					// 고객계좌정보 조회
+					fnGetCustAccountInfo();
 				}
 			});
 	};
 
-
+	// 고객계좌정보 조회
+	var accountCertify = false;
+	var fnGetCustAccountInfo = function() {
+		accountCertify = false;
+		
+		$.get('/customer/account/info/' + custNo, function(result) {
+			if (!gagajf.isNull(result)) {
+				let refundAccount = result.bankNm + ' / ' + result.accountNo + ' / ' + result.accountNm
+						+ ' (' + result.regNm + ', ' + result.regDt + ')';
+				$('#refundAccount').text(refundAccount);
+				
+				$('#divRefundAccountTxt').show();
+				$('#divRefundAccountInput').hide();
+			} else {
+				$('#custInfoForm select[name=bankCd]').val('');
+				$('#custInfoForm input[name=accountNo]').val('');
+				$('#custInfoForm input[name=accountNm]').val('');
+				$('#custInfoForm select[name=bankCd]').attr('disabled', false);
+				$('#custInfoForm input[name=accountNo]').attr('readonly', false);
+				$('#custInfoForm input[name=accountNm]').attr('readonly', false);
+				$('#divRefundAccountTxt').hide();
+				$('#divRefundAccountInput').show();
+			}
+		});
+	}
+	
+	// 등록계좌삭제
+	$('#btnDeleteRefundAccount').on('click', function () {
+		mcxDialog.confirm("등록한 계좌를 삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxJsonSubmit('/customer/account/delete/' + custNo, null, function() {
+					// 고객계좌정보 조회
+					fnGetCustAccountInfo();
+				});
+			}
+		});
+	});
+	
+	// 은행계좌 유효성체크
+	var fnIsRefundAccountValidation = function () {
+		let bankCd = $('#custInfoForm select[name=bankCd]').val();
+		let accountNo = $('#custInfoForm input[name=accountNo]').val();
+		let accountNm = $('#custInfoForm input[name=accountNm]').val();
+		
+		if (gagajf.isNull(bankCd)) {
+			mcxDialog.alertC('은행을 선택해 주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custInfoForm select[name=bankCd]').focus();
+				}
+			});
+			return false;
+		}
+		
+		if (gagajf.isNull(accountNo)) {
+			mcxDialog.alertC('계좌번호를 입력해 주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custInfoForm input[name=accountNo]').focus();
+				}
+			});
+			return false;
+		}
+		
+		if (gagajf.isNull(accountNm)) {
+			mcxDialog.alertC('예금주를 입력해 주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custInfoForm input[name=accountNm]').focus();
+				}
+			});
+			return false;
+		}
+		return true;
+	}
+	
+	// 계좌인증
+	$('#btnCertifyRefundAccount').on('click', function () {
+		if (!fnIsRefundAccountValidation()) {
+			return;
+		}
+		
+		let custInfo = {};
+		custInfo.custNo = custNo;
+		custInfo.bankCd = $('#custInfoForm select[name=bankCd]').val();
+		custInfo.accountNo = $('#custInfoForm input[name=accountNo]').val();
+		custInfo.accountNm = $('#custInfoForm input[name=accountNm]').val();
+		let jsonData = JSON.stringify(custInfo);
+		gagajf.ajaxJsonSubmit('/customer/account/check', jsonData, function(result) {
+			let msg = '계좌가 인증되었습니다.';
+			if (result.isValid) { // 유효하면
+				$('#custInfoForm select[name=bankCd]').attr('disabled', true);
+				$('#custInfoForm input[name=accountNo]').attr('readonly', true);
+				$('#custInfoForm input[name=accountNm]').attr('readonly', true);
+				accountCertify = true;
+			} else {
+				accountCertify = false;
+				msg = '인증에 실패했습니다. 은행/계좌번호/예금주를 다시 확인해 주세요.';
+			}
+			mcxDialog.alert(msg);
+		});
+	});
+	
+	// 계좌등록
+	$('#btnRegisterRefundAccount').on('click', function () {
+		if (!fnIsRefundAccountValidation()) {
+			return;
+		}
+		
+		if (!accountCertify) {
+			mcxDialog.alert("계좌인증 후 등록해 주세요.");
+			return;
+		}
+		
+		mcxDialog.confirm("계좌를 등록하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let custInfo = {};
+				custInfo.custNo = custNo;
+				custInfo.bankCd = $('#custInfoForm select[name=bankCd]').val();
+				custInfo.accountNm = $('#custInfoForm input[name=accountNm]').val();
+				custInfo.accountNo = $('#custInfoForm input[name=accountNo]').val();
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/account/create', jsonData, function() {
+					// 고객계좌정보 조회
+					fnGetCustAccountInfo();
+				});
+			}
+		});
+	});
+	
+	// CI초기화
+	$('#btnInitializeCI').on('click', function () {
+		mcxDialog.confirm("휴대전화번호와 CI 값이 삭제됩니다. 계속하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let custInfo = {};
+				custInfo.custNo = custNo;
+				let jsonData = JSON.stringify(custInfo);
+				gagajf.ajaxJsonSubmit('/customer/cellphnno/delete', jsonData, function() {
+					$('#custInfoForm input[name=cellPhnno]').val('');
+					$('#custInfoForm input[name=maskingCellPhnno]').val('');
+				});
+			}
+		});
+	});
+	
 	$('#custOrderListFrom select[name=pageSize]').on('click', function () {
 		fnSearchOrder();
 	});
@@ -1576,7 +1748,7 @@
 		let popupWidth = window.screen.width;
 		let popupHeight = window.screen.height;
 		window.open(actionUrl);
-	})
+	});
 
 	$(document).ready(function () {
 

+ 31 - 3
src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -291,8 +291,8 @@
 					<tr>
 						<th>미로그인 시작일(일)</th>
 						<td>
-							 <input name="g14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
-							 <span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 발송되지 않습니다.</span>
+							<input name="g14StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="pinteger" data-valid-name="미로그인 시작일"/><span class="cRed">일</span> 입니다.
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 발송되지 않습니다.</span>
 						</td>
 					</tr>
 					<tr>
@@ -422,7 +422,9 @@
 			<table class="frmStyle" aria-describedby="모바일앱">
 				<colgroup>
 					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
+					<col style="width: 35%;"/>
+					<col style="width: 15%;"/>
+					<col style="width: 35%;"/>
 				</colgroup>
 				<tbody>
 					<tr>
@@ -430,12 +432,22 @@
 						<td>
 							<input name="m10StrSetVal1" type="text" class="w100" maxlength="20" data-valid-name="AOS앱버전"/>
 						</td>
+						<th>AOS업데이트구분</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="m10StrSetVal3" value="N" checked="checked">일반</label>
+							<label class="rdoBtn"><input type="radio" name="m10StrSetVal3" value="Y"/>필수</label>
+						</td>
 					</tr>
 					<tr>
 						<th>IOS앱버전</th>
 						<td>
 							<input name="m10StrSetVal2" type="text" class="w100" maxlength="20" data-valid-name="IOS앱버전"/>
 						</td>
+						<th>IOS업데이트구분</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="m10StrSetVal4" value="N" checked="checked">일반</label>
+							<label class="rdoBtn"><input type="radio" name="m10StrSetVal4" value="Y"/>필수</label>
+						</td>
 					</tr>
 				</tbody>
 			</table>
@@ -610,6 +622,20 @@
 						if (!gagajf.isNull(result)) {
 							$('input[name=m10StrSetVal1]').val(result.strSetVal1);
 							$('input[name=m10StrSetVal2]').val(result.strSetVal2);
+							
+							$("input:radio[name=m10StrSetVal3]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal3 == 'Y') {
+								$("input:radio[name=m10StrSetVal3]").eq(1).prop('checked', true);
+							} else {
+								$("input:radio[name=m10StrSetVal3]").eq(0).prop('checked', true);
+							}
+							
+							$("input:radio[name=m10StrSetVal4]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal4 == 'Y') {
+								$("input:radio[name=m10StrSetVal4]").eq(1).prop('checked', true);
+							} else {
+								$("input:radio[name=m10StrSetVal4]").eq(0).prop('checked', true);
+							}
 						}
 					}
 				});
@@ -707,6 +733,8 @@
 			params.envsetNm = '모바일앱';
 			params.strSetVal1 = $('input[name=m10StrSetVal1]').val();
 			params.strSetVal2 = $('input[name=m10StrSetVal2]').val();
+			params.strSetVal3 = $('input:radio[name=m10StrSetVal3]:checked').val();
+			params.strSetVal4 = $('input:radio[name=m10StrSetVal4]:checked').val();
 		}
 
 		var jsonData = JSON.stringify(params);

+ 2 - 0
src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html

@@ -216,7 +216,9 @@
 	var columnDefsM10 = [
 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
 		{headerName: "AOS버전", field: "strSetVal1", width: 100, cellClass: 'text-center'},
+		{headerName: "AOS 업데이트구분", field: "strSetVal3", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '필수' : '일반'; }},
 		{headerName: "IOS버전", field: "strSetVal2", width: 100, cellClass: 'text-center'},
+		{headerName: "IOS 업데이트구분", field: "strSetVal4", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '필수' : '일반'; }},
 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
 	];

+ 10 - 5
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -35,6 +35,11 @@
 				<input type="hidden" id="goodsType" name="goodsType" />
 				<input type="hidden" id="goodsComposeList" name="goodsComposeList" />
 				<input type="hidden" id="repGoodsCd" name="repGoodsCd" /> <!-- 대표상품(딜 가격) -->
+				<!-- 사용자검색어, 검색어 부분 (사용안함 히든처리) 21.11.22 -->
+				<input type="hidden" class="w60p" id="goodsSnm1" name="goodsSnm1"></input>
+				<input type="hidden" id="goodsSnm1Org" name="goodsSnm1Org"/>
+				<input type="hidden" id="goodsSnm" name="goodsSnm"></input>
+				
 			<div class="panelContent">
 				<table class="frmStyle">
 					<colgroup>
@@ -101,7 +106,7 @@
 									</colgroup>
 									<tbody>
 									<tr>
-										<td rowspan="4" style="text-align:center">
+										<td rowspan="6" style="text-align:center">
 										<img id="goodsImgUrl" src="" width="130px"/>
 										<input type="hidden" name="sysImgNm" id="sysImgNm" />
 										</td>
@@ -120,6 +125,7 @@
 											<input type="hidden" id="goodsNmOrg" name="goodsNmOrg"/>
 										</td>
 									</tr>
+									<!-- 21.11.22 사용안함으로 변경, 상단 히든으로 정의(기존데이터용)
 									<tr>
 										<th>사용자검색어</th>
 										<td colspan="5">
@@ -132,12 +138,10 @@
 										<th>검색어</th>
 										<td colspan="5">
 											<textarea class="textareaR2 w100p" id="goodsSnmTxt" name="goodsSnmTxt" disabled="disabled"></textarea>
-											<!-- <input type="text" class="w100p" id="goodsSnmTxt" name="goodsSnmTxt" disabled="disabled"></input> -->
 											<input type="hidden" id="goodsSnm" name="goodsSnm"></input>
 										</td>
-									</tr>
+									</tr> -->
 									<tr>
-										<td class="aC cRed" style="font-weight:bold;"><span id="goodsTypeNm"></span></td> <!-- 상품타입노출 -->
 										<th>정상/이월 구분<em class="required" title="필수"></em></th>
 										<td>
 											<label class="rdoBtn" th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" ><input type="radio" id="formalGb" name="formalGb" th:value="${oneData.cd}" th:text="${oneData.cdNm}" /></label>
@@ -159,7 +163,6 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="14">&nbsp;</td>
 										<th>시즌<em class="required" title="필수"></em></th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">
@@ -217,6 +220,7 @@
 										</td>
 									</tr>
 									<tr class="chk_deal">
+										<td class="aC cRed" style="font-weight:bold;"><span id="goodsTypeNm"></span></td> <!-- 상품타입노출 -->
 										<th>상품연령대</th>
 										<td>
 											<select  name="ageGrpCd" id="ageGrpCd">
@@ -235,6 +239,7 @@
 										<td><span id="priceUpdDtTxt"></span></td>
 									</tr>
 									<tr>
+										<td rowspan="12">&nbsp;</td>
 										<th>정상가<em class="required" title="필수"></em></th>
 										<td>
 											<input type="text" class="w80p aR" id="listPrice" name="listPrice" maxlength="10" data-valid-type="numeric"/> 원

+ 15 - 0
src/main/webapp/WEB-INF/views/goods/GoodsListForm.html

@@ -427,6 +427,16 @@
 		{headerName: 'No', width: 60, cellClass: 'text-center',
 			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
 		},
+		{
+			headerName		: "미리보기"
+			, field			: "goodsCd"
+			, width			: 100
+			, cellClass		: 'text-center'
+			, cellRenderer: function (params) {
+				var retStr = '<button type="button" class="btn btn-base btn-sm" onclick="btnGoodsDetailPreview(\'' + params.data.goodsCd + '\');">미리보기</button>';
+				return retStr;
+			}
+		},
 		{headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
 			,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\';"/>';
@@ -1251,6 +1261,11 @@
 		cfnCreateDelvPolicyCombo( $('#searchForm input[name=statSupplyCompCd]').val(), $('#searchForm select[name=delvFeeCdC]'), "[선택]");
 	}
 	
+	// 미리보기
+	var btnGoodsDetailPreview = function(cd){
+		cfnOpenFrontGoodsPopup(cd);
+	}
+	
 	// 상품이미지 미리보기 레이어에서 창 종료 이벤트
 	$(document).on("mouseleave","#goodsImgView",function(){
 		$("#goodsImgView").remove();

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

@@ -31,7 +31,7 @@
 					</colgroup>
 					<tr>
 						<th>상품예약가격<em class="required" title="필수"></em></th>
-						<td><input type="text" class="w100p aR" id="resGoodsPrice" name="resGoodsPrice" maxlength="10" data-valid-type="numeric" /></td>
+						<td><input type="text" class="w100p aR" id="resGoodsPrice" name="resGoodsPrice" maxlength="10" data-valid-type="pinteger" /></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="예약시작일" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
@@ -152,7 +152,17 @@
 			});
 			return false;
 		}
-
+		
+		if( 1 > $("#goodsPriceRsvtForm input[name=resGoodsPrice]").val()) {
+			mcxDialog.alertC("상품 예약가격을 입력하세요.",{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$("#goodsPriceRsvtForm input[name=resGoodsPrice]").focus();
+				}
+			});
+			return false;
+		}
+		
 		var fromDate = $('#goodsPriceRsvtForm input[name=applyStYMD]').val();
 		var toDate = $('#goodsPriceRsvtForm input[name=applyEdYMD]').val();
 
@@ -188,7 +198,7 @@
 		
 		var optCheck = false;
 		$.each(allRowData, function(index, item) {
-			if (item.listPrice < $("#goodsPriceRsvtForm input[name=resGoodsPrice]").val()){
+			if (item.listPrice < $("#goodsPriceRsvtForm input[name=resGoodsPrice]").val().removeComma()){
 				optCheck = true;
 				mcxDialog.alertC("가격예약 상품중 정상가가 예약가 보다 낮은 상품이 상품이 존재합니다.<br/>확인해 주세요", {
 					sureBtnText: "확인",
@@ -265,7 +275,7 @@
 					arrEndGoodsPrice.push(item.currPrice);
 				});
 				
-				var data = {resGoodsPrice : $('#goodsPriceRsvtForm input[name=resGoodsPrice]').val()
+				var data = {resGoodsPrice : $('#goodsPriceRsvtForm input[name=resGoodsPrice]').val().removeComma()
 							, applyStdt : $('#goodsPriceRsvtForm input[name=applyStdt]').val()
 							, applyEddt : $('#goodsPriceRsvtForm input[name=applyEddt]').val()
 							, arrGoodsCd : arrGoodsCd

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

@@ -304,6 +304,12 @@
 							<th>등록일시</th>
 							<td class="aL padL10" th:text="${extOrderInfo.regDt}"></td>
 						</tr>
+						<tr>
+							<th>CS메모</th>
+							<td colspan="3" class="aL padL10" th:text="${extOrderInfo.csMemo}"></td>
+							<th>CS메모수정일시</th>
+							<td class="aL padL10" th:text="${extOrderInfo.csMemoUpdDt }"></td>
+						</tr>
 					</tbody>
 				</table>
 			</div>

+ 34 - 30
src/main/webapp/WEB-INF/views/shoplinker/ShoplinkerOrderForm.html

@@ -283,6 +283,21 @@
 		{headerName: "쇼핑몰 명", field: "mallName", width: 130, cellClass: 'text-center'},
 		{headerName: "주문자명", field: "orderName", width: 130, cellClass: 'text-center'},
 		{headerName: "주문자연락처", field: "orderCel", width: 130, cellClass: 'text-center'},
+		{headerName: "CS메모",    headerClass:'text-point',	field: "csMemo",		width: 200,	cellClass: 'text-left',editable: true,
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 1000, required: true },
+			cellStyle : function(params){
+				var color = "";
+					color = '#ff96689c';
+				return { 'text-color': color};
+			}
+		},			
+		{headerName: "",				field: "",	width: 90,	cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '<a href="javascript:void(0);"  class="btn btn-success btn-ssm">저장</a>';
+				return btnText;
+			}	
+		},
 		{headerName: "배송상태[발주확인]", field: "baesongStatus", width: 130, cellClass: 'text-center'},
 		{headerName: "주문 상품번호", field: "orderProductId", width: 130, cellClass: 'text-center'},
 		{headerName: "샵링커 상품번호", field: "shoplinkerProductId", width: 130, cellClass: 'text-center'},
@@ -331,38 +346,27 @@
 
 	// Cell click
 	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'extmallId')
-			return;
-
-		$('#detailForm select[name=vendorId]').val(event.data.vendorId);
-		$('#detailForm input[name=extmallId]').val(event.data.extmallId);
-		$('#detailForm input[name=extmallUserId]').val(event.data.extmallUserId);
-		$('#detailForm input[name=extmallNm]').val(event.data.extmallNm);
-		$('#detailForm select[name=supplyCompCd]').val(event.data.supplyCompCd);
-		$('#detailForm input[name=sellStoreCd]').val(event.data.sellStoreCd);
-		$('#detailForm input[name=stockSellRate]').val(event.data.stockSellRate);
-		$('#detailForm input[name=priceAcceptRate]').val(event.data.priceAcceptRate);
-
-		if (event.data.dwdpYn == 'Y') {
-			$('#detailForm input:radio[name=dwdpYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=dwdpYn]').eq(1).trigger('click');
-		}
-
-		if (event.data.cnclsmsSendYn == 'Y') {
-			$('#detailForm input:radio[name=cnclsmsSendYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=cnclsmsSendYn]').eq(1).trigger('click');
-		}
-
-		if (event.data.useYn == 'Y') {
-			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
+		if(event.colDef.field == ''){
+			if(gagajf.isNull(event.data.csMemo)){
+				mcxDialog.alert("내용을 입력해주세요.");
+			}else{
+				var params = {};
+				params.csMemo = event.data.csMemo;
+				params.agentOrderId = event.data.shoplinkerOrderId;
+				params.extmallOrderId = event.data.mallOrderId;
+					
+				mcxDialog.confirm('저장(수정) 하시겠습니까?', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var jsonData = JSON.stringify(params);
+						gagajf.ajaxJsonSubmit('/shoplinker/extmall/order/memo/save', jsonData, fnGoodsListSearch);
+					}
+				});
+			}
 		}
 	}
-
-
+	
 	//페이징
 	$('#searchForm select[name=pageSize]').on('change', function() {
 		$("#searchForm input[name=pageNo]").val('1');

+ 13 - 11
src/main/webapp/WEB-INF/views/stock/GoodsSizeStockForm.html

@@ -199,7 +199,15 @@ x			</div>
 			valueGetter: function(params) { return cfnGridNumner('goodsSizeStockForm',params.node.rowIndex, 'A');}
 		},
 		{headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
-		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left',
+			cellRenderer: function(params) {
+				if (params.data.sizeSoldoutYn == "Y"){
+					return '<a href="javascript:void(0);" style="color:red">' + params.value + '</a>';
+				}else{
+					return '<a href="javascript:void(0);">' + params.value + '</a>';	
+				}
+			}
+		},
 		{headerName: "품목", field: "itemkindNm", width: 180, cellClass: 'text-left',
 			cellRenderer: function (params) {
 				if (gagajf.isNull( params.value)){
@@ -214,17 +222,11 @@ x			</div>
 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
 			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
 		},
-		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				if (params.data.sizeSoldoutYn == "Y"){
-					return '<a href="javascript:void(0);" style="color:red">' + params.value + '</a>';
-				}else{
-					return '<a href="javascript:void(0);">' + params.value + '</a>';	
-				}
-			}	
-		},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},			
+		{headerName: "옵션코드", field: "optCd", width: 100, cellClass: 'text-center'},
 		{headerName: "색상", field: "optCd1", width: 100, cellClass: 'text-center'},
 		{headerName: "사이즈", field: "optCd2", width: 100, cellClass: 'text-center'},
+		{headerName: "SKUModelNo(WMS)", field: "skuModelNo", width: 140, cellClass: 'text-center'},
 		{headerName: "품절여부", field: "soldoutYn", width: 100, cellClass: 'text-center',
 			cellStyle : function(params){
 				var color = "";
@@ -267,7 +269,7 @@ x			</div>
 	// Row Click
 	gridOptions.onCellClicked = function(event) {
 		var goodsCd = event.data.goodsCd;
-		if (event.colDef.field == "goodsCd"){
+		if (event.colDef.field == "goodsNm"){
 			cfnOpenGoodsDetailPopup('U',goodsCd);
 		}
 	}