Explorar el Código

1. 주문 샘플 데이터 생성 개발

card007 hace 5 años
padre
commit
a6356d03a7

+ 16 - 0
src/main/java/com/style24/admin/biz/dao/TsaPgDao.java

@@ -1,6 +1,10 @@
 package com.style24.admin.biz.dao;
 
+import java.util.Collection;
+
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.OrderSample;
 
 /**
  * 주문관리 Dao
@@ -11,6 +15,18 @@ import com.style24.core.support.annotation.ShopDs;
 @ShopDs
 public interface TsaPgDao {
 
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	Collection<Goods> getOrderSampleGoodsInfo(Goods goods);
+	Goods getOrderSampleGoodsStock(Goods goods);
+	int createOrderSample(OrderSample orderSample);
+	int createDelveryAddrSample(OrderSample orderSample);
+	int createDeliveryFeeSample(OrderSample orderSample);
+	int createOrderDetailSample(OrderSample orderSample);
+	int createOrderDetailItemSample(OrderSample orderSample);
+	int createPaymentSample(OrderSample orderSample);
+	int updateDeliveryFeeSample(OrderSample orderSample);
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
+
 }
 
 

+ 117 - 0
src/main/java/com/style24/admin/biz/service/TsaPgService.java

@@ -1,12 +1,24 @@
 package com.style24.admin.biz.service;
 
+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.data.redis.connection.SortParameters;
 import org.springframework.stereotype.Service;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.admin.biz.dao.TsaPgDao;
 import com.style24.core.biz.dao.TscOrderDao;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderSample;
+import com.style24.persistence.domain.OrderSampleGoods;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -32,4 +44,109 @@ public class TsaPgService {
 	@Autowired
 	private ObjectMapper mapper;
 	
+	@Autowired
+	private TsaPgDao pgDao;
+	
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	public Collection<Goods> getOrderSampleGoodsInfo(Goods goods) {
+		return pgDao.getOrderSampleGoodsInfo(goods);
+	}
+	
+	public Goods getOrderSampleGoodsStock(Goods goods) {
+		return pgDao.getOrderSampleGoodsStock(goods);
+	}
+	
+	public GagaMap createOrderSample(OrderSample orderSample) {
+		GagaMap result = new GagaMap();
+		
+		int custNo = orderSample.getCustNo();
+		String ordNm = orderSample.getOrdNm();
+		String ordPhnno = orderSample.getOrdPhnno();
+		String ordEmail = orderSample.getOrdEmail();
+		String recipZipcode = orderSample.getRecipZipcode();
+		String recipBaseAddr = orderSample.getRecipBaseAddr();
+		String recipDtlAddr = orderSample.getRecipDtlAddr();
+		
+		
+		OrderSample order = new OrderSample();
+		order.setCustNo(custNo);
+		order.setOrdNm(ordNm);
+		order.setOrdPhnno(ordPhnno);
+		order.setOrdEmail(ordEmail);
+		pgDao.createOrderSample(order);
+		
+		int ordNo = order.getOrdNo();
+		
+		OrderSample deliveryAddr = new OrderSample();
+		deliveryAddr.setOrdNm(ordNm);
+		deliveryAddr.setOrdPhnno(ordPhnno);
+		deliveryAddr.setRecipZipcode(recipZipcode);
+		deliveryAddr.setRecipBaseAddr(recipBaseAddr);
+		deliveryAddr.setRecipDtlAddr(recipDtlAddr);
+		deliveryAddr.setCustNo(custNo);
+		pgDao.createDelveryAddrSample(deliveryAddr);
+		
+		int delvAddrSq = deliveryAddr.getDelvAddrSq();
+
+		int delvFeeSq = 0;
+		int ordDtlNo = 0;
+		for (OrderSampleGoods orderSampleGoods : orderSample.getGoods()) {
+			String goodsCd = orderSampleGoods.getGoodsCd();
+			String compsGoodsCd = orderSampleGoods.getCompsGoodsCd();
+			int ordQty = orderSampleGoods.getOrdQty();
+			String optCd = orderSampleGoods.getOptCd();
+			
+			
+			OrderSample deliveryFee = new OrderSample();
+			deliveryFee.setOrdNo(ordNo);
+			deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
+			deliveryFee.setCustNo(custNo);
+			deliveryFee.setGoodsCd(goodsCd);
+			pgDao.createDeliveryFeeSample(deliveryFee);
+			
+			if (deliveryFee.getDelvFeeSq() != 0) {
+				delvFeeSq = deliveryFee.getDelvFeeSq();
+			}
+			
+			OrderSample orderDetail = new OrderSample();
+			orderDetail.setOrdNo(ordNo);
+			orderDetail.setOrdDtlStat(TscConstants.OrderDetailStat.PAYMENT_COMPLETE.value());
+			orderDetail.setOrdQty(ordQty);
+			orderDetail.setDelvAddrSq(delvAddrSq);
+			orderDetail.setCustNo(custNo);
+			orderDetail.setGoodsCd(goodsCd);
+			pgDao.createOrderDetailSample(orderDetail);
+
+			if (orderDetail.getOrdDtlNo() != 0) {
+				ordDtlNo = orderDetail.getOrdDtlNo();
+			}
+			
+			OrderSample orderDetailItem = new OrderSample();
+			orderDetailItem.setOrdQty(ordQty);
+			orderDetailItem.setCustNo(custNo);
+			orderDetailItem.setCompsGoodsCd(compsGoodsCd);
+			orderDetailItem.setOptCd(optCd);
+			orderDetailItem.setOrdDtlNo(ordDtlNo);
+			pgDao.createOrderDetailItemSample(orderDetailItem);
+			
+			int ordDtlItemSq = orderDetailItem.getOrdDtlItemSq();
+		}
+		
+		OrderSample payment = new OrderSample();
+		payment.setCustNo(custNo);
+		payment.setOrdNo(ordNo);
+		pgDao.createPaymentSample(payment);
+		
+		int paySq = payment.getPaySq();
+		
+		OrderSample updateDeliveryFee = new OrderSample();
+		updateDeliveryFee.setPaySq(paySq);
+		updateDeliveryFee.setOrdNo(ordNo);
+		pgDao.updateDeliveryFeeSample(updateDeliveryFee);
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
 }

+ 74 - 1
src/main/java/com/style24/admin/biz/web/TsaOrderController.java

@@ -4,8 +4,12 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import javax.jws.WebParam;
 import javax.servlet.http.HttpServletRequest;
 
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.admin.biz.service.TsaCustomerService;
+import com.style24.admin.biz.service.TsaPgService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.persistence.TscPageRequest;
 import org.apache.commons.collections4.CollectionUtils;
@@ -33,7 +37,9 @@ 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.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderSample;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -59,6 +65,9 @@ public class TsaOrderController extends TsaBaseController {
 
 	@Autowired
 	private TscOrderService orderService;
+	
+	@Autowired
+	private TsaPgService pgService;
 
 	/**
 	 * 주문목록조회
@@ -72,7 +81,7 @@ public class TsaOrderController extends TsaBaseController {
 		ModelAndView mav = new ModelAndView();
 
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G012"));		// 사이트구분
-		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분		
+		mav.addObject("mallGbList"		, rendererService.getAvailCommonCodeList("G011"));		// 몰구분
 		mav.addObject("supplyCompList"	, rendererService.getSupplyCompanyList());				// 공급업제목록
 		mav.addObject("ordStatList"		, rendererService.getAvailCommonCodeList("G012"));		// 주문상태코드
 		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));		// 주문상세상태코드
@@ -83,6 +92,8 @@ public class TsaOrderController extends TsaBaseController {
 		mav.addObject("siteCdList"		, rendererService.getAvailCommonCodeList("G000"));		// 사이트구분
 		mav.addObject("formalGbList"	, rendererService.getAvailCommonCodeList("G009"));		// 정상/이월
 
+		mav.addObject("userNo"			, TsaSession.getInfo().getUserNo());
+
 		mav.setViewName("order/OrderListForm");
 
 		return mav;
@@ -633,6 +644,68 @@ public class TsaOrderController extends TsaBaseController {
 		orderService.updateOrderChange(order);
 		return super.ok(message.getMessage("SUCC_0002"));
 	}
+
+
+
+
+
+
+
+	/* 주문 샘플 데이터 (추후 삭제 예정) */
+	@GetMapping("/sample/create/form")
+	@ResponseBody
+	public ModelAndView orderSamplePopupForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		
+		mav.setViewName("order/OrderSamplePopupForm");
+		
+		return mav;
+	}
+	
+	@PostMapping("/sample/create")
+	@ResponseBody
+	public GagaMap createOrderSample(@RequestBody OrderSample orderSample) {
+		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.FAIL.getCode());
+
+		log.info("orderSample >>> {}", orderSample);
+		
+		result = pgService.createOrderSample(orderSample);
+		
+		// 처리 결과 코드에 따른 메세지 설정
+		if (result.get("status").equals(GagaResponseStatus.SUCCESS.getCode())) {
+			result.set("message", message.getMessage("SUCC_0004"));
+		} else {
+			result.set("message", message.getMessage("FAIL_0004"));
+		}
+
+		return result;
+	}
+
+	@PostMapping("/sample/goods/info")
+	@ResponseBody
+	public Collection<Goods> getOrderSampleGoodsInfo(@RequestBody String[] arrGoodsCd) {
+		Goods goods = new Goods();
+		goods.setArrGoodsCd(arrGoodsCd);
+		
+		return pgService.getOrderSampleGoodsInfo(goods);
+	}
+
+	@PostMapping("/sample/goods/stock")
+	@ResponseBody
+	public Goods getOrderSampleGoodsStock(@RequestBody Goods goods) {
+		return pgService.getOrderSampleGoodsStock(goods);
+	}
+	
+	/* //주문 샘플 데이터 (추후 삭제 예정) */
 }
 
 

+ 66 - 0
src/main/java/com/style24/persistence/domain/OrderSample.java

@@ -0,0 +1,66 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 주문 샘플 Domain
+ *
+ * @author card007
+ * @since 2021. 01. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class OrderSample extends TscBaseDomain {
+
+	private int ordNo;
+	private int ordDtlNo;
+	private int ordDtlItemSq;
+	private int delvAddrSq;
+	private int paySq;
+	private int custNo;
+	private String ordNm;
+	private String ordPhnno;
+	private String ordTelno;
+	private String ordEmail;
+	private String recipZipcode;
+	private String recipBaseAddr;
+	private String recipDtlAddr;
+	private String optCd2;
+	private int ordQty;
+	private String delvFeeGb;
+	private String delvFeeCd;
+	private int delvFeeSq;
+	private String ordDtlStat;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private Collection<OrderSampleGoods> goods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd2s;
+
+	private int no;
+	private String sysImgNm;
+	private String goodsCd;
+	private String compsGoodsCd;
+	private String goodsNm;
+	private String optCd;
+	private int stockQtySum;
+	private String goodsStat;
+	private String styleYear;
+	private String seasonCd;
+	private int listPrice;
+	private int currPrice;
+	private String priceUpdDt;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String returnableYn;
+	private String regDt;
+	private String regNm;
+	private String updDt;
+	private String updNm;
+}

+ 43 - 0
src/main/java/com/style24/persistence/domain/OrderSampleGoods.java

@@ -0,0 +1,43 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 주문 샘플 상품 Domain
+ *
+ * @author card007
+ * @since 2021. 01. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class OrderSampleGoods extends TscBaseDomain {
+
+	private int no;
+	private String sysImgNm;
+	private String goodsCd;
+	private String compsGoodsCd;
+	private String goodsNm;
+	private int ordQty;
+	private String optCd;
+	private String optCd2;
+	private int stockQtySum;
+	private String goodsStat;
+	private String styleYear;
+	private String seasonCd;
+	private int listPrice;
+	private int currPrice;
+	private String priceUpdDt;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String returnableYn;
+	private String regDt;
+	private String regNm;
+	private String updDt;
+	private String updNm;
+
+}

+ 489 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaPg.xml

@@ -2,7 +2,496 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaPgDao">
 
+	<!-- 주문 샘플 데이터 (추후 삭제 예정) -->
+	<select id="getOrderSampleGoodsInfo" parameterType="Goods" resultType="Goods">
+		SELECT SYS_IMG_NM
+		     , GOODS_CD
+		     , GOODS_NM
+		     , STOCK_QTY_SUM
+		     , GOODS_STAT
+		     , STYLE_YEAR
+			 , SEASON_CD
+		     , LIST_PRICE
+		     , CURR_PRICE
+		     , PRICE_UPD_DT
+		     , ERP_STOCK_LINK_YN
+		     , FORMAL_GB
+		     , RETURNABLE_YN
+		     , REG_DT
+		     , REG_NM
+			 , UPD_DT
+		     , UPD_NM
+		     , REP_GOODS_CD
+			 , GROUP_CONCAT(OPT_CD2 ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',')        AS SITE_CD
+		  FROM (
+			  SELECT GI.SYS_IMG_NM
+				   , G.GOODS_CD
+				   , G.GOODS_NM
+				   , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD)
+						   ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = G.GOODS_CD)
+					  END) AS STOCK_QTY_SUM
+				   , G.GOODS_STAT
+				   , G.STYLE_YEAR
+				   , G.SEASON_CD
+				   , G.LIST_PRICE
+				   , G.CURR_PRICE
+				   , G.PRICE_UPD_DT
+				   , G.ERP_STOCK_LINK_YN
+				   , G.FORMAL_GB
+				   , G.RETURNABLE_YN
+				   , G.REG_DT
+				   , FN_GET_USER_NM(G.REG_NO) AS REG_NM
+				   , G.UPD_DT
+				   , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM
+				   , IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) AS REP_GOODS_CD
+				   , OP.OPT_CD2
+				   , OP.DISP_ORD
+				FROM TB_GOODS G
+				LEFT OUTER JOIN TB_GOODS_COMPOSE GC
+				  ON G.GOODS_CD = GC.GOODS_CD
+			   INNER JOIN TB_OPTION OP
+				  ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
+				LEFT OUTER JOIN TB_GOODS_IMG GI
+				  ON G.GOODS_CD = GI.GOODS_CD
+			   INNER JOIN TB_BRAND B
+				  ON G.BRAND_CD = B.BRAND_CD
+			   WHERE G.GOODS_CD IN
+		<foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+			#{item}
+		</foreach>
+		  ) Z
+		 GROUP BY SYS_IMG_NM, GOODS_CD, GOODS_NM, STOCK_QTY_SUM, GOODS_STAT, STYLE_YEAR
+				, SEASON_CD, LIST_PRICE, CURR_PRICE, PRICE_UPD_DT, ERP_STOCK_LINK_YN, FORMAL_GB, RETURNABLE_YN, REG_DT, REG_NM
+				, UPD_DT, UPD_NM, REP_GOODS_CD
+	</select>
 	
+	<select id="getOrderSampleGoodsStock" parameterType="Goods" resultType="Goods">
+		SELECT GOODS_CD
+		     , OPT_CD2 AS SITE_CD
+		     , MAX(CURR_STOCK_QTY - BASE_STOCK_QTY) AS MIN_ORD_QTY
+		  FROM VW_STOCK
+		 WHERE GOODS_CD = #{goodsCd}
+		   AND OPT_CD2 = #{siteCd}
+		 GROUP BY GOODS_CD, OPT_CD2
+	</select>
+	
+	<insert id="createOrderSample" parameterType="OrderSample" keyProperty="ordNo">
+		INSERT INTO TB_ORDER
+			( MALL_GB
+			, ORD_DT
+			, PAY_DT
+			, CUST_NO
+			, ORD_NM
+			, ORD_PHNNO
+			, ORD_TELNO
+			, ORD_EMAIL
+			, SITE_CD
+			, NPAY_ORD_NO
+			, FRONT_GB
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		VALUES
+			( 'G011_10'			-- MALL_GB
+			, NOW()				-- ORD_DT
+			, NOW()				-- PAY_DT
+			, #{custNo}			-- CUST_NO
+			, #{ordNm}			-- ORD_NM
+			, #{ordPhnno}		-- ORD_PHNNO
+			, NULL				-- ORD_TELNO
+			, #{ordEmail}		-- ORD_EMAIL
+			, 'G000_10'			-- SITE_CD
+			, 0					-- NPAY_ORD_NO
+			, 'P'				-- FRONT_GB
+			, #{custNo}			-- REG_NO
+			, NOW()				-- REG_DT
+			, #{custNo}			-- UPD_NO
+			, NOW()				-- UPD_DT
+			)
+	</insert>
+	
+	<insert id="createDelveryAddrSample" parameterType="OrderSample" keyProperty="delvAddrSq">
+		INSERT INTO TB_DELIVERY_ADDR
+			( RECIP_NM
+			, RECIP_PHNNO
+			, RECIP_TELNO
+			, RECIP_ZIPCODE
+			, RECIP_BASE_ADDR
+			, RECIP_DTL_ADDR
+			, DELV_MEMO
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		VALUES
+			( #{ordNm}				-- RECIP_NM
+			, #{ordPhnno}			-- RECIP_PHNNO
+			, NULL					-- RECIP_TELNO
+			, #{recipZipcode}		-- RECIP_ZIP_NO
+			, #{recipBaseAddr}		-- RECIP_BASE_ADDR
+			, #{recipDtlAddr}		-- RECIP_DTL_ADDR
+			, '배송메모'				-- DELV_MEMO
+			, #{custNo}				-- REG_NO
+			, NOW()					-- REG_DT
+			, #{custNo}				-- UPD_NO
+			, NOW()					-- UPD_DT
+			)
+	</insert>
+	
+	<insert id="createDeliveryFeeSample" parameterType="OrderSample" keyProperty="delvFeeSq">
+		INSERT INTO TB_DELIVERY_FEE
+			( PAY_SQ
+			, ORD_NO
+			, DELV_FEE_GB
+			, DELV_FEE_CD
+			, DELV_FEE
+			, DELV_CPN_SQ
+			, DELV_CPN_DC_AMT
+			, REAL_DELV_AMT
+			, ORD_CHG_SQ
+			, SUPPLY_COMP_CD
+			, DELV_USAC_YN
+			, DELV_USAC_DT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		SELECT 0               -- PAY_SQ
+			 , #{ordNo}        -- ORD_NO
+			 , #{delvFeeGb}    -- DELV_FEE_GB
+			 , G.DELV_FEE_CD   -- DELV_FEE_CD
+			 , 0               -- DELV_FEE
+			 , NULL            -- DELV_CPN_SQ
+			 , 0               -- DELV_CPN_DC_AMT
+			 , 0               -- REAL_DELV_AMT
+			 , NULL            -- ORD_CHG_SQ
+			 , G.SUPPLY_COMP_CD -- SUPPLY_COMP_CD
+			 , 'N'             -- DELV_USAC_YN
+			 , NULL            -- DELV_USER_DT
+			 , #{custNo}       -- REG_NO
+			 , NOW()           -- REG_DT
+			 , #{custNo}       -- UPD_NO
+			 , NOW()           -- UPO_DT
+		  FROM TB_GOODS G
+		 INNER JOIN TB_DELV_FEE_POLICY DFP
+		    ON G.DELV_FEE_CD = DFP.DELV_FEE_CD
+		 WHERE G.GOODS_CD = #{goodsCd}
+		   AND NOT EXISTS(SELECT 1
+							FROM TB_DELIVERY_FEE
+						   WHERE ORD_NO <![CDATA[<>]]> #{ordNo}
+							 AND DELV_FEE_GB <![CDATA[<>]]> #{delvFeeGb}
+							 AND DELV_FEE_CD <![CDATA[<>]]> G.DELV_FEE_CD)
+	</insert>
+	
+	<insert id="createOrderDetailSample" parameterType="OrderSample" keyProperty="ordDtlNo">
+		INSERT INTO TB_ORDER_DETAIL
+			( ORD_NO
+			, ORD_EXCH_GB
+			, ORD_DTL_STAT
+			, ORG_ORD_DTL_NO
+			, SUPPLY_COMP_CD
+			, GOODS_CD
+			, PRODUCT_NO
+			, PRODUCT_CODE
+			, FORMAL_GB
+			, GOODS_TYPE
+			, LIST_PRICE
+			, CURR_PRICE
+			, DC_RATE
+			, OPT_ADD_PRICE
+			, ORD_QTY
+			, ORD_AMT
+			, CNCL_RTN_QTY
+			, CNCL_RTN_AMT
+			, CPN1_CPN_SQ
+			, CPN1_DC_AMT
+			, TMTB1_SQ
+			, TMTB1_DC_AMT
+			, TMTB2_SQ
+			, TMTB2_DC_AMT
+			, GOODS_CPN_SQ
+			, GOODS_CPN_DC_AMT
+			, CART_CPN_SQ
+			, CART_CPN_DC_AMT
+			, BURDEN_RATE
+			, PNT_DC_AMT
+			, PRE_PNT_DC_AMT
+			, SAVE_PNT_AMT
+			, REAL_ORD_AMT
+			, GFCD_USE_AMT
+			, VENDOR_ID
+			, EXTMALL_ID
+			, AGENT_ORDER_ID
+			, EXTMALL_ORDER_ID
+			, CHANGABLE_YN
+			, CHANGE_FEE_FREE_YN
+			, RETURNABLE_YN
+			, RETURN_FEE_FREE_YN
+			, SOLDOUT_YN
+			, SOLDOUT_MEMO
+			, SOLDOUT_REG_NO
+			, SOLDOUT_REG_DT
+			, DELV_ADDR_SQ
+			, DELV_FEE_CD
+			, SHOT_DELV_YN
+			, GIFT_PACK_YN
+			, MAKE_GOODS_YN
+			, ENTRY_NO
+			, DELV_LOC_CD
+			, DELV_ASSIGN_DT
+			, DELV_ASSIGN_STAT
+			, DSTRBT_NOTE
+			, DELV_STDT
+			, DELV_EDDT
+			, SHIP_COMP_CD
+			, INVOICE_NO
+			, INVOICE_SEND_YN
+			, SELL_STORE_CD
+			, SELL_FEE_RATE
+			, AF_LINK_CD
+			, ITHR_CD
+			, CONTENTS_LOC
+			, PLAN_DTL_SQ
+			, SOCIAL_SQ
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		SELECT #{ordNo} -- ORD_NO
+			, 'O' -- ORD_EXCH_GB
+			, #{ordDtlStat} -- ORD_DTL_STAT
+			, NULL -- ORG_ORD_DTL_NO
+			, G.SUPPLY_COMP_CD -- SUPPLY_COMP_CD
+			, G.GOODS_CD -- GOODS_CD
+			, G.PRODUCT_NO -- PRODUCT_NO
+			, G.PRODUCT_CODE -- PRODUCT_CODE
+			, G.FORMAL_GB -- FORMAL_GB
+			, G.GOODS_TYPE -- GOODS_TYPE
+			, G.LIST_PRICE -- LIST_PRICE
+			, G.CURR_PRICE -- CURR_PRICE
+			, G.DC_RATE -- DC_RATE
+			, 0 -- OPT_ADD_PRICE
+			, #{ordQty} -- ORD_QTY
+			, #{ordQty} * G.CURR_PRICE -- ORD_AMT
+			, 0 -- CNCL_RTN_QTY
+			, 0 -- CNCL_RTN_AMT
+			, 0 -- CPN1_CPN_SQ
+			, 0 -- CPN1_DC_AMT
+			, 0 -- TMTB1_SQ
+			, 0 -- TMTB1_DC_AMT
+			, 0 -- TMTB2_SQ
+			, 0 -- TMTB2_DC_AMT
+			, 0 -- GOODS_CPN_SQ
+			, 0 -- GOODS_CPN_DC_AMT
+			, 0 -- CART_CPN_SQ
+			, 0 -- CART_CPN_DC_AMT
+			, 0 -- BURDEN_RATE
+			, 0 -- PNT_DC_AMT
+			, 0 -- PRE_PNT_DC_AMT
+			, 0 -- SAVE_PNT_AMT
+			, #{ordQty} * G.CURR_PRICE -- REAL_ORD_AMT
+			, 0 -- GFCD_USE_AMT
+			, '' -- VENDOR_ID
+			, '' -- EXTMALL_ID
+			, '' -- AGENT_ORDER_ID
+			, '' -- EXTMALL_ORDER_ID
+			, 'Y' -- CHANGABLE_YN
+			, 'Y' -- CHANGE_FEE_FREE_YN
+			, 'Y' -- RETURNABLE_YN
+			, 'Y' -- RETURN_FEE_FREE_YN
+			, 'N' -- SOLDOUT_YN
+			, '' -- SOLDOUT_MEMO
+			, NULL -- SOLDOUT_REG_NO
+			, NOW() -- SOLDOUT_REG_DT
+			, #{delvAddrSq} -- DELV_ADDR_SQ
+			, G.DELV_FEE_CD -- DELV_FEE_CD
+			, 'N' -- SHOT_DELV_YN
+			, 'N' -- GIFT_PACK_YN
+			, 'N' -- MAKE_GOODS_YN
+			, '' -- ENTRY_NO
+			, '' -- DELV_LOC_CD
+			, NOW() -- DELV_ASSIGN_DT
+			, '' -- DELV_ASSIGN_STAT
+			, '' -- DSTRBT_NOTE
+			, NOW() -- DELV_STDT
+			, NOW() -- DELV_EDDT
+			, 'S0001' -- SHIP_COMP_CD
+			, '' -- INVOICE_NO
+			, '' -- INVOICE_SEND_YN
+			, '' -- SELL_STORE_CD
+			, 0 -- SELL_FEE_RATE
+			, '' -- AF_LINK_CD
+			, '' -- ITHR_CD
+			, '' -- CONTENTS_LOC
+			, NULL -- PLAN_DTL_SQ
+			, NULL -- SOCIAL_SQ
+			, #{custNo} -- REG_NO
+			, NOW() -- REG_DT
+			, #{custNo} -- UPD_NO
+			, NOW() -- UPD_DT
+			FROM TB_GOODS G
+		 WHERE G.GOODS_CD = #{goodsCd}
+		   AND NOT EXISTS (SELECT 1 FROM TB_ORDER_DETAIL WHERE ORD_NO = #{ordNo} AND GOODS_CD = #{goodsCd})
+	</insert>
+	
+	<insert id="createOrderDetailItemSample" parameterType="OrderSample" keyProperty="">
+		INSERT INTO TB_ORDER_DETAIL_ITEM
+			( ORD_DTL_NO
+			, ORD_NO
+			, ORD_DTL_STAT
+			, ITEM_CD
+			, OPT_CD
+			, OPT_CD1
+			, OPT_CD2
+			, SKU_MODEL_NO
+			, PRODUCT_NO
+			, PRODUCT_CODE
+			, ITEM_QTY
+			, ITEM_PRICE
+			, OPT_ADD_PRICE
+			, DISP_ORD
+			, ORD_AMT
+			, CNCL_RTN_AMT
+			, CPN1_DC_AMT
+			, TMTB1_DC_AMT
+			, TMTB2_DC_AMT
+			, GOODS_CPN_DC_AMT
+			, CART_CPN_DC_AMT
+			, PNT_DC_AMT
+			, PRE_PNT_DC_AMT
+			, SAVE_PNT_AMT
+			, REAL_ORD_AMT
+			, GFCD_USE_AMT
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		SELECT OD.ORD_DTL_NO       -- ORD_DTL_NO
+			 , OD.ORD_NO           -- ORD_NO
+			 , OD.ORD_DTL_STAT     -- ORD_DTL_STAT
+			 , G.GOODS_CD         -- ITEM_CD
+			 , OP.OPT_CD          -- OPT_CD
+			 , OP.OPT_CD1         -- OPT_CD1
+			 , OP.OPT_CD2         -- OPT_CD2
+			 , OP.SKU_MODEL_NO    -- SKU_MODEL_NO
+			 , OP.PRODUCT_NO      -- PRODUCT_NO
+			 , OP.PRODUCT_CODE    -- PRODUCT_CODE
+			 , IFNULL(GC.QTY, 1)  -- ITEM_QTY
+			 , IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)       -- ITEM_PRICE
+			 , 0                  -- OPT_ADD_PRICE
+			 , IFNULL(GC.DISP_ORD, 1)                  -- DISP_ORD
+			 , #{ordQty} * IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)          -- ORD_AMT
+			 , 0     -- CNCL_RTN_AMT
+			 , 0      -- CPN1_DC_AMT
+			 , 0     -- TMTB1_DC_AMT
+			 , 0     -- TMTB2_DC_AMT
+			 , 0 -- GOODS_CPN_DC_AMT
+			 , 0  -- CART_CPN_DC_AMT
+			 , 0       -- PNT_DC_AMT
+			 , 0   -- PRE_PNT_DC_AMT
+			 , 0     -- SAVE_PNT_AMT
+			 , #{ordQty} * IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)     -- REAL_ORD_AMT
+			 , 0     -- GFCD_USE_AMT
+			 , #{custNo}          -- REG_NO
+			 , NOW()              -- REG_DT
+			 , #{custNo}          -- UPD_NO
+			 , NOW()              -- UPD_DT
+		  FROM TB_ORDER_DETAIL OD
+		 INNER JOIN TB_GOODS                     G
+		    ON OD.GOODS_CD = G.GOODS_CD
+		  LEFT OUTER JOIN TB_GOODS_COMPOSE GC
+		    ON G.GOODS_CD = GC.GOODS_CD
+		   AND GC.COMPS_GOODS_CD = #{compsGoodsCd}
+		 INNER JOIN TB_OPTION                    OP
+		    ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
+		   AND OP.OPT_CD2 = #{optCd}
+		 WHERE OD.ORD_DTL_NO = #{ordDtlNo}
+	</insert>
+	
+	<insert id="createPaymentSample" parameterType="OrderSample" keyProperty="paySq">
+		INSERT INTO TB_PAYMENT
+			( ORD_NO
+			, PAY_DT
+			, PAY_MEANS
+			, PAY_AMT
+			, PG_CPN_AMT
+			, NPAY_PNT_AMT
+			, PAY_GB
+			, PAY_STAT
+			, PG_GB
+			, PG_TID
+			, PG_TRADE_NO
+			, PG_SHOP_ID
+			, CARD_TYPE
+			, CARD_KIND
+			, CARD_BANK
+			, CARD_NM
+			, CARD_MIPS
+			, CARD_PCABLE_YN
+			, VA_NO
+			, VA_NM
+			, VA_BANK
+			, VA_DEADLINE
+			, TELECOM
+			, ESCROW_YN
+			, ORD_CHG_SQ
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+			)
+		SELECT OD.ORD_NO   -- ORD_NO
+			 , NOW()      -- PAY_DT
+			 , 'G014_30'  -- PAY_MEANS
+			 , SUM(OD.REAL_ORD_AMT + DF.REAL_DELV_AMT)  -- PAY_AMT
+			 , 0          -- PG_CPN_AMT
+			 , 0          -- NPAY_CPN_AMT
+			 , 'O'        -- PAY_GB
+			 , 'G016_30'  -- PAY_STAT
+			 , 'KCP'      -- PG_GB
+			 , 'TID00001' -- PG_TID
+			 , '101010'   -- PG_TRADE_NO
+			 , 'STYLE24'  -- PG_SHOP_ID
+			 , 'Y'        -- CARD_TYPE
+			 , ''         -- CARD_KIND
+			 , ''         -- CARD_BANK
+			 , '신한카드'     -- CARD_NM
+			 , ''         -- CARD_MIPS
+			 , ''         -- CARD_PCABLE_YN
+			 , ''         -- VA_NO
+			 , ''         -- VA_NM
+			 , ''         -- VA_BANK
+			 , NOW()      -- VA_DEADLINE
+			 , ''         -- TELECOM
+			 , ''         -- ESCROW_YN
+			 , NULL       -- ORD_CHG_SQ
+			 , #{custNo}          -- REG_NO
+			 , NOW()      -- REG_DT
+			 , #{custNo}          -- UPD_NO
+			 , NOW()      -- UPD_DT
+		  FROM TB_ORDER_DETAIL OD
+		 INNER JOIN (SELECT ORD_NO
+						  , SUM(REAL_DELV_AMT) AS REAL_DELV_AMT
+					   FROM TB_DELIVERY_FEE
+					  WHERE ORD_NO = #{ordNo}
+					  GROUP BY ORD_NO) DF
+		    ON OD.ORD_NO = DF.ORD_NO
+		 WHERE OD.ORD_NO = #{ordNo}
+		 GROUP BY OD.ORD_NO
+	</insert>
+	
+	<update id="updateDeliveryFeeSample" parameterType="OrderSample">
+		UPDATE TB_DELIVERY_FEE
+		   SET PAY_SQ = #{paySq}
+		 WHERE ORD_NO = #{ordNo}
+	</update>
+	<!-- //주문 샘플 데이터 (추후 삭제 예정) -->
 	
 </mapper>
 

+ 2 - 2
src/main/webapp/WEB-INF/views/order/ExchangeRequestForm.html

@@ -281,9 +281,9 @@ var columnExchangeReqList = [
 					strVal += '<select class="ordChgOpt" name="ordChgOpt" ordDtlNo="' + params.data.ordDtlNo + '" ordDtlItemSq="' + params.data.ordDtlItemSq + '" onchange="fnChangeOption(this)">';
 					
 					if (gagajf.isNull(ordChgOpt)) {
-						strVal += '<option value="">선택</option>'
+						strVal += '<option value="">선택</option>';
 					} else {
-						strVal += '<option value="" selected>선택</option>'
+						strVal += '<option value="" selected>선택</option>';
 					}
 
 					$.each(optArr, function(idx,item){

+ 6 - 0
src/main/webapp/WEB-INF/views/order/OrderListForm.html

@@ -216,6 +216,7 @@
 			<ul class="panelBar">
 				<li>
 					<button type="button" class="btn btn-info btn-lg" onclick="fnOrderExcelList();">엑셀다운로드</button>
+					<button type="button" class="btn btn-info btn-lg" th:if="${userNo == 8 or userNo == 14 or userNo == 11}" onclick="fnCreateSampleOrder();">주문생성</button>
 				</li>
 				<li class="aR">
 					검색결과 : <strong><span id="rowCntOrderList">0</span> 건</strong>&nbsp;
@@ -743,6 +744,11 @@ $(document).ready(function() {
 	gagaAgGrid.createGrid('gridOrderList', gridOptionsOrderList);
 	gridOptionsOrderList.api.hideOverlay();
 });
+
+var fnCreateSampleOrder = function() {
+	var actionUrl = "/order/sample/create/form";
+	cfnOpenModalPopup(actionUrl, "popupOrderSample");
+}
 </script>
 
 </html>

+ 437 - 0
src/main/webapp/WEB-INF/views/order/OrderSamplePopupForm.html

@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderSamplePopupForm.html
+ * @desc    : 주문 샘플 데이터 생성 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.30   card007     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupOrderSample">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'주문 샘플 데이터 생성'}"></strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupOrderSample');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="orderSamplePopupForm" name="orderSamplePopupForm" action="#" th:action="@{'/order/sample/create'}" th:method="post">
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:7%;"/>
+						<col style="width:26%;"/>
+						<col style="width:7%;"/>
+						<col style="width:26%;"/>
+						<col style="width:7%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>회원번호</th>
+							<td>
+								<input class="w200" type="text" name="custNo" id="custNo"/>
+								<button type="button" class="btn btn-info btn-lg" id="btnOrderSearch" onclick="fnApplyCustomerInfo()">적용</button>
+							</td>
+							<th>주문자명</th>
+							<td>
+								<input type="text" name="ordNm" id="ordNm"/>
+							</td>
+							<th>핸드폰번호</th>
+							<td>
+								<input type="text" name="ordPhnno" id="ordPhnno"/>
+							</td>
+						</tr>
+						<tr>
+							<th>전화번호</th>
+							<td>
+								<input type="text" name="ordTelno" id="ordTelno"/>
+							</td>
+							<th>이메일</th>
+							<td colspan="3">
+								<input type="text" name="ordEmail" id="ordEmail"/>
+							</td>
+						</tr>
+						<tr>
+							<th>배송지</th>
+							<td colspan="5">
+								<input type="text" name ="recipZipcode" id="recipZipcode" class="w100" readonly="readonly"/>
+								<button type="button" class="btn btn-info" onclick="fnOpenDaumAddr('delivery');">우편번호찾기</button>
+								<input type="text" name ="recipBaseAddr" id="recipBaseAddr" class="w300"/>
+								<input type="text" name ="recipDtlAddr" id="recipDtlAddr" class="w300"/>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- Grid -->
+		<ul class="panelBar">
+			<li class="left">
+				<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow();">행삭제</button>
+			</li>
+			<li class="right">
+				<button type="button" class="btn btnRight btn-base btn-lg" onclick="fnOpenGoodsPopup();">주문상품추가</button>
+			</li>
+		</ul>
+		<div id="gridGoodsList" style="height: 390px;" class="ag-theme-balham lh60"></div>
+		<!-- //Grid -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnCreateOrderSample">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var sessRoleCd = [[${sessionInfo.roleCd}]];
+	var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
+	var formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+	var seasonList = gagajf.convertToArray([[${seasonList}]]);
+	var columnDefs = [];
+	columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: 'No', width: 60, cellClass: 'text-center',
+			valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
+		},
+		{headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
+			,cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt="" onclick="cfnOpenImagePreViewPopup(\'goodsImgView\', \''+ _goodsUrl+ "/" + params.value +'\')" onerror="this.src=\'/image/no.gif\';"/>';
+			}
+		},
+		{headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'
+			,cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "구성상품코드", field: "compsGoodsCd", width: 140, cellClass: 'text-center'},
+		{headerName: "판매가능재고", field: "stockQtySum", width: 120, cellClass: 'text-right',
+			valueFormatter: function(params) {	return params.value.addComma();},
+			cellStyle : function(params){
+				if ("00" == params.data.goodsStat  || "10" == params.data.goodsStat || "20" == params.data.goodsStat || "30" == params.data.goodsStat) {
+					return;
+				}
+				var color = "";
+				if (params.value <= 0){
+					color = '#ff96689c';
+				}
+				return { 'background-color': color};
+			}
+		},
+		{
+			headerName		: "주문옵션"
+			, field			: "optCd"
+			, width			: 100
+			, cellClass		: "text-center"
+			, cellRenderer	: function (params) {
+				var strVal			= '';
+				if (!gagajf.isNull(params.data.optCd2)) {
+					var optArr = params.data.optCd2.split(',');
+					strVal += '<select class="optCd2" name="optCd2" goodsCd="' + params.data.goodsCd + '" onchange="fnChangeOption(this)">';
+					if (gagajf.isNull(params.data.optCd)) {
+						strVal += '<option value="" selected>선택</option>';	
+					} else {
+						strVal += '<option value="">선택</option>'
+					}
+					
+					
+					$.each(optArr, function (idx, item) {
+						if (params.data.optCd == item) {
+							strVal += '<option value="' + item + '" selected>' + item + '</option>';
+						} else {
+							strVal += '<option value="' + item + '">' + item + '</option>';
+						}
+					});
+				}
+				
+				return strVal;
+			}
+		},
+		{headerName: "주문수량", field: "ordQty", width: 100, cellClass: 'text-center', editable : true},
+		{headerName: "상품상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
+		},
+		{headerName: "년도", field: "styleYear" , width: 80, cellClass: 'text-center'},
+		{headerName: "시즌", field: "seasonCd" , width: 80, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(seasonList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(seasonList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(seasonList, params.newValue); }
+		},
+		{headerName: "정상가", field: "listPrice" , width: 100, cellClass: 'text-right'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		{headerName: "판매가", field: "currPrice" , width: 100, cellClass: 'text-right'
+			,valueFormatter: function(params) {return params.value.addComma();},
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 14, validType: 'numeric'}
+		},
+		/*{headerName: "할인율", field: "dcRate" , width: 90, cellClass: 'text-right'},*/
+		{headerName: "가격변경일", field: "priceUpdDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "ERP재고연동여부", field: "erpStockLinkYn", width: 120, cellClass: 'text-center'},
+		{headerName: "이월구분", field: "formalGb", width: 100, cellClass: 'text-center',
+			cellEditorParams: { values: gagaAgGrid.extractValues(formalGbList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(formalGbList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(formalGbList, params.newValue); }
+		},
+		{headerName: "반품가능", field: "returnableYn" , width: 90, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "등록자", field: "regNm" , width: 100, cellClass: 'text-center'},
+		{headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+			}
+		},
+		{headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
+	];
+	
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+	
+	// 중복 선택 가능
+	gridOptions.rowSelection = 'multiple';
+	gridOptions.suppressRowClickSelection = true;
+	gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	
+	gridOptions.getRowStyle = function(params) {
+		if ("G008_00" == params.data.goodsStat  || "G008_10" == params.data.goodsStat || "G008_20" == params.data.goodsStat || "G008_30" == params.data.goodsStat) {
+			return { background: '#23c6c8' };
+		}
+	}
+
+	// 주문수량 변경 이벤트
+	gridOptions.onCellValueChanged = function(event) {
+		let ordQty = event.data.ordQty;
+		if (event.colDef.field == "ordQty" && event.data.ordQty > event.data.stockQtySum) {
+			ordQty = event.data.stockQtySum;
+			mcxDialog.alert('주문수량이 판매가능재고보다 클 수 없습니다.');
+		}
+		
+		gridOptions.api.forEachNode(function(rowNode, index) {
+			if (event.data.goodsCd == rowNode.data.goodsCd){
+				rowNode.data.ordQty = ordQty;
+				
+				gridOptions.api.updateRowData({update: [rowNode.data]});
+			}
+		});
+	}
+
+	//상품조회 팝업
+	var fnOpenGoodsPopup = function() {
+		cfnOpenGoodsPopup('fnFetchGoods');
+	}
+	
+	// 상품추가
+	var fnFetchGoods = function(goodsData) {
+		if (goodsData.length < 1) return;
+		
+		// 기존상품
+		var oldGoodsSetList = gagaAgGrid.getAllRowData(gridOptions);
+		var index = oldGoodsSetList.length+1;
+		
+		var arrGoodsCd = [];
+		$.each(goodsData, function(idx, item) {
+			arrGoodsCd.push(item.goodsCd);
+		})
+		
+		var isExist = false;
+		var jsonData = JSON.stringify(arrGoodsCd);
+		gagajf.ajaxJsonSubmit('/order/sample/goods/info', jsonData, function(result) {
+			$.each(result, function(idx, item) {
+				isExist = false;
+				gridOptions.api.forEachNode(function(rowNode, index) {
+					//중복상품 여부 확인
+					if (item.goodsCd == rowNode.data.goodsCd){
+						isExist = true;
+					}
+				});
+				
+				if(!isExist){
+					var data = {
+						no: index
+						, sysImgNm : item.sysImgNm
+						, goodsCd : item.goodsCd
+						, compsGoodsCd : item.repGoodsCd
+						, goodsNm : item.goodsNm
+						, ordQty : 1
+						, optCd2 : item.siteCd
+						, stockQtySum : item.stockQtySum
+						, goodsStat : item.goodsStat
+						, styleYear : item.styleYear
+						, seasonCd : item.seasonCd
+						, listPrice : item.listPrice
+						, currPrice : item.currPrice
+						, priceUpdDt : item.priceUpdDt
+						, erpStockLinkYn : item.erpStockLinkYn
+						, formalGb : item.formalGb
+						, returnableYn : item.returnableYn
+						, regDt : item.regDt
+						, regNm : item.regNm
+						, updDt : item.updDt
+						, updNm : item.updNm
+					};
+					
+					//그리드 마지막에 추가해야함
+					gridOptions.api.updateRowData({add: [data], addIndex: idx});
+					gridOptions.api.refreshCells();
+					index++;
+				}
+			});
+		});
+	}
+
+	//상품삭제
+	var fnGoodsDeleteRow = function() {
+		var selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		//화면에서 삭제
+		gagaAgGrid.removeRowData(gridOptions, false);
+	}
+
+	// 저장
+	$('#btnCreateOrderSample').on('click', function() {
+		// 입력 값 체크
+		let selectedData = gagaAgGrid.selectedRowData(gridOptions);
+		
+		if (selectedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		let optChk = true;
+		let qtyChk = true;
+		$.each(selectedData, function(idx, item) {
+			if (gagajf.isNull(item.optCd)) {
+				optChk = false;
+			} else if (item.ordQty <= 0) {
+				qtyChk = false;
+			}
+		});
+		
+		if (!optChk) {
+			mcxDialog.alert('주문옵션이 없습니다.');
+			return false;
+		}
+		
+		if (!qtyChk) {
+			mcxDialog.alert('주문수량은 0보다 커야 됩니다.');
+			return false;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = {};
+				params.custNo = $('#custNo').val();
+				params.ordNm = $('#ordNm').val();
+				params.ordPhnno = $('#ordPhnno').val();
+				params.ordEmail = $('#ordEmail').val();
+				params.recipZipcode = $('#recipZipcode').val();
+				params.recipBaseAddr = $('#recipBaseAddr').val();
+				params.recipDtlAddr = $('#recipDtlAddr').val();
+				params.goods = selectedData;
+				
+				let jsonData = JSON.stringify(params);
+				
+				gagajf.ajaxJsonSubmit($('#orderSamplePopupForm').prop('action'), jsonData, function(result) {
+					uifnPopupClose('popupOrderSample');
+				});
+			}
+		});
+	});
+
+	// 회원정보 적용
+	var fnApplyCustomerInfo = function() {
+		var params = {};
+		params.searchGb = 'custNo';
+		params.searchTxt = $('#orderSamplePopupForm input[name=custNo]').val();
+		
+		var jsonData = JSON.stringify(params);
+		
+		gagajf.ajaxJsonSubmit('/customer/active/list', jsonData, function(result) {
+			let param = result[0];
+			
+			$('#ordNm').val(param.custNm);
+			$('#ordPhnno').val(param.cellPhnno);
+			$('#ordEmail').val(param.email);
+			$('#recipZipcode').val(param.homeZipcode);
+			$('#recipBaseAddr').val(param.homeBaseAddr);
+			$('#recipDtlAddr').val(param.homeDtlAddr);
+		});
+	}
+
+	var fnOpenDaumAddr = function() {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				$('#exchangeRequestFrm input[name=recipZipcode]').val(data.zonecode);
+				$('#exchangeRequestFrm input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				$('#exchangeRequestFrm input[name=recipDtlAddr]').focus();
+				
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+		
+		cfnOpenDaumAddr(daumZip);
+	}
+	
+	var fnChangeOption = function(param) {
+		var params = {};
+		params.goodsCd = $(param).attr('goodsCd');
+		params.siteCd = $(param).val();
+		
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/order/sample/goods/stock', jsonData, function(result) {
+			gridOptions.api.forEachNode(function(rowNode, index) {
+				if (result.goodsCd == rowNode.data.compsGoodsCd){
+					rowNode.data.stockQtySum = result.minOrdQty;
+					console.log(result);
+					rowNode.data.optCd = result.siteCd;
+					gridOptions.api.updateRowData({update: [rowNode.data]});
+				}
+			});
+		});
+	}
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridGoodsList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>