tsit05 vor 4 Jahren
Ursprung
Commit
1009c7e935

+ 111 - 0
src/main/java/com/style24/persistence/domain/Pos.java

@@ -0,0 +1,111 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 출고처 Domain
+ * 
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class Pos extends TscBaseDomain {
+
+	private String delvLocCd;			// 출고처코드
+	private String delvLocNm;			// 출고처명
+	private String supplyCompCd;		// 공급업체코드
+	private String supplyCompNm;		// 공급업체명
+	private String delvLocClsf;			// 출고처종류
+	private String delvLocClsfNm;		// 출고처종류명
+	private Integer delvAssignOrd;		// 출고지정순서
+	private String delvAssignGrade;		// 출고지정등급
+	private float stockApplRate;		// 재고적용율
+	private float delvFeeRate;			// 출고수수료율
+	private String delvLocZipcode;		// 출고처우편번호
+	private String delvLocBaseAddr;		// 출고처기본주소
+	private String delvLocDtlAddr;		// 출고처상세주소
+	private String rtnLocZipcode;		// 반품처우편번호
+	private String rtnLocBaseAddr;		// 반품처기본주소
+	private String rtnLocDtlAddr;		// 반품처상세주소
+	private String rtnLocNm;			// 반품처명
+	private String invoicePrintType;	// 송장출력형태(공통코드G025)
+	private String useYn;				// 사용여부
+
+	private String ordNm; 
+	private String optCd1; 
+	private String optCd2;
+	private int ordQty;
+	private String ordDt;
+	private String recipNm; 
+	private String recipPhnno; 
+	private String recipTelno;
+	private String recipZipcode; 
+	private String recipBaseAddr; 
+	private String recipDtlAddr; 
+	private String recipAddr;
+	private String delvMemo; 
+	private String goodsCd; 
+	private String goodsNm; 
+	private String goodsNum; 
+	private String imgPath1;
+	private String delvArGb; 
+	private String delvArGbY;  
+	private String delvArGbN;
+	private String ordDtlStat; 
+	private String delvStdt; 
+	private String invoiceNo; 
+	private String goodsType;
+	private String goodsTypeNm;
+	private String shipCompCd; 
+	private String rejectReason; 
+	private String delvArGbCnl;
+	private String waitOrdStDate;
+	private String waitOrdEdDate;
+	private String deliveryStDate;
+	private String deliveryEdDate;
+	private String confirmStDate;
+	private String confirmEdDate;
+	private String usacStDate;
+	private String usacEdDate;
+	private String banDelvStDate;
+	private String banDelvEdDate;
+	private String delvBanStdt;
+	private String delvBanEddt;
+	private String delvLocCdChk;
+	private String chkYn;
+	private String ordDtlNos;
+	private String delYn;
+	private String addInvoiceYn;
+	
+	private String cdRtoutshop; //CD_RTOUTSHOP
+	private String cdStyle; //CD_STYLE
+	private String cdColor; //CD_COLOR
+	private String cdSize; //CD_SIZE
+	private String qtRtout; //QT_RTOUT
+	private String dsInvoice;// DS_INVOICE
+	private String noIf; //NO_IF
+	private String dtSale; // DT_SALE
+	private int  qtSale;//QT_SALE
+	private int amAcsale; //AM_ACSALE
+	private String dsRemark; //DS_REMARK
+	
+	
+	private Integer ordNo; 
+	private Integer ordDtlNo;
+	private Integer delvArNo; 
+	private Integer ordDtlItemSq;
+	
+	private int assignQty;
+	private int saleQty;
+	
+
+	private String[] ordDtlNoArr;
+	
+	// 검색조건
+	private String searchGb;
+	private String searchTxt;
+
+}

+ 475 - 0
src/main/java/com/style24/persistence/mybatis/shop/TssPos.xml

@@ -0,0 +1,475 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.scm.biz.dao.TssPosDao">
+
+	<!-- 매장로그인정보 조회   -->
+	<select id="getStoreLoginInfo" parameterType="Pos" resultType="Pos">
+		/*TssPos.getStoreLoginInfo*/
+		SELECT DELV_LOC_CD
+		     , DELV_LOC_NM
+		     , DELV_LOC_CLSF
+		     , SUPPLY_COMP_CD
+		     , DELV_FEE_RATE
+		FROM   TB_DELIVERY_LOC
+		WHERE  DELV_LOC_CD   = #{delvLocCd}
+		 AND    DELV_LOC_CLSF = 'G024_21' -- 직송매장
+		AND    USE_YN        = 'Y'
+	</select>
+
+	<!-- 출고대기목록 조회   -->
+	<select id="getPosDeliveryList" parameterType="Pos" resultType="Pos">
+		/*TssPos.getPosDeliveryList*/
+		SELECT 
+			  A.ORD_NO 
+			, A.ORD_NM 
+			, B.ORD_DTL_NO
+			, C.OPT_CD1 
+			, C.OPT_CD2
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY  AS SALE_QTY
+			, (B.ORD_QTY - B.CNCL_RTN_QTY)  AS ORD_QTY
+			, DATE_FORMAT(A.ORD_DT,'%Y%m%d%H%i%s') AS ORD_DT
+			, D.RECIP_NM 
+			, D.RECIP_PHNNO 
+			, D.RECIP_TELNO 
+			, D.RECIP_ZIPCODE 
+			, D.RECIP_BASE_ADDR 
+			, D.RECIP_DTL_ADDR 
+			, CONCAT(D.RECIP_BASE_ADDR ,' ',D.RECIP_DTL_ADDR  ) AS RECIP_ADDR
+			, D.DELV_MEMO 
+			, B.GOODS_CD 
+			, E.GOODS_NM 
+			, E.GOODS_NUM 
+			, (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG I WHERE I.GOODS_CD = B.GOODS_CD AND I.COLOR_CD = C.OPT_CD1 AND I.DEFAULT_IMG_YN = 'Y') AS IMG_PATH1
+			, G.DELV_AR_GB 
+			, G.DELV_AR_GB AS DELV_AR_GB_Y  
+			, G.DELV_AR_GB AS DELV_AR_GB_N
+			, B.ORD_DTL_STAT 
+			, B.DELV_STDT 
+			, B.INVOICE_NO 
+			, B.GOODS_TYPE
+			, FN_GET_CODE_NM('G056', B.GOODS_TYPE) AS GOODS_TYPE_NM
+			, CASE WHEN B.SHIP_COMP_CD IS NULL THEN 'D1029' ELSE B.SHIP_COMP_CD END AS SHIP_COMP_CD
+			, G.REJECT_REASON 
+			, CASE WHEN (B.ORD_DTL_STAT = 'G013_30' OR B.ORD_DTL_STAT = 'G013_40') AND G.DELV_AR_GB ='Y' THEN 'Y' ELSE 'N' END  AS DELV_AR_GB_CNL
+			, #{delvLocCd}   AS DELV_LOC_CD
+			, #{delvFeeRate} AS DELV_FEE_RATE
+		  FROM TB_ORDER             A
+		  JOIN TB_ORDER_DETAIL      B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_DTL_NO = C.ORD_DTL_NO 
+		  JOIN TB_DELIVERY_ADDR     D ON B.DELV_ADDR_SQ = D.DELV_ADDR_SQ 
+		  JOIN TB_GOODS             E ON B.GOODS_CD = E.GOODS_CD 
+		  JOIN TB_DELIVERY_ASSIGN   G ON B.ORD_NO = G.ORD_NO AND B.ORD_DTL_NO = G.ORD_DTL_NO AND B.DELV_LOC_CD = G.DELV_LOC_CD 
+		 WHERE 1=1
+		   AND B.DELV_LOC_CD  = #{delvLocCd} 
+			<if test="ordDtlStat != null and ordDtlStat != ''">
+			  <if test='ordDtlStat == "all"'>
+			AND    B.ORD_DTL_STAT IN ('G013_30','G013_40')
+			</if>
+			<if test='ordDtlStat != "all"'>
+			AND    B.ORD_DTL_STAT = #{ordDtlStat}
+			</if>
+			</if>
+			<if test="delvArGb != null and delvArGb != ''">
+			AND    G.DELV_AR_GB = #{delvArGb}
+			</if>
+			<if test="ordNo != null and ordNo != ''"> 
+			AND    A.ORD_NO = #{ordNo}
+			</if>
+			<if test="waitOrdStDate != null and waitOrdStDate != '' and waitOrdEdDate != null and waitOrdEdDate != ''">
+			AND    G.REG_DT BETWEEN DATE_FORMAT(replace(#{waitOrdStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{waitOrdEdDate},'-',''),'%Y%m%d%H%i%s'), INTERVAL 1 DAY)
+			</if>
+			<if test="deliveryStDate != null and deliveryStDate != '' and deliveryEdDate != null and deliveryEdDate != ''">
+			AND    B.REG_DT BETWEEN DATE_FORMAT(replace(#{deliveryStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{deliveryEdDate},'-',''),'%Y%m%d%H%i%s'),INTERVAL 1 DAY)
+			</if>
+			<if test="confirmStDate != null and confirmStDate != '' and confirmEdDate != null and confirmEdDate != ''">
+			AND    B.REG_DT BETWEEN DATE_FORMAT(replace(#{confirmStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{confirmEdDate},'-',''),'%Y%m%d%H%i%s'),INTERVAL 1 DAY)
+			</if>			
+			<if test="recipNm != null and recipNm != ''">
+			AND    D.RECIP_NM = #{recipNm}
+			</if>
+			AND    E.SELF_GOODS_YN = 'Y'
+			AND    E.SUPPLY_COMP_CD = #{supplyCompCd}
+
+		   
+	</select>
+
+	<!-- 확정대기목록 조회   -->
+	<select id="getPosConfirmList" parameterType="Pos" resultType="Pos">
+		/*TssPos.getPosConfirmList*/
+		SELECT 
+			  A.ORD_NO 
+			, A.ORD_NM 
+			, B.ORD_DTL_NO
+			, C.OPT_CD1 
+			, C.OPT_CD2
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY  AS SALE_QTY
+			, (B.ORD_QTY - B.CNCL_RTN_QTY)  AS ORD_QTY
+			, DATE_FORMAT(A.ORD_DT,'%Y%m%d%H%i%s') AS ORD_DT
+			, D.RECIP_NM 
+			, D.RECIP_PHNNO 
+			, D.RECIP_TELNO 
+			, D.RECIP_ZIPCODE 
+			, D.RECIP_BASE_ADDR 
+			, D.RECIP_DTL_ADDR 
+			, CONCAT(D.RECIP_BASE_ADDR ,' ',D.RECIP_DTL_ADDR  ) AS RECIP_ADDR
+			, D.DELV_MEMO 
+			, B.GOODS_CD 
+			, E.GOODS_NM 
+			, E.GOODS_NUM 
+			, (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG I WHERE I.GOODS_CD = B.GOODS_CD AND I.COLOR_CD = C.OPT_CD1 AND I.DEFAULT_IMG_YN = 'Y') AS IMG_PATH1
+			, G.DELV_AR_GB 
+			, G.DELV_AR_GB AS DELV_AR_GB_Y  
+			, G.DELV_AR_GB AS DELV_AR_GB_N
+			, B.ORD_DTL_STAT 
+			, B.DELV_STDT 
+			, B.INVOICE_NO 
+			, B.GOODS_TYPE
+			, FN_GET_CODE_NM('G056', B.GOODS_TYPE) AS GOODS_TYPE_NM
+			, CASE WHEN B.SHIP_COMP_CD IS NULL THEN 'D1029' ELSE B.SHIP_COMP_CD END AS SHIP_COMP_CD
+			, G.REJECT_REASON 
+			, CASE WHEN (B.ORD_DTL_STAT = 'G013_30' OR B.ORD_DTL_STAT = 'G013_40') AND G.DELV_AR_GB ='Y' THEN 'Y' ELSE 'N' END  AS DELV_AR_GB_CNL
+			, #{delvLocCd}   AS DELV_LOC_CD
+			, #{delvFeeRate} AS DELV_FEE_RATE
+		  FROM TB_ORDER             A
+		  JOIN TB_ORDER_DETAIL      B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_DTL_NO = C.ORD_DTL_NO 
+		  JOIN TB_DELIVERY_ADDR     D ON B.DELV_ADDR_SQ = D.DELV_ADDR_SQ 
+		  JOIN TB_GOODS             E ON B.GOODS_CD = E.GOODS_CD 
+		  JOIN TB_DELIVERY_ASSIGN   G ON B.ORD_NO = G.ORD_NO AND B.ORD_DTL_NO = G.ORD_DTL_NO AND B.DELV_LOC_CD = G.DELV_LOC_CD 
+		 WHERE 1=1
+		   AND B.DELV_LOC_CD  = #{delvLocCd} 
+			<if test="ordDtlStat != null and ordDtlStat != ''">
+			  <if test='ordDtlStat == "all"'>
+			AND    B.ORD_DTL_STAT IN ('G013_40','G013_50','G013_60')
+			</if>
+			<if test='ordDtlStat != "all"'>
+			AND    B.ORD_DTL_STAT = #{ordDtlStat}
+			</if>
+			</if>
+			<if test="delvArGb != null and delvArGb != ''">
+			AND    G.DELV_AR_GB = #{delvArGb}
+			</if>
+			<if test="ordNo != null and ordNo != ''"> 
+			AND    A.ORD_NO = #{ordNo}
+			</if>
+			<if test="waitOrdStDate != null and waitOrdStDate != '' and waitOrdEdDate != null and waitOrdEdDate != ''">
+			AND    G.REG_DT BETWEEN DATE_FORMAT(replace(#{waitOrdStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{waitOrdEdDate},'-',''),'%Y%m%d%H%i%s'), INTERVAL 1 DAY)
+			</if>
+			<if test="deliveryStDate != null and deliveryStDate != '' and deliveryEdDate != null and deliveryEdDate != ''">
+			AND    B.REG_DT BETWEEN DATE_FORMAT(replace(#{deliveryStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{deliveryEdDate},'-',''),'%Y%m%d%H%i%s'),INTERVAL 1 DAY)
+			</if>
+			<if test="confirmStDate != null and confirmStDate != '' and confirmEdDate != null and confirmEdDate != ''">
+			AND    B.REG_DT BETWEEN DATE_FORMAT(replace(#{confirmStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{confirmEdDate},'-',''),'%Y%m%d%H%i%s'),INTERVAL 1 DAY)
+			</if>			
+			<if test="recipNm != null and recipNm != ''">
+			AND    D.RECIP_NM = #{recipNm}
+			</if>
+			AND    E.SELF_GOODS_YN = 'Y'
+			AND    E.SUPPLY_COMP_CD = #{supplyCompCd}
+
+		   
+	</select>
+	
+	<!--출고지정 수정 -->
+	<update id="updateDeliveryAssign" parameterType="Pos">
+		/*TssPos.updateDeliveryAssign*/
+		UPDATE TB_DELIVERY_ASSIGN
+		SET    DELV_AR_GB = #{delvArGb}
+		     , DELV_AR_NO = #{delvArNo}
+		     , DELV_AR_DT = NOW()
+		     , UPD_DT = NOW()
+		     , UPD_NO = #{updNo}
+		<if test="rejectReason != null and rejectReason != ''">
+		     , REJECT_REASON = #{rejectReason}
+		</if>
+		WHERE  ORD_DTL_NO = #{ordDtlNo}
+		AND    DELV_LOC_CD = #{delvLocCd}
+		AND    DELV_AR_GB = 'P'
+	</update>
+
+	<!--출고지정 HST-->
+	<insert id="createDeliveryAssignHst">
+		/* TssPos.createDeliveryAssignHst */
+		INSERT INTO	TB_DELIVERY_ASSIGN_HST (
+			  DELV_ASSIGN_SQ
+			, ORD_DTL_NO
+			, DELV_LOC_CD
+			, ASSIGN_QTY
+			, DELV_AR_GB
+			, DELV_AR_NO
+			, DELV_AR_DT
+			, REJECT_REASON
+			, REG_NO
+			, REG_DT
+			, ORD_NO
+			, UPD_NO
+			, UPD_DT
+			, HST_REG_DT
+		)
+		VALUES (
+			  (SELECT MAX(DELV_ASSIGN_SQ) FROM TB_DELIVERY_ASSIGN A WHERE A.ORD_NO = #{ordNo} AND A.ORD_DTL_NO = #{ordDtlNo} AND A.DELV_LOC_CD = #{delvLocCd} )
+			, #{ordDtlNo}
+			, #{delvLocCd}
+			, #{assignQty}
+			, #{delvArGb}
+			, #{delvArNo}
+			, NOW()
+			, #{rejectReason}
+			, #{regNo}
+			, NOW()
+			, #{ordNo}
+			, #{regNo}
+			, NOW()
+			, NOW()
+		)
+	</insert>
+
+	<!--주문상세 변경-->
+	<update id="updateOrderDetail" parameterType="Pos">
+		/* TssPos.updateOrderDetail */
+		UPDATE TB_ORDER_DETAIL
+		SET   UPD_DT = NOW()
+			, UPD_NO = #{updNo}
+			, ORD_DTL_STAT = #{ordDtlStat}
+		<if test='delvArGb == "Y"'>
+			, DELV_LOC_CD      = #{delvLocCd}
+			, DELV_ASSIGN_DT   = NOW()
+			, DELV_ASSIGN_STAT = 'Y'
+		</if>
+		<if test='delvArGb == "N"'>
+			, DELV_LOC_CD       = NULL
+			, DELV_ASSIGN_DT    = NULL
+			, DELV_ASSIGN_STAT  = 'P'
+			, SHIP_COMP_CD      = NULL
+			, INVOICE_NO        = NULL
+			, INVOICE_SEND_YN   = 'N'
+		</if>
+		<if test='invoiceNo != "" and invoiceNo != null '>
+			, SHIP_COMP_CD    = #{shipCompCd}
+			, INVOICE_NO      = #{invoiceNo}
+			, INVOICE_SEND_YN = 'Y'
+		</if>
+		WHERE ORD_DTL_NO = #{ordDtlNo}
+	</update>
+	
+	<!-- 출고금지상품 등록 -->
+	<insert id="createBangoods" parameterType="Pos">
+		/* TssPos.createBangoods */
+		INSERT INTO TB_DELIVERY_BAN_GOODS (
+			  DELV_LOC_CD
+			, GOODS_CD
+			, OPT_CD1
+			, OPT_CD2
+			, DELV_BAN_STDT
+			, DELV_BAN_EDDT
+			, DEL_YN
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT
+		)
+		VALUES (
+			  #{delvLocCd}
+			, #{goodsCd}
+			, #{optCd1}
+			, #{optCd2}
+			, DATE_FORMAT(replace(#{delvBanStdt},'-',''),'%Y-%m-%d')
+			, DATE_FORMAT(replace(#{delvBanEddt},'-',''),'%Y-%m-%d')
+			, 'N'
+			, #{regNo}
+			, NOW()
+			, #{updNo}
+			, NOW()
+		)
+	</insert>	
+	
+	<!-- 주문상세 아이템 조회   -->
+	<select id="getOrdDtlItemList" parameterType="Pos" resultType="Pos">
+		/*TssPos.getOrdDtlItemList*/
+		SELECT 
+			  B.DELV_LOC_CD 
+			, C.ITEM_CD AS GOODS_CD
+			, C.OPT_CD1 
+			, C.OPT_CD2 
+		  FROM TB_ORDER A 
+		  JOIN TB_ORDER_DETAIL B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+		 WHERE B.ORD_DTL_NO  = #{ordDtlNo}
+	</select>
+	
+	<!-- 출고처 체크    -->
+	<select id="getDelvLocChk" parameterType="Pos" resultType="Pos">
+		/*TssPos.getDelvLocChk*/
+		SELECT CASE WHEN COUNT(*) > 0 THEN 'S' ELSE 'F' END AS DELV_LOC_CD_CHK
+			 , CASE WHEN ORD_DTL_STAT ='G013_35' THEN 'Y' ELSE 'N'  END AS CHK_YN
+		  FROM TB_ORDER_DETAIL
+		 WHERE ORD_DTL_NO  = #{ordDtlNo} 
+		   AND DELV_LOC_CD = #{delvLocCd} 
+	</select>
+	
+	<!-- 주문상세상태 조회  -->
+	<select id="getOrderDtlStat"  resultType="Pos">
+		/* TssPos.getOrderDtlStat */
+		SELECT A.ORD_NO
+		     , B.ORD_DTL_NO
+		     , B.INVOICE_NO
+		     , B.ORD_DTL_STAT
+		     , B.DELV_LOC_CD
+		FROM   TB_ORDER A
+		     , TB_ORDER_DETAIL B
+		WHERE  A.ORD_NO = B.ORD_NO
+		AND    B.ORD_DTL_NO = #{ordDtlNo}
+	</select>	
+	
+	<!--CnPlus 엑셀 다운로드 조회 -->
+	<select id="getOrderExcelList" parameterType="Pos" resultType="paramMap">
+		/* TssPos.getOrderExcelList */
+        SELECT ' '                                   AS RSRVT_GB     -- 예약구분: ( 일반/ 반품) 공란이면 선택한 형식적용
+             , ' '                                   AS SCHDL_CLDT   -- 집하예정일 (공란이면 자동 적용)
+             , C.RECIP_NM                                           -- 받는분 성명
+             , C.RECIP_PHNNO                                        -- 받는분 전화번호 
+             , C.RECIP_TELNO                                        -- 받는분기타연락처 
+             , C.RECIP_ZIPCODE                                      -- 받는분 우편번호 
+             , CONCAT(C.RECIP_BASE_ADDR,' ',C.RECIP_DTL_ADDR)  AS RECIP_ADDR   -- 받는분 주소(전체)
+             , ' ' AS INVOICE_NO                                         -- 운송장번호 
+             , A.ORD_NO                                             -- 고객주문번호 
+             , CONCAT(D.GOODS_NM,'/',M.WMS_COLOR_NM ,'/',G.OPT_CD2 ,'  x', ((B.ORD_QTY-B.CNCL_RTN_QTY) * G.ITEM_QTY))  AS GOODS_NM  -- 품목명 
+             , ' '                                   AS BOX_QTY      -- 박스수량 (공란이면 1로인식)
+             , ' '                                   AS BOX_TYPE     -- 박스타입 (공란이면 화면기준적용) 
+             , ' '                                   AS FEE          -- 기본운임 (운임합계) 
+             , C.DELV_MEMO                           AS DELV_MEMO    -- 배달메시지1
+             , ' '                                   AS DELV_MEMO2   -- 배달메시지2 
+             , CONCAT(D.GOODS_CD,'/',M.WMS_COLOR_NM ,'/',G.OPT_CD2 ,'  x', ((B.ORD_QTY-B.CNCL_RTN_QTY) * G.ITEM_QTY)) AS GOODS_CD
+        FROM  TB_ORDER A
+        JOIN  TB_ORDER_DETAIL B       ON A.ORD_NO = B.ORD_NO 
+        JOIN  TB_ORDER_DETAIL_ITEM G  ON B.ORD_NO = G.ORD_NO AND B.ORD_DTL_NO = G.ORD_DTL_NO 
+        JOIN  TB_DELIVERY_ADDR C      ON B.DELV_ADDR_SQ = C.DELV_ADDR_SQ 
+        JOIN  TB_GOODS D              ON D.GOODS_CD = G.ITEM_CD 
+        JOIN  TB_WMS_COLOR_MAPPING M  ON B.SUPPLY_COMP_CD = M.SUPPLY_COMP_CD  AND G.OPT_CD1 = M.COLOR_CD 
+       WHERE B.ORD_DTL_NO IN
+		<foreach collection="ordDtlNoArr" item="item" index="index"  open="(" close=")" separator=",">
+		      #{item}
+		</foreach>
+	</select>
+	
+    <!-- 주문상세송장 -  송장정보 저장 -->
+    <insert id="insertTbOderDetailInvoice" parameterType="Pos">
+        /* TssPos.insertTbOderDetailInvoice */
+		INSERT INTO TB_ORDER_DETAIL_INVOICE
+		(
+		      ORD_NO
+		    , ORD_DTL_NO
+		    , INVOICE_NO
+		    , ADD_INVOICE_YN
+		    , SWT_TRC_SEND_YN
+		    , DEL_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		VALUES
+		(
+		      #{ordNo}
+		    , #{ordDtlNo}
+		    , #{invoiceNo}
+		    , 'N'
+		    , 'N'
+		    , #{delYn}
+		    , #{regNo}
+		    , NOW()
+		    , #{regNo}
+		    , NOW()
+		)
+    </insert>
+    		
+	<!--출고지정 취소 -->
+	<update id="updateDeliveryAssignCancel" parameterType="Pos">
+		/*TsaDelivery.updateDeliveryAssignCancel*/
+		UPDATE TB_DELIVERY_ASSIGN
+		SET    DELV_AR_GB = #{delvArGb}
+		     , DELV_AR_NO = #{delvArNo}
+		     , DELV_AR_DT = NOW()
+		     , UPD_DT     = NOW()
+		     , UPD_NO     = #{updNo}
+		<if test="rejectReason != null and rejectReason != ''">
+		     , REJECT_REASON = #{rejectReason}
+		</if>
+		WHERE  ORD_DTL_NO = #{ordDtlNo}
+		AND    DELV_LOC_CD = #{delvLocCd}
+		AND    DELV_AR_GB = 'Y'
+	</update>
+	
+	<!-- ERP 주문상세 아이템 조회   -->
+	<select id="getSendErpList" parameterType="Pos" resultType="Pos">
+		/*TssPos.getSendErpList*/
+		SELECT 
+			  B.DELV_LOC_CD                               AS CD_RTOUTSHOP
+			, C.ITEM_CD                                   AS CD_STYLE
+			, C.OPT_CD1                                   AS CD_COLOR
+			, C.OPT_CD2                                   AS CD_SIZE
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY   AS QT_RTOUT
+			, B.INVOICE_NO                                AS DS_INVOICE
+			, DATE_FORMAT(NOW(),'%Y%m%d%H%i%s')           AS NO_IF
+			, DATE_FORMAT(NOW(),'%Y%m%d')                 AS DT_SALE
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY   AS QT_SALE
+			, C.ORD_AMT - C.CNCL_RTN_AMT                  AS AM_ACSALE
+			, ''                                          AS DS_REMARK
+			, C.ORD_DTL_ITEM_SQ 
+		  FROM TB_ORDER A 
+		  JOIN TB_ORDER_DETAIL B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+		 WHERE B.ORD_DTL_NO  = #{ordDtlNo}
+	</select>
+		
+	<!-- 정산 조회   -->
+	<select id="getPosUsacList" parameterType="Pos" resultType="Pos">
+		/*TssPos.getPosUsacList*/
+		SELECT 
+			  B.DELV_LOC_CD                               AS CD_RTOUTSHOP
+			, C.ITEM_CD                                   AS CD_STYLE
+			, C.OPT_CD1                                   AS CD_COLOR
+			, C.OPT_CD2                                   AS CD_SIZE
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY   AS QT_RTOUT
+			, B.INVOICE_NO                                AS DS_INVOICE
+			, DATE_FORMAT(NOW(),'%Y%m%d%H%i%s')           AS NO_IF
+			, DATE_FORMAT(NOW(),'%Y%m%d')                 AS DT_SALE
+			, (B.ORD_QTY - B.CNCL_RTN_QTY) * C.ITEM_QTY   AS QT_SALE
+			, C.ORD_AMT - C.CNCL_RTN_AMT                  AS AM_ACSALE
+			, ''                                          AS DS_REMARK
+			, C.ORD_DTL_ITEM_SQ 
+		  FROM TB_ORDER A 
+		  JOIN TB_ORDER_DETAIL B ON A.ORD_NO = B.ORD_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM C ON B.ORD_NO = C.ORD_NO AND B.ORD_DTL_NO = C.ORD_DTL_NO 
+		 WHERE B.ORD_DTL_NO  = #{ordDtlNo}
+	</select>
+			
+	<!-- 매장거부 목록 -->
+	<select id="getDeliveryAssignList" parameterType="Pos" resultType="Pos">
+		/* TssPos.getDeliveryAssignList */
+		SELECT DA.ORD_NO
+		    , FN_GET_CODE_NM('G300', DA.REJECT_REASON) AS REJECT_REASON
+		    , G.BRAND_CD
+		    , GI.SYS_IMG_NM AS IMG_PATH1
+		    , G.GOODS_NM
+		    , ODI.ITEM_CD AS GOODS_CD
+		    , ODI.OPT_CD1 
+		    , ODI.OPT_CD2		    
+		    , DATE_FORMAT(DA.DELV_AR_DT, '%Y-%m-%d %H:%i:%s') AS DELV_BAN_STDT
+		FROM TB_DELIVERY_ASSIGN DA
+		JOIN TB_ORDER_DETAIL_ITEM ODI ON DA.ORD_DTL_NO = ODI.ORD_DTL_NO 
+		JOIN TB_GOODS G               ON ODI.ITEM_CD = G.GOODS_CD 
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD AND GI.DEFAULT_IMG_YN ='Y'
+		WHERE DA.DELV_AR_GB ='N'
+		AND   G.SUPPLY_COMP_CD = #{supplyCompCd}
+		<if test='goodsCd != null and goodsCd != ""'>
+		AND G.GOODS_CD LIKE CONCAT(UPPER(#{goodsCd}), '%')
+		</if>
+		AND DA.DELV_LOC_CD = #{delvLocCd}
+		<if	test="banDelvStDate != null and banDelvStDate != '' and banDelvEdDate != null and banDelvEdDate != ''">
+		AND DA.DELV_AR_DT BETWEEN DATE_FORMAT(replace(#{banDelvStDate},'-',''),'%Y%m%d%H%i%s') AND DATE_ADD(DATE_FORMAT(replace(#{banDelvEdDate},'-',''),'%Y%m%d%H%i%s'), INTERVAL 1 DAY)
+		</if>
+		ORDER BY DA.DELV_AR_DT DESC
+	</select>			
+	
+</mapper>

+ 179 - 0
src/main/java/com/style24/scm/biz/dao/TssPosDao.java

@@ -0,0 +1,179 @@
+package com.style24.scm.biz.dao;
+
+import java.util.Collection;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Pos;
+import com.style24.persistence.domain.Erp;
+
+/**
+ * 매장POS Dao
+ *
+ * @author moon
+ * @since 2021. 06. 11
+ */
+@ShopDs
+public interface TssPosDao {
+
+	
+	/**
+	 * 매장로그인정보 조회
+	 * @param Pos
+	 * @return
+	 * @author moon
+	 * @since 2021. 06. 11
+	 */
+	Pos getStoreLoginInfo(Pos pos);
+	
+	/**
+	 * 출고대기목록, 출고목록
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 11
+	 */
+	Collection<Pos> getPosDeliveryList(Pos pos);
+	
+	/**
+	 * 확정대기목록
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	Collection<Pos> getPosConfirmList(Pos pos);	
+	
+	/**
+	 * 출고수락 
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */	
+	int updateDeliveryAssign(Pos pos);
+	
+	/**
+	 * 출고 이력등록
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */	
+	int createDeliveryAssignHst(Pos pos);	
+	
+	/**
+	 * 주문상세상태 변경
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */	
+	int updateOrderDetail(Pos pos);
+	
+	
+	/**
+	 * 출고금지상품 등록
+	 *
+	 * @param Pos
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */
+	void createBangoods(Pos pos);
+	
+	/**
+	 * 주문상세아이템리스트 
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */
+	Collection<Pos> getOrdDtlItemList(Pos pos);
+	
+	
+	/**
+	 * 출고처 체크 
+	 * 
+	 * @param Pos - 매장
+	 * @return Pos
+	 * @author moon
+	 * @since 2021. 06. 14
+	 */
+	Pos getDelvLocChk(Pos pos);
+	
+	/**
+	 * 주문상세 상태 조회 
+	 * 
+	 * @param Pos - 매장
+	 * @return Pos
+	 * @author moon
+	 * @since 2021. 06. 14
+	 */	
+	Pos getOrderDtlStat(Pos pos);
+	
+	/**
+	 * Cnplus엑셀다운로드
+	 * 
+	 * @param pos - 매장
+	 * @return Collection<TsaPos>
+	 * @author moon
+	 * @since 2021. 06. 14
+	 */
+	Collection<GagaMap> getOrderExcelList(Pos pos);	
+	
+	/**
+	 * 송장번호 등록
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */	
+	int insertTbOderDetailInvoice(Pos pos);
+
+	/**
+	 * 출고처지정 취소
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */	
+	int updateDeliveryAssignCancel(Pos pos);	
+	
+	/**
+	 * ERP - 주문상세아이템리스트 
+	 * 
+	 * @param Pos - 매장
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	Collection<Pos> getSendErpList(Pos pos);	
+	
+	/**
+	 * 매장 POS 정산내역
+	 * 
+	 * @param pos - 매장
+	 * @return Collection<TsaPos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	Collection<Pos> getPosUsacList(Pos pos);	
+	
+	/**
+	 * 매장거부 목록
+	 *
+	 * @param Pos
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	Collection<Pos> getDeliveryAssignList(Pos pos);	
+}

+ 564 - 0
src/main/java/com/style24/scm/biz/service/TssPosService.java

@@ -0,0 +1,564 @@
+package com.style24.scm.biz.service;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+
+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.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.excel.env.GagaExcelConstants;
+import com.gagaframework.web.util.GagaStringUtil;
+import com.style24.core.biz.dao.TscOrderChangeDao;
+import com.style24.core.biz.dao.TscOrderDao;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.core.support.env.TscConstants.OrderDetailStat;
+import com.style24.core.biz.thirdparty.HansaeErp;
+
+import com.style24.scm.biz.dao.TssPosDao;
+import com.style24.scm.support.security.session.TssSession;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Pos;
+import com.style24.persistence.domain.Erp;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 매장POS Service
+ *
+ * @author moon
+ * @since 2021. 06. 11
+ */
+@Service
+@Slf4j
+public class TssPosService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TssPosDao posDao;
+
+	@Autowired
+	private TscOrderDao orderDao;	
+	
+	@Autowired
+	private TscOrderChangeDao orderChangeDao;
+	
+	@Autowired
+	private HansaeErp hansaeErp;
+	
+	/**
+	 * 매장로그인 정보 조회
+	 * @param  Pos
+	 * @return 
+	 * @author moon
+	 * @since  2021. 06. 11
+	 */
+	@Transactional("shopTxnManager")
+	public Pos getStoreLoginInfo(Pos pos) {
+		return posDao.getStoreLoginInfo(pos);
+	}
+	
+	
+	/**
+	 * 출고대기/출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 11
+	 */
+	public Collection<Pos> getPosDeliveryList(Pos pos) {
+		return posDao.getPosDeliveryList(pos);
+	}
+	
+	/**
+	 * 확정대기목록 
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	public Collection<Pos> getPosConfirmList(Pos pos) {
+		return posDao.getPosConfirmList(pos);
+	}	
+	
+	/**
+	 * 매장POS - 출고수락
+	 *
+	 * @param Pos 
+	 * @return String
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */
+	@Transactional("shopTxnManager")
+	public String savePosDeliveryLocAssign(Pos pos) {
+		String rtn = "";
+		String chkYn = "";
+		Pos chk = posDao.getDelvLocChk(pos);
+		rtn = chk.getDelvLocCdChk();
+		chkYn = chk.getChkYn();
+		
+		if("S".equals(rtn)) {
+			if("Y".equals(chkYn)) {
+				Integer userNo = TssSession.getInfo().getUserNo();
+				pos.setRegNo(userNo);
+				pos.setUpdNo(userNo);
+				pos.setDelvArNo(userNo);
+		
+				pos.setAssignQty(pos.getOrdQty());
+				// 출고처 수락
+				posDao.updateDeliveryAssign(pos);
+				// 출고처지정 이력 삽입
+				posDao.createDeliveryAssignHst(pos);
+		
+				pos.setOrdDtlStat(OrderDetailStat.GOODS_PREPARE.value()); // 상품준비중
+		
+				// G013_35(출고처지정) -> G013_30(배송준비중) 변경
+				posDao.updateOrderDetail(pos);
+				
+				// 주문상세이력
+				Order order = new Order();
+				order.setOrdDtlNo(pos.getOrdDtlNo());
+				order.setUpdNo(userNo);
+				order.setRegNo(userNo);
+				orderDao.createOrderDetailHst(order);
+			} else {
+				rtn = chkYn;
+			}
+		}
+		return rtn;
+	}
+	
+	/**
+	 * 매장POS - 출고거부
+	 *
+	 * @param Pos 
+	 * @return String
+	 * @author moon
+	 * @since 2021. 06. 13
+	 */
+	@Transactional("shopTxnManager")
+	public String savePosDeliveryLocReject(Pos pos) {
+		String rtn   = "";
+		String chkYn = "";
+		Pos chk = posDao.getDelvLocChk(pos);
+		rtn   = chk.getDelvLocCdChk();
+		chkYn = chk.getChkYn();
+		
+		if("S".equals(rtn)) {
+			if("Y".equals(chkYn)) {
+				Integer userNo = TssSession.getInfo().getUserNo();
+				pos.setRegNo(userNo);
+				pos.setUpdNo(userNo);
+				pos.setDelvArNo(userNo);
+				pos.setAssignQty(pos.getOrdQty());
+
+				// 출고처 거부
+				posDao.updateDeliveryAssign(pos);
+		
+				// 출고처지정 이력 삽입
+				posDao.createDeliveryAssignHst(pos);
+				
+				// 주문상세번호로  아이템리스트 조회 
+				Collection<Pos> ordDtlItemList = posDao.getOrdDtlItemList(pos);
+				for (Pos param : ordDtlItemList) {
+					param.setDelvBanStdt(GagaDateUtil.getToday());
+					param.setDelvBanEddt(GagaDateUtil.getOffsetDate(2));
+					param.setRegNo(userNo);
+					param.setUpdNo(userNo);
+					// 출고금지상품 등록
+					posDao.createBangoods(param);
+				} 
+				
+				pos.setOrdDtlStat(OrderDetailStat.PAYMENT_COMPLETE.value()); // 결제완료 
+		
+				// 주문상세 출고처 업데이트
+				posDao.updateOrderDetail(pos);
+		
+				// 주문상세 이력 삽입
+				Order order = new Order();
+				order.setOrdDtlNo(pos.getOrdDtlNo()); 
+				order.setUpdNo(userNo);
+				order.setRegNo(userNo);
+				orderDao.createOrderDetailHst(order);
+				
+
+			} else {
+				rtn = chkYn;
+			}
+		}
+		return rtn;
+	}
+	
+
+
+	/**
+	 * CNPlus 엑셀다운로드
+	 * 
+	 * @param pos - 매장정보
+	 * @return Pos
+	 * @author moon
+	 * @since 2021. 06. 14
+	 */
+	public void getOrderExcelList(Pos pos, String excelFilenameWithPath) {
+
+		// 헤더 title 설정
+
+		String[] listTitles = {"예약구분", "집하예정일", "받는분성명"  //3
+			, "받는분전화번호", "받는분기타연락처", "받는분우편번호" //3
+			, "받는분주소(전체, 분할)", "운송장번호", "고객주문번호" //3
+			, "품목명", "박스수량", "박스타입", "기본운임"  //4
+			, "배송메세지1", "배송메세지2", "품목명"};  //3
+
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정
+		String[] cellNames = {"RSRVT_GB", "SCHDL_CLDT", "RECIP_NM"  //3
+			, "RECIP_PHNNO", "RECIP_TELNO", "RECIP_ZIPCODE" //3
+			, "RECIP_ADDR", "INVOICE_NO", "ORD_NO"  //3
+			, "GOODS_NM", "BOX_QTY", "BOX_TYPE", "FEE" //4
+			, "DELV_MEMO", "DELV_MEMO2", "GOODS_CD"}; //3
+
+		String[] cellTypes = {GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name(),
+			GagaExcelConstants.CellType.CHAR_LEFT.name(), GagaExcelConstants.CellType.CHAR_LEFT.name()
+		};
+		Collection<GagaMap> dataList = posDao.getOrderExcelList(pos); // map형식으로 조회
+		try {
+			GagaExcelUtil.createExcel(excelFilenameWithPath, dataList,"" ,listTitles, cellNames, cellTypes);
+			//GagaExcelUtil.createExcel(excelFilenameWithPath, dataList,"테스트" ,listTitles, cellNames, cellTypes,"",true);
+			//GagaExcelUtil.createExcel(excelFilenameWithPath, dataList , cellNames, cellTypes);
+ 
+		} catch (Exception e) {
+			throw new IllegalStateException(e);
+		}
+	}
+	
+	/**
+	 * 매장POS -송장번호 생성,배송처리
+	 *
+	 * @param Pos 
+	 * @return GagaMap
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap savePosInvoice(Pos pos) {
+
+		Pos stat = new Pos();
+		stat.setOrdDtlNo(pos.getOrdDtlNo());
+		Pos orderStat = posDao.getOrderDtlStat(stat);
+		GagaMap result = new GagaMap();
+
+		if ("G013_30".equals(orderStat.getOrdDtlStat()) && StringUtils.isBlank(orderStat.getInvoiceNo())) {
+
+			String invoiceNo = pos.getInvoiceNo();
+			Pos params = new Pos();
+			params.setOrdDtlNo(pos.getOrdDtlNo());
+			params.setOrdDtlStat(OrderDetailStat.DELIVERY_PREPARE.value()); // 배송준비중 
+			params.setUpdNo(pos.getUpdNo());
+			params.setRegNo(pos.getUpdNo());
+			params.setInvoiceNo(invoiceNo);
+			params.setDelvFeeRate(pos.getDelvFeeRate());
+
+			// 주문상세상태 변경
+			params.setShipCompCd(pos.getShipCompCd()); // 배송업체코드
+			posDao.updateOrderDetail(params);
+
+			// 주문상세 이력 삽입
+			Order order = new Order();
+			order.setOrdDtlNo(pos.getOrdDtlNo());
+			order.setUpdNo(pos.getUpdNo());
+			order.setRegNo(pos.getUpdNo());
+			orderDao.createOrderDetailHst(order);
+
+
+
+			// 송장번호 저장
+			Pos invoNo = new Pos();
+			invoNo.setOrdNo(orderStat.getOrdNo());
+			invoNo.setOrdDtlNo(pos.getOrdDtlNo());
+			invoNo.setInvoiceNo(invoiceNo);
+			invoNo.setRegNo(pos.getUpdNo());
+			invoNo.setDelYn("N");
+
+			posDao.insertTbOderDetailInvoice(invoNo);
+
+
+			result.set("status", GagaResponseStatus.SUCCESS.getCode());
+			result.setString("message", "정상처리 되었습니다.");
+		} else {
+			if ("99".equals(orderStat.getOrdDtlStat())) {
+				result.setString("message", "취소된 주문건 입니다.");
+			}
+			if (StringUtils.isNotBlank(orderStat.getInvoiceNo())) {
+				result.setString("message", "이미 송장번호가 있습니다.");
+			}
+			result.set("status", GagaResponseStatus.FAIL.getCode());
+		}
+		result.setString("ordNo", pos.getOrdNo() + "");
+		result.setString("ordDtlNo", pos.getOrdDtlNo() + "");
+
+		return result;
+	}	
+	
+	/**
+	 * 매장POS -배송처리
+	 *
+	 * @param Pos 
+	 * @return void
+	 * @author moon
+	 * @since 2021. 06. 14   == 삭제!!!
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap savePos(Pos data) {
+		
+		GagaMap result = new GagaMap();
+		Integer userNo = TssSession.getInfo().getUserNo();
+		
+		Pos stat = new Pos();
+		stat.setOrdDtlNo(data.getOrdDtlNo());
+		Pos orderStat = posDao.getOrderDtlStat(stat);
+
+		if ("G013_30".equals(orderStat.getOrdDtlStat()) && StringUtils.isBlank(orderStat.getInvoiceNo())) {
+
+			Pos params = new Pos();
+			params.setOrdDtlNo(data.getOrdDtlNo());
+			params.setOrdDtlStat(OrderDetailStat.DELIVERY_PREPARE.value()); // 40 배송준비중
+
+			params.setUpdNo(userNo);
+			params.setRegNo(userNo);
+
+			posDao.updateOrderDetail(params);
+
+			// 주문상세 이력 삽입
+			Order order = new Order();
+			order.setOrdDtlNo(data.getOrdDtlNo());
+			order.setUpdNo(userNo);
+			order.setRegNo(userNo);
+			orderDao.createOrderDetailHst(order);
+			
+			result.set("status", GagaResponseStatus.SUCCESS.getCode());
+			result.setString("message", "정상처리 되었습니다.");
+		} else {
+			if ("G013_99".equals(orderStat.getOrdDtlStat())) {
+				result.setString("message", "취소된 주문건 입니다.");
+			}
+			if (StringUtils.isNotBlank(orderStat.getInvoiceNo())) {
+				result.setString("message", "이미 송장번호가 있습니다.");
+			}
+			result.set("status", GagaResponseStatus.FAIL.getCode());
+		}
+
+		result.setString("ordNo", data.getOrdNo() + "");
+		result.setString("ordDtlNo", data.getOrdDtlNo() + "");
+
+		return result;
+	}
+	
+	/**
+	 * 매장POS - 수락취소시 주문정보 validation 확인
+	 *
+	 * @param Pos 
+	 * @return GagaMap
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	public GagaMap getPosDeliveryLocValidation(Pos pos) {
+		GagaMap result = new GagaMap();
+		
+		boolean validation = true;
+		String resultMsg = message.getMessage("SUCC_0001");
+		int status = GagaResponseStatus.SUCCESS.getCode();
+		
+		Pos orderStat = posDao.getOrderDtlStat(pos);
+		log.info("pos.getDelvLocCd() :"+pos.getDelvLocCd());
+		if(!pos.getDelvLocCd().equals(orderStat.getDelvLocCd())) {
+			validation = false;
+			resultMsg  = "출고처가 변경되었습니다.";
+		} else if(OrderDetailStat.PAYMENT_AFTER_CANCEL.value().equals(orderStat.getOrdDtlStat())) {
+			validation = false;
+			resultMsg  = "취소된 주문입니다.";
+		} else if(orderStat.getOrdDtlStat().equals(OrderDetailStat.SHIPPING.value()) || orderStat.getOrdDtlStat().equals(OrderDetailStat.DELIVERY_COMPLETE.value()) || orderStat.getOrdDtlStat().equals(OrderDetailStat.PURCHASE_CONFIRM.value())) {
+			validation = false;
+			resultMsg  = "확정완료되어 취소 할 수 없습니다.";
+		}
+		if (!validation) {
+			status = GagaResponseStatus.FAIL.getCode();
+		}
+		
+		result.setBoolean("validation", validation);
+		result.setString("resultMsg", resultMsg);
+		result.set("status", status);
+		
+		return result;
+	}
+	
+	/**
+	 * 매장POS - 수락취소
+	 *
+	 * @param pos 
+	 * @return void
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void savePosDeliveryLocRejectCancel(Pos pos) {
+
+		Integer userNo = TssSession.getInfo().getUserNo();
+		
+		pos.setRegNo(userNo);
+		pos.setUpdNo(userNo);
+		pos.setDelvArNo(userNo);
+		pos.setAssignQty(pos.getOrdQty());
+
+		pos.setDelvBanStdt(GagaDateUtil.getToday());
+		pos.setDelvBanEddt(GagaDateUtil.getOffsetDate(3));
+
+		// 출고처 수락/거부
+		posDao.updateDeliveryAssignCancel(pos);
+		// 출고처지정 이력 삽입
+		posDao.createDeliveryAssignHst(pos);
+		
+		// 주문상세번호로  아이템리스트 조회 
+		Collection<Pos> ordDtlItemList = posDao.getOrdDtlItemList(pos);
+		for (Pos param : ordDtlItemList) {
+			param.setDelvBanStdt(GagaDateUtil.getToday());
+			param.setDelvBanEddt(GagaDateUtil.getOffsetDate(2));
+			param.setRegNo(userNo);
+			param.setUpdNo(userNo);
+			// 출고금지상품 등록
+			posDao.createBangoods(param);
+		} 
+		
+		pos.setOrdDtlStat(OrderDetailStat.PAYMENT_COMPLETE.value());
+		pos.setInvoiceNo("");
+		
+		// 주문상세 출고처 업데이트
+		posDao.updateOrderDetail(pos);
+		
+		// 주문상세 이력 삽입
+		Order order = new Order();
+		order.setOrdDtlNo(pos.getOrdDtlNo()); 
+		order.setUpdNo(userNo);
+		order.setRegNo(userNo);
+		orderDao.createOrderDetailHst(order);
+		
+
+	}
+
+	/**
+	 * 매장POS -출고확정
+	 *
+	 * @param Pos 
+	 * @return GagaMap
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap saveConfirmation(Pos pos, int cnt) {
+		GagaMap result = new GagaMap();
+		Integer userNo = TssSession.getInfo().getUserNo();
+		Collection<Erp> rtList = new ArrayList();
+		Collection<Erp> salesList = new ArrayList();
+		
+		Date date = new Date();
+
+		SimpleDateFormat ifDt = new SimpleDateFormat("yyyymmddhhmmss");
+		String noIf =  ifDt.format(date);
+		
+		Collection<Pos> list = posDao.getSendErpList(pos);
+		
+		log.info("list {}"+list);
+		for(Pos data : list) {
+			Erp erpData = new Erp();
+			erpData.setCD_RTOUTSHOP(data.getCdRtoutshop());
+			erpData.setCD_STYLE(data.getCdStyle());
+			erpData.setCD_COLOR(data.getCdColor());
+			erpData.setCD_SIZE(data.getCdSize());
+			erpData.setQT_RTOUT(data.getQtRtout());
+			rtList.add(erpData);
+			
+			erpData.setNO_IF(noIf+ GagaStringUtil.getLPadding(cnt+"", 4, "0"));
+			//erpData.setDT_SALE(data.getDtSale());
+			erpData.setDT_SALE("20210731");
+			erpData.setQT_SALE(data.getQtSale());
+			erpData.setAM_ACSALE(data.getAmAcsale());
+			erpData.setDS_REMARK("TEST");
+			salesList.add(erpData);
+			
+		}
+		
+		// API 호출 재고이동
+		//hansaeErp.erpStockRt(HansaeErp.ErpGb.HANSAE_DR.value(), rtList);
+		
+		// API 호출 매출정보 
+		//GagaMap resultMap = hansaeErp.uploadErpSales(HansaeErp.ErpGb.HANSAE_DR.value(), salesList);
+		
+		// 주문상세 업데이트
+		pos.setOrdDtlStat(OrderDetailStat.SHIPPING.value()); // 배송중 
+		pos.setInvoiceNo("");
+		pos.setDelvArGb("");
+		pos.setUpdNo(userNo);
+		posDao.updateOrderDetail(pos);
+		
+		
+		// 주문상세 이력 삽입
+		Order order = new Order();
+		order.setOrdDtlNo(pos.getOrdDtlNo()); 
+		order.setUpdNo(userNo);
+		order.setRegNo(userNo);
+		orderDao.createOrderDetailHst(order);
+		
+		// 주문상세단품 HST 등록???
+		for(Pos data : list) {
+			Order ordItem = new Order();
+			ordItem.setUpdNo(userNo);
+			ordItem.setRegNo(userNo);
+			ordItem.setOrdDtlStat(""); // ???
+			ordItem.setOrdDtlItemSq(data.getOrdDtlItemSq());
+			orderChangeDao.createOrderDetailItemHstTemp(ordItem);
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * 매장POS - 정산내역
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	public Collection<Pos> getPosUsacList(Pos pos) {
+		return posDao.getPosUsacList(pos);
+	}
+	
+	/**
+	 * 매장거부 목록
+	 *
+	 * @param -Pos
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	public Collection<Pos> getDeliveryAssignList(Pos pos) {
+		return posDao.getDeliveryAssignList(pos);
+	}	
+	
+}

+ 614 - 0
src/main/java/com/style24/scm/biz/web/TssPosController.java

@@ -0,0 +1,614 @@
+package com.style24.scm.biz.web;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Pos;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.scm.support.controller.TssBaseController;
+import com.style24.scm.support.security.session.TssSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.scm.biz.service.TssPosService;
+import com.style24.scm.biz.service.TssRendererService;
+
+/**
+ * 매장 Controller
+ * 
+ * @author moon
+ * @since 2021. 06. 11
+ */
+@Controller
+@RequestMapping("/pos")
+@Slf4j
+public class TssPosController extends TssBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TssPosService posService;
+
+	//@Autowired
+	//private TsaDeliveryService deliveryService;
+
+	@Autowired
+	private TssRendererService rendererService;
+
+	//@Autowired
+	//private TsaStatisticsService statisticsService;
+
+	/**
+	 * 매장POS 로그인 처리
+	 * 
+	 * @param sellStoreCd - 매장코드
+	 * @param session - HttpSession
+	 * @return String - 포스메인화면이동
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+//	@GetMapping("/login")
+//	public String posLogin(@RequestParam("delvLocCd") String delvLocCd, HttpSession session) {
+//		String returnUrl = "forward:/pos/main";
+//		if (TsaSession.isStoreLogin()) {
+//			// 로그인 정보와 다른 매장코드로 접근시 기존 로그인 세션 삭제
+//			log.info("delvLocCd {}", delvLocCd);
+//			log.info("TsaSession.getPosInfo() {}", TsaSession.getPosInfo());
+//			if (!delvLocCd.equals(TsaSession.getPosInfo().getDelvLocCd())) {
+//				session.removeAttribute("sessionPosInfo");
+//			}
+//		}
+//
+//		Pos posParam = new Pos();
+//		posParam.setDelvLocCd(delvLocCd);
+//		Pos posInfo = posService.getStoreLoginInfo(posParam);
+//
+//		if (posInfo == null) {
+//			log.debug(String.format("StoreCode={} was not found!", delvLocCd));
+//			throw new UsernameNotFoundException(message.getMessage("LOGN_0001"));
+//		}
+//		// 세션 설정
+//		session.setAttribute("sessionPosInfo", posInfo);
+//
+//		log.info("posInfo{}", posInfo);
+//
+//		return returnUrl;
+//	}
+
+	/**
+	 * 매장POS 메인
+	 * 
+	 * @return ModelAndView
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@GetMapping("/main")
+	public ModelAndView posMain() {
+		ModelAndView mav = new ModelAndView();
+		Pos pos = new Pos();
+		log.info("getInfo: "+TssSession.getInfo());
+		
+		pos.setDelvLocCd(TssSession.getInfo().getUserId());
+		
+		Pos posInfo = posService.getStoreLoginInfo(pos);
+		
+		log.info("posInfo{}", posInfo);
+		mav.addObject("posInfo",posInfo);
+		mav.addObject("delvLocNm",posInfo.getDelvLocNm());
+		mav.addObject("supplyCompCd",posInfo.getSupplyCompCd());
+		mav.addObject("delvLocCd",posInfo.getDelvLocCd());
+		mav.addObject("delvFeeRate",posInfo.getDelvFeeRate());
+		
+		
+		//TssSession.getInfo()
+		//mav.addObject("delvLocNm", TssSession.getPosInfo().getDelvLocNm());
+		//mav.addObject("delvLocCd", TssSession.getPosInfo().getDelvLocCd());
+
+		// 택배사명 목록
+		mav.addObject("shipCompanyList", rendererService.getShipCompanyList());
+
+		// 주문상세상태 
+		mav.addObject("orderDtlSateList", rendererService.getCommonCodeList("G013"));
+		
+		// 출고거부사유
+		mav.addObject("g300List", rendererService.getCommonCodeList("G300"));
+
+		mav.setViewName("pos/PosMainForm");
+		return mav;
+	}
+
+	/**
+	 * 출고대기목록 / 출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 11
+	 */
+	@PostMapping("/wait/order/list")
+	@ResponseBody
+	public Collection<Pos> getPosWaitOrderList(@RequestBody Pos pos) {
+
+		return posService.getPosDeliveryList(pos);
+	}
+
+	/**
+	 * 출고목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 06. 11
+	 */
+	@PostMapping("/delivery/order/list")
+	@ResponseBody
+	public Collection<Pos> getPosDeliveryList(@RequestBody Pos pos) {
+
+		return posService.getPosDeliveryList(pos);
+	}
+
+	/**
+	 * 확정대기목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 06. 21
+	 */
+	@PostMapping("/confirm/order/list")
+	@ResponseBody
+	public Collection<Pos> getPosConfirmList(@RequestBody Pos pos) {
+
+		return posService.getPosConfirmList(pos);
+	}
+	
+	/**
+	 * 출고수락 / 출고거부 처리
+	 * 
+	 * @param pos - 매장정보
+	 * @return GagaResponse
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/delivery/assign/save")
+	@ResponseBody
+	public GagaResponse savePosDeliveryAssign(@RequestBody Pos pos) {
+		
+		log.info("pos {}"+pos);
+		
+
+
+		String rtn = "";
+		if ("Y".equals(pos.getDelvArGb())) { //출고수락
+			rtn = posService.savePosDeliveryLocAssign(pos);
+		} else {
+			rtn = posService.savePosDeliveryLocReject(pos);
+		}
+		if ("S".equals(rtn)) {
+			if ("Y".equals(pos.getDelvArGb())) { //출고수락
+				return super.ok("출고수락 되었습니다.\n출고목록에서 확인 가능합니다.");
+			} else {
+				return super.ok(message.getMessage("SUCC_0001"));
+			}
+			
+		} else if("N".equals(rtn)) {
+			return super.ok("상태값이 변경되었습니다.\n조회 후 다시 진행해주세요.");
+		} else {
+			return super.ok("다른 출고처로 지정되었습니다.");
+		}
+		
+
+	}
+
+	/**
+	 * 출고수락목록 CnPlus 엑셀다운 - 배송준비중
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<TsaPos>
+	 * @author moon
+	 * @since 2020. 06. 14   == 삭제!!!
+	 */
+	@PostMapping("/invoice/save")
+	@ResponseBody
+	public Collection<GagaMap> saveInvoice(@RequestBody Collection<Pos> posList) {
+
+
+		Collection<GagaMap> resultList = new ArrayList<>();
+		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+
+		for (Pos posParam : posList) {
+
+			// 세트상품일경우 주문상세번호 중복제거 
+			String chk = "N";
+			for (Pos param : dtlNoList) {
+				if (param.getOrdDtlNo() == posParam.getOrdDtlNo()) {
+					chk = "Y";
+				}
+			}
+			if ("N".equals(chk)) {
+				Pos data = new Pos();
+				data.setOrdNo(posParam.getOrdNo());
+				data.setOrdDtlNo(posParam.getOrdDtlNo());
+
+				GagaMap result = posService.savePos(data);
+
+				dtlNoList.add(posParam);
+				resultList.add(result);
+			}
+
+		}
+		return resultList;
+	}
+	
+	/**
+	 * CnPlus 엑셀 다운로드 
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<TsaPos>
+	 * @author moon
+	 * @since 2021. 06. 14
+	 */	
+	@GetMapping("/order/excel/list")
+	public ResponseEntity<InputStreamResource> downloadOrderExcelList(HttpServletRequest request, Pos pos) throws Exception {
+		if (StringUtils.isBlank(pos.getOrdDtlNos())) {
+			throw new IllegalStateException(message.getMessage("FAIL_1003"));
+		}
+		String excelfileName = "CNPlus 엑셀양식_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
+		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+		log.info("pos {}", pos.getOrdDtlNos());
+		if (StringUtils.isNotBlank(pos.getOrdDtlNos())) {
+			pos.setOrdDtlNoArr(pos.getOrdDtlNos().split(","));
+		}
+		// 대용량엑셀파일다운로드는 이런 식으로 ...
+		posService.getOrderExcelList(pos, excelFilenameWithPath);
+
+		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
+	}
+	
+	/**
+	 * 출고수락목록 송상등록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@PostMapping("/invoice/save/invoiceno")
+	@ResponseBody
+	public Collection<GagaMap> savePosInvoice(@RequestBody Collection<Pos> posList) {
+		Integer userNo = TssSession.getInfo().getUserNo();
+		Collection<GagaMap> resultList = new ArrayList<>();
+		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+
+		for (Pos posParam : posList) {
+
+			// 세트상품일경우 주문상세번호 중복제거 
+			String chk = "N";
+			for (Pos param : dtlNoList) {
+				if (param.getOrdDtlNo().equals(posParam.getOrdDtlNo())) {
+					chk = "Y";
+				}
+			}
+			if (!"Y".equals(chk)) {
+				Pos data = new Pos();
+				data.setOrdNo(posParam.getOrdNo());
+				data.setOrdDtlNo(posParam.getOrdDtlNo()); 
+				data.setUpdNo(userNo);
+				data.setRegNo(userNo);
+				data.setDelvFeeRate(posParam.getDelvFeeRate());
+				data.setInvoiceNo(posParam.getInvoiceNo());
+				data.setShipCompCd(posParam.getShipCompCd());
+
+				GagaMap result = posService.savePosInvoice(data);
+
+				dtlNoList.add(posParam);
+				resultList.add(result);
+			}
+		}
+		return resultList;
+	}
+
+	
+	/**
+	 * 수락취소
+	 * 
+	 * @param pos - 매장정보
+	 * @return GagaResponse
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@PostMapping("/delivery/assign/save/cancel")
+	@ResponseBody
+	public GagaResponse savePosDeliveryAssignCancel(@RequestBody Pos pos) {
+
+		GagaMap result = posService.getPosDeliveryLocValidation(pos);
+		boolean validation = result.getBoolean("validation");
+		String resultMsg   = result.getString("resultMsg");
+		
+		//deliveryService.savePosDeliveryLocRejectCancel(delivery);
+		if (validation) {
+			posService.savePosDeliveryLocRejectCancel(pos);
+		}
+		return super.ok(resultMsg);
+	}
+	
+	/**
+	 * 출고확정 
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@PostMapping("/confirm/save")
+	@ResponseBody
+	public Collection<GagaMap> saveConfirmation(@RequestBody Collection<Pos> posList) {
+		Integer userNo = TssSession.getInfo().getUserNo();
+		Collection<GagaMap> resultList = new ArrayList<>();
+		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+		int cnt =0;
+		for (Pos posParam : posList) {
+
+			// 세트상품일경우 주문상세번호 중복제거 
+			String chk = "N";
+			for (Pos param : dtlNoList) {
+				if (param.getOrdDtlNo().equals(posParam.getOrdDtlNo())) {
+					chk = "Y";
+				}
+			}
+			if (!"Y".equals(chk)) {
+				Pos data = new Pos();
+				data.setOrdNo(posParam.getOrdNo());
+				data.setOrdDtlNo(posParam.getOrdDtlNo()); 
+				data.setUpdNo(userNo);
+				data.setRegNo(userNo);
+				data.setDelvFeeRate(posParam.getDelvFeeRate());
+				data.setInvoiceNo(posParam.getInvoiceNo());
+				data.setShipCompCd(posParam.getShipCompCd());
+				cnt = cnt+1;
+				GagaMap result = posService.saveConfirmation(data,cnt);
+
+				dtlNoList.add(posParam);
+				resultList.add(result);
+			}
+		}
+		return resultList;
+	}
+	
+
+	/**
+	 * 정산내역
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2021. 06. 21
+	 */
+	@PostMapping("/usac/list")
+	@ResponseBody
+	public Collection<Pos> getPosUsacList(@RequestBody Pos pos) {
+		return posService.getPosUsacList(pos);
+	}
+
+	/**
+	 * 출고거부이력 목록
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+	@PostMapping("/ban/delivery/list")
+	@ResponseBody
+	public Collection<Pos> getPosBanDeliveryList(@RequestBody Pos pos) {
+		/*
+		 * Delivery delivery = new Delivery();
+		 * delivery.setDelvLocCd(TsaSession.getPosInfo().getDelvLocCd());
+		 * delivery.setGoodsGb("goodsCd"); delivery.setSearchTxt(pos.getGoodsCd());
+		 * Collection<Delivery> rejectList = new ArrayList<Delivery>(); return
+		 * rejectList; //deliveryService.getDeliveryAssignList(delivery);
+		 */		
+		return posService.getDeliveryAssignList(pos);
+		
+	}
+
+	/**
+	 * 출고수락목록 배송준비중
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+//	@PostMapping("/invoice/save")
+//	@ResponseBody
+//	public Collection<GagaMap> saveInvoice(@RequestBody Collection<Pos> posList) {
+//		String delvLocCd = TsaSession.getPosInfo().getDelvLocCd();
+//		Double delvFeeRate = TsaSession.getPosInfo().getDelvFeeRate();
+//
+//		Collection<GagaMap> resultList = new ArrayList<>();
+//		Collection<Pos> dtlNoList = new ArrayList<Pos>();
+//
+//		for (Pos posParam : posList) {
+//
+//			// 세트상품일경우 주문상세번호 중복제거 
+//			String chk = "N";
+//			for (Pos param : dtlNoList) {
+//				if (param.getOrdDtlNo() == posParam.getOrdDtlNo()) {
+//					chk = "Y";
+//				}
+//			}
+//			if (!"Y".equals(chk)) {
+//				Delivery delivery = new Delivery();
+//				delivery.setOrdNo(posParam.getOrdNo());
+//				delivery.setOrdDtlNo(posParam.getOrdDtlNo());
+//				// TODO: 매장코드는 id 생성후 매핑???
+//				//delivery.setUpdNo(delvLocCd);
+//				//delivery.setRegNo(delvLocCd);
+//				delivery.setDelvFeeRate(delvFeeRate);
+//
+//
+//				GagaMap result = null;//deliveryService.savePos(delivery);
+//
+//				dtlNoList.add(posParam);
+//				resultList.add(result);
+//			}
+//
+//		}
+//		return resultList;
+//	}
+
+
+	/**
+	 * 엑셀다운로드
+	 * 
+	 * @param pos - 매장정보
+	 * @return Collection<Pos>
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */	
+//	@GetMapping("/order/excel/list")
+//	public ResponseEntity<InputStreamResource> downloadOrderExcelList(HttpServletRequest request, Pos pos) throws Exception {
+//		if (StringUtils.isBlank(pos.getOrdDtlNos())) {
+//			throw new IllegalStateException(message.getMessage("FAIL_1003"));
+//		}
+//		String excelfileName = "CNPlus 엑셀양식_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
+//		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+//		log.info("pos {}", pos.getOrdDtlNos());
+//		if (StringUtils.isNotBlank(pos.getOrdDtlNos())) {
+//			pos.setOrdDtlNoArr(pos.getOrdDtlNos().split(","));
+//		}
+//		// 대용량엑셀파일다운로드는 이런 식으로 ...
+//		posService.getOrderExcelList(pos, excelFilenameWithPath);
+//
+//		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
+//	}
+
+	/**
+	 * 매장 출고처지정 수략율 통계화면
+	 *
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@GetMapping("/delivery/assign/statistics/form")
+	public ModelAndView storeDeliveryAssignStatisticsForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+
+		mav.setViewName("statistics/DeliveryAssignForm");
+
+		return mav;
+	}
+	*/
+
+	/**
+	 * 매장 출고처지정 수략율 통계 조회
+	 *
+	 * @param TsaDeliveryAssign - 출고처지정
+	 * @return Collection<TsaDeliveryAssign>
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@PostMapping("/delivery/assign/statistics/list")
+	@ResponseBody
+	public Collection<TsaDeliveryAssign> getStoreDeliveryAssignStatistics(@RequestBody TsaDeliveryAssign deliveryAssign) {
+		return statisticsService.getStoreDeliveryAssignStatistics(deliveryAssign);
+	}
+	*/
+	/**
+	 * 매장 출고처지정 상세 데이터 조회
+	 *
+	 * @param TsaDeliveryAssign - 출고처지정
+	 * @return Collection<TsaDeliveryAssign>
+	 * @author card007
+	 * @since 2020. 09. 16
+	 */
+	/*
+	@GetMapping("/delivery/assign/statistics/detail/{delvLocCd}")
+	@ResponseBody
+	public ModelAndView storeDeliveryAssignDetailForm(@PathVariable String delvLocCd, @RequestParam(value = "stDate", required = false) String stDate, @RequestParam(value = "edDate", required = false) String edDate, @RequestParam(value = "brandCd", required = false) String brandCd) {
+		ModelAndView mav = new ModelAndView();
+
+		TsaDeliveryAssign deliveryAssign = new TsaDeliveryAssign();
+		deliveryAssign.setDelvLocCd(delvLocCd);
+		deliveryAssign.setBrandCd(brandCd);
+		deliveryAssign.setStDate(stDate);
+		deliveryAssign.setEdDate(edDate);
+
+		Collection<TsaDeliveryAssign> dataList = statisticsService.getStoreDeliveryAssignDetailList(deliveryAssign);
+
+		mav.addObject("dataList", dataList);
+
+		// 출고거부사유
+		mav.addObject("noList", rendererService.getAvailCommonCodeList("G017"));
+
+		mav.setViewName("statistics/DeliveryAssignDetailPopupForm");
+
+		return mav;
+	}
+	*/
+
+	/**
+	 * 입점업체브랜드 목록
+	 *
+	 * @param supplyCompCd - 입점업체관리일련번호
+	 * @return
+	 * @author moon
+	 * @since 2019. 11. 13
+	 */
+//	@GetMapping("/delivery/assign/statistics/brand/list/{supplyCompCd}")
+//	@ResponseBody
+//	public Collection<CommonCode> getSupplyCompanyBrandList(@PathVariable String supplyCompCd) {
+//		return rendererService.getSupplyCompanyBrandList(supplyCompCd);
+//	}
+
+	/**
+	 * 출고처 목록
+	 *
+	 * @param deliveryLoc - 출고처 정보
+	 * @return
+	 * @author moon
+	 * @since 2020. 11. 13
+	 */
+//	@GetMapping("/delivery/assign/statistics/store/stock/link/list/{supplyCompCd}")
+//	@ResponseBody
+//	public Collection<CommonCode> getStoreStockLinkList(@PathVariable String supplyCompCd) {
+//		DeliveryLoc deliveryLoc = new DeliveryLoc();
+//		deliveryLoc.setSupplyCompCd(supplyCompCd);
+//		deliveryLoc.setDelvLocClsf("21");
+//		return rendererService.getDeliveryLocList(deliveryLoc);
+//	}
+}

+ 964 - 0
src/main/webapp/WEB-INF/views/pos/PosMainForm.html

@@ -0,0 +1,964 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<head th:replace="common/fragments/header :: header"></head>
+<body>
+<th:block th:replace="common/fragments/variables :: variables"></th:block>
+
+<!--
+ *******************************************************************************
+ * @source  : PosMainForm.html
+ * @desc    : POS Main Page
+ *============================================================================
+ * ISTYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.13   moon        최초 작성
+ *******************************************************************************
+ -->
+
+<div id="main">
+		<!-- TITLE -->
+		<div class="main-title">
+			<h2>매장명 : <span th:text="${delvLocNm}"></span></h2>
+		</div> 
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li class="right">
+					<h2>매장명 : <span th:text="${delvLocNm}"></span></h2>
+				</li>
+			</ul>
+		</div>
+		<!-- //TITLE -->
+	
+		<!-- TABS SPACE -->
+		<div class="tabs">
+			<!-- TABS NAVI -->
+			<ul class="tabsNav p-left">
+				<li class="on"><a href="#tab1#top" id="tab1-1">출고대기목록</a></li>
+				<li><a href="#tab2#top">출고목록</a></li>
+				<li><a href="#tab2-1#top">확정대기목록</a></li>
+				<li><a href="#tab3#top">정산내역</a></li>
+				<li><a href="#tab4#top">출고거부이력</a></li>
+			</ul>
+			<!-- //TABS NAVI -->
+			<!-- TABS CONTENTS -->
+			<ul class="tabsCont">
+				<!-- TAB1 : 출고대기목록 -->
+				<li class="tab on" id="tab1">
+					<div class="panelStyle">
+					<!-- TAB2 CONTENTS AREA -->
+					<form id="waitingOrder">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="delvFeeRate" th:value="${delvFeeRate}">
+						<input type="hidden" name="supplyCompCd" th:value="${supplyCompCd}">
+						<input type="hidden" name="delvArGb" value="P"/>
+						<input type="hidden" name="ordDtlStat" value="G013_35"/>
+						<input type="hidden" name="ordDtlNos">
+							<h4>출고대기</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>주문번호</th>
+									<td><input type="text" class="w300" name="ordNo"/></td>
+									<th>수령자</th>
+									<td colspan="5"><input type="text" class="w300" name="recipNm" maxlength="10"/></td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="5" id="waitTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+									<button type="button" class="btn btn-base btn-lg" id="btnWaitSearch">조회</button>
+									<!-- <button type="button" class="btn btn-base btn-lg" id="btnCnplus">Cnplus엑셀다운로드</button>  -->
+								</li>
+							</ul>
+							
+						<div id="watingGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh60" ></div>
+
+						<!-- //TAB2 CONTENTS AREA -->
+					</form>
+					</div>
+				</li>
+				<!-- //TAB1 : 출고대기목록 -->
+				<!-- TAB2 : 출고목록 -->
+				<li class="tab" id="tab2">
+					<div class="panelStyle">
+					<!-- TAB2 CONTENTS AREA -->
+					<form id="deliveryInfo">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="delvFeeRate" th:value="${delvFeeRate}">
+						<input type="hidden" name="supplyCompCd" th:value="${supplyCompCd}">
+						<input type="hidden" name="delvArGb" value="Y"/>
+						<input type="hidden" name="ordDtlNos">
+
+							<h4>출고목록</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>주문번호</th>
+									<td><input type="text" class="w300" name="ordNo"/></td>
+									<th>수령자</th>
+									<td><input type="text" class="w300" name="recipNm" maxlength="10"/></td>
+									<th>주문상세상태</th>
+									<td>
+										<select class="w150" name="ordDtlStat">
+											<option value="all">전체</option>
+											<option value="G013_30" selected>상품준비중</option>
+											<option value="G013_40">배송준비중</option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="5" id="deliveryTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnDeliveySearch">조회</button>
+								<button type="button" class="btn btn-base btn-lg" id="btnReCnplus">Cnplus엑셀다운로드</button>
+								<button type="button" class="btn btn-base btn-lg" id="btnDeliveySave">송장번호저장</button>
+								</li>
+							</ul>
+							<label class="off">
+								<a href="javascript:void(0);" id="deliveryExcelList" style="display: none;">송장생성된주문 Cnplus엑셀다운로드</a>
+							</label>
+							<div id="deliveryGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh60" ></div>
+				
+						<!-- //TAB2 CONTENTS AREA -->
+					</form>
+					</div>
+				</li>
+				<!-- //TAB2 : 출고목록 -->
+				
+				<!-- TAB2-1 : 확정대기목록 -->
+				<li class="tab" id="tab2-1">
+					<div class="panelStyle">
+					<!-- TAB2-1 CONTENTS AREA -->
+					<form id="confirmation">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="delvFeeRate" th:value="${delvFeeRate}">
+						<input type="hidden" name="supplyCompCd" th:value="${supplyCompCd}">
+						<input type="hidden" name="ordDtlNos">
+						<input type="hidden" name="delvArGb" value="Y"/>
+
+							<h4>확정대기목록</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>주문번호</th>
+									<td><input type="text" class="w300" name="ordNo"/></td>
+									<th>수령자</th>
+									<td><input type="text" class="w300" name="recipNm" maxlength="10"/></td>
+									<th>주문상세상태</th>
+									<td>
+										<select class="w150" name="ordDtlStat">
+											<option value="all">전체</option>
+											<option value="G013_40" selected>배송준비중</option>
+											<option value="G013_50">배송중</option>
+											<option value="G013_60">배송완료</option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="5" id="confirmTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnConfirmSearch">조회</button>
+								<button type="button" class="btn btn-base btn-lg" id="btnConfirmSave">출고확정</button>
+								</li>
+							</ul>
+							<div id="confirmGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh60" ></div>
+				
+						<!-- //TAB2-1 CONTENTS AREA -->
+					</form>
+					</div>
+				</li>
+				<!-- //TAB2-1 : 확정대기목록 -->				
+				
+				<!-- TAB3 : 정산 내역 -->
+				<li class="tab" id="tab3">
+					<div class="panelStyle">
+					<!-- TAB3 CONTENTS AREA -->
+					<form id="usacList">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="delvFeeRate" th:value="${delvFeeRate}">
+						<input type="hidden" name="supplyCompCd" th:value="${supplyCompCd}">
+							<h4>정산 내역</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col style="width:23%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="3" id="usacTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnSearchUsac">조회</button>
+								</li>
+							</ul>
+							<div id="usacGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh60" ></div>
+					</form>
+					</div>
+					<!-- //TAB3 CONTENTS AREA -->
+				</li>
+				<!-- //TAB3 : 정산 내역 -->
+				<!-- TAB4 : 출고거부 내역 -->
+				<li class="tab" id="tab4">
+					<div class="panelStyle">
+					<!-- TAB4 CONTENTS AREA -->
+					<form id="banDelv">
+						<input type="hidden" name="delvLocCd" th:value="${delvLocCd}">
+						<input type="hidden" name="delvFeeRate" th:value="${delvFeeRate}">
+						<input type="hidden" name="supplyCompCd" th:value="${supplyCompCd}">
+							<h4>출고거부 내역</h4>
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:10%;"/>
+									<col style="width:80%;"/>
+									<col style="width:10%;"/>
+									<col/>
+								</colgroup>
+								<tbody>
+								<tr>
+									<th>상품코드</th>
+									<td><input type="text" class="w300" id="goodsCd" name="goodsCd"/></td>
+								</tr>
+								<tr>
+									<th>조회기간</th>
+									<td colspan="3" id="banDelvTerms"></td>
+								</tr>
+								</tbody>
+							</table>
+							<ul class="panelBar">
+								<li class="center">
+								<button type="button" class="btn btn-base btn-lg" id="btnBanDelvSearch">조회</button>
+								</li>
+							</ul>
+							<div id="banDelvGrid" style="width: 99%; height: 500px;" class="ag-theme-balham lh60" ></div>
+					
+					</form>
+					</div>
+					<!-- //TAB4 CONTENTS AREA -->
+				</li>
+				<!-- //TAB4 : 출고거부 내역 -->
+			</ul>
+			<!-- //TABS CONTENTS -->
+	
+		<!-- //TABS SPACE -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	var goodsImgParam    = "?width=60&height=60";
+	var goodsImgBigParam = "?width=600&height=600";
+	var delvarGbList     =  {"P" : "출고대기", "Y" : "출고수락", "N" : "출고거부"};
+	var uploadGoodsUrl   = [[${@environment.getProperty('upload.goods.view')}]];
+	var shipCompanyList  =  gagajf.convertToArray([[${shipCompanyList}]]);
+	var orderDtlSateList =  gagajf.convertToArray([[${orderDtlSateList}]]);
+
+	var g300Init = {'cd' :'0', 'cdNm' :'[선택]'};
+	var g300ObjectList = [[${g300List}]];
+	g300ObjectList.push(g300Init);
+	var g300List       =  gagajf.convertToArray(g300ObjectList);
+	delete g300List["G300_90"];
+	delete g300List["G300_40"];
+	
+	var delvLocCd = [[${delvLocCd}]]; 
+	
+	
+	
+	
+	var g017Init = {'cd' :'0', 'cdNm' :'[선택]'};
+	//var g017ObjectList = [[${g017List}]];
+	//g017ObjectList.push(g017Init);
+	// var g017List       =  gagajf.convertToArray(g017ObjectList);
+	//delete g017List[90];
+	//delete g017List[40];
+
+
+	//출고대기 그리드
+	var columnwatingApplyDefs = [
+
+		{headerName: "수락", field: "delvArGbY", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'P'){
+					btnText = '<button type="button"class="btn btn-success" onClick="fnApplyDelvLoc(\''+params.data.ordNo+'\',\''+params.data.ordDtlNo+'\',\''+params.data.ordQty+'\',\''+params.data.goodsType+'\')"> 수락 </button>';
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부", field: "delvArGbN", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'P') {
+					btnText = '<button type="button"class="btn btn-success" onClick="javascript:void(0);"> 거부 </button>';
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부사유", field: "rejectReason", width: 80, minWidth: 75, cellClass: 'text-center', sortable: true ,
+			cellEditor: 'agSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat === 'G013_35' && params.data.delvArGb === 'P') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(g300List) },
+			valueFormatter: function (params) {
+				var dataValue = '0';
+				if(!gagajf.isNull(params.value)) {
+					dataValue = params.value;
+				}
+				return gagaAgGrid.lookupValue(g300List, dataValue);
+			},
+			valueParser: function (params) { return gagaAgGrid.lookupKey(g300List, params.newValue); },
+			singleClickEdit: true
+		},
+		{
+			headerName: "출고여부", field: "delvArGb", width: 130, cellClass: 'text-center' ,
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(delvarGbList, params.value); },
+		},
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center' },
+		{headerName: "컬러", field: "optCd1", width: 85, cellClass: 'text-center' },
+		{headerName: "사이즈", field: "optCd2", width: 85, cellClass: 'text-center' },
+		{headerName: "주문수량",  field: "saleQty", width: 80, cellClass: 'text-center',
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true},
+		{headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "주문자", field: "ordNm", width: 130, cellClass: 'text-center' },
+		{headerName: "수령자", field: "recipNm", width: 130, cellClass: 'text-center'},
+		{headerName: "송장번호", field: "invoiceNo", width: 120, cellClass: 'text-center'},
+		{headerName: "우편번호", field: "recipZipcode", width: 90, cellClass: 'text-center'},
+		{headerName: "주소", field: "recipAddr", width: 450, cellClass: 'text-left'},
+		{headerName: "전화번호", field: "recipPhnno", width: 120, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 120, cellClass: 'text-center'}
+
+
+	];
+
+	//출고그리드
+	var columnDeliveryDefs= [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "송장번호", field: "invoiceNo", width: 120, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == 'G013_30' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { maxlength: 15 }
+		},
+
+		{headerName: "택배사", field: "shipCompCd", width: 100, minWidth: 75, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == 'G013_30' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(shipCompanyList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(shipCompanyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(shipCompanyList, params.newValue); }
+		},
+
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center', 
+			cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+			}		
+		},
+		{headerName: "상품명", 	field: "goodsNm", width: 200, cellClass: 'text-left', editable :false},
+		{headerName: "상품코드", 	field: "goodsCd", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "컬러", 		field: "optCd1", width: 85, cellClass: 'text-center' , editable :false},
+		{headerName: "사이즈", 	field: "optCd2", width: 85, cellClass: 'text-center' , editable :false},
+		{headerName: "주문수량",  field: "saleQty", width: 80, cellClass: 'text-center', editable :false,
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세상태", field: "ordDtlStat", width: 130, cellClass: 'text-center', editable :false,
+			cellEditorParams: { values: gagaAgGrid.extractValues(orderDtlSateList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(orderDtlSateList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(orderDtlSateList, params.newValue); }
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true, editable :false},
+		{
+			headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "출고일시", field: "delvStdt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "주문자", field: "ordNm", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "수령자", field: "recipNm", width: 130, cellClass: 'text-center', editable :false},
+		{headerName: "우편번호", field: "recipZipcode", width: 90, cellClass: 'text-center'},
+		{headerName: "주소", field: "recipAddr", width: 450, cellClass: 'text-left'},
+		{headerName: "전화번호", field: "recipPhnno", width: 120, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 120, cellClass: 'text-center'},
+
+		{headerName: "수락취소", field: "delvArGbCnl", width: 120, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btnText = '';
+				if(params.value === 'Y') {
+					// btnText= '<a href="javascript:void(0);"  class="btn btn-success btn-lg">수락취소</a>';
+					btnText= '<button type="button"class="btn btn-success" onClick="javascript:void(0);"> 수락취소 </button>';
+				}
+				return btnText;
+			}
+		},
+		{headerName: "거부사유", field: "rejectReason", width: 100, minWidth: 75, cellClass: 'text-center', sortable: true ,
+			cellEditor: 'agSelectCellEditor',
+			editable : function (params) { return  ((params.data.ordDtlStat == 'G013_30' || params.data.ordDtlStat == 'G013_40') && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(g300List) },
+			valueFormatter: function (params) {
+				var dataValue = '0';
+				if(!gagajf.isNull(params.value)) {
+					dataValue = params.value;
+				}
+				return gagaAgGrid.lookupValue(g300List, dataValue);
+			},
+			valueParser: function (params) { return gagaAgGrid.lookupKey(g300List, params.newValue); },
+			singleClickEdit: true
+		}
+
+	];
+
+	//확정대기 그리드
+	var columnConfirmDefs= [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "송장번호", field: "invoiceNo", width: 120, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == 'G013_30' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { maxlength: 15 }
+		},
+
+		{headerName: "택배사", field: "shipCompCd", width: 100, minWidth: 75, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			editable : function (params) { return  (params.data.ordDtlStat == 'G013_30' && params.data.delvArGb == 'Y') ? true : false;},
+			cellEditorParams: { values: gagaAgGrid.extractValues(shipCompanyList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(shipCompanyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(shipCompanyList, params.newValue); }
+		},
+
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center', 
+			cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+			}		
+		},
+		{headerName: "상품명", 	field: "goodsNm", width: 200, cellClass: 'text-left', editable :false},
+		{headerName: "상품코드", 	field: "goodsCd", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "컬러", 		field: "optCd1", width: 85, cellClass: 'text-center' , editable :false},
+		{headerName: "사이즈", 	field: "optCd2", width: 85, cellClass: 'text-center' , editable :false},
+		{headerName: "주문수량",  field: "saleQty", width: 80, cellClass: 'text-center', editable :false,
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', editable :false},
+		{headerName: "주문상세상태", field: "ordDtlStat", width: 130, cellClass: 'text-center', editable :false,
+			cellEditorParams: { values: gagaAgGrid.extractValues(orderDtlSateList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(orderDtlSateList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(orderDtlSateList, params.newValue); }
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true, editable :false},
+		{
+			headerName: "주문일시", field: "ordDt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "출고일시", field: "delvStdt", width: 150, cellClass: 'text-center', editable :false,
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "주문자", field: "ordNm", width: 130, cellClass: 'text-center' , editable :false},
+		{headerName: "수령자", field: "recipNm", width: 130, cellClass: 'text-center', editable :false},
+		{headerName: "우편번호", field: "recipZipcode", width: 90, cellClass: 'text-center'},
+		{headerName: "주소", field: "recipAddr", width: 450, cellClass: 'text-left'},
+		{headerName: "전화번호", field: "recipPhnno", width: 120, cellClass: 'text-center'},
+		{headerName: "배송메모", field: "delvMemo", width: 120, cellClass: 'text-center'},
+
+	];
+
+	
+	//정산내역 그리드
+	var columnUsacDefs = [
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+			}
+		},
+		{headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center' },
+		{headerName: "사이즈", field: "sizeCd", width: 85, cellClass: 'text-center' },
+		{
+			headerName: "출고수량", field: "ordQty", width: 80, cellClass: 'text-right',
+			valueFormatter: function(params) {return params.value.addComma();}
+		},
+		{
+			headerName: "발생일시", field: "occurDt", width: 150, cellClass: 'text-right',
+			cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "출고일시", field: "delvStdt", width: 150, cellClass: 'text-center',
+		    cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "출고구분", field: "usacGbNm", width: 100, cellClass: 'text-center' },
+		{headerName: "실결제금액", field: "realAmt", width: 95, cellClass: 'text-right'
+			,valueFormatter: function(params) {
+				return params.value.addComma();
+			}
+		},
+		{headerName: "수수료율", field: "delvFeeRate", width: 95, cellClass: 'text-right'
+			,cellRenderer: function(params) {
+				return params.value === 0 ? '': params.value+'%';
+			}
+		},
+		{headerName: "수수료", field: "delvFeeAmt", width: 95, cellClass: 'text-right'
+			,valueFormatter: function(params) {
+				return params.value.addComma();
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 90, cellClass: 'text-center'},
+		{headerName: "주문상세", field: "ordDtlNo", width: 90, cellClass: 'text-center', hide: true}
+	];
+
+	//출고거부 이력 그리드
+	var columnBanDelvDefs = [
+		{headerName: "이미지", field: "imgPath1", width: 100, height: 60, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt=""  onerror="this.src=\'/image/no.gif\';"/>';
+			}
+		},
+		{headerName: "거부일시", field: "delvBanStdt", width: 150, cellClass: 'text-center'
+		},
+		{headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
+		{headerName: "컬러", field: "optCd1", width: 80, cellClass: 'text-center'},
+		{headerName: "사이즈", field: "optCd2", width: 80, cellClass: 'text-center'},
+		{headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
+		{headerName: "거부사유", field: "rejectReason", width: 100, cellClass: 'text-center'}
+	];
+
+	var gridWaitingOptions = gagaAgGrid.getGridOptions(columnwatingApplyDefs);
+	var gridDeliveryOptions = gagaAgGrid.getGridOptions(columnDeliveryDefs);
+	var gridConfirmOptions = gagaAgGrid.getGridOptions(columnConfirmDefs);
+	var gridUsacOptions = gagaAgGrid.getGridOptions(columnUsacDefs);
+	var gridBanDelvOptions = gagaAgGrid.getGridOptions(columnBanDelvDefs);
+	
+	gridWaitingOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	gridDeliveryOptions.rowHeight = 60;
+	gridConfirmOptions.rowHeight = 60;
+	gridUsacOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+	gridBanDelvOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
+
+	//gridDeliveryOptions.rowSelection = 'multiple';
+	//gridWaitingOptions.rowSelection = 'multiple';
+
+	gridDeliveryOptions.defaultColDef.editable = true;
+	gridDeliveryOptions.stopEditingWhenGridLosesFocus = true;
+	gridWaitingOptions.isRowSelectable = function(rowNode) {
+		return rowNode.data.delvArGb == 'Y';
+	}
+
+	// 출고대기 주문조회
+	$('#btnWaitSearch').on('click', function () {
+		if(!gagajf.validation('#waitingOrder'))
+			return;
+		gagaAgGrid.fetch('/pos/wait/order/list',gridWaitingOptions, '#waitingOrder');
+	});
+
+	// 출고조회
+	$('#btnDeliveySearch').on('click', function () {
+		if(!gagajf.validation('#deliveryInfo'))
+			return;
+		gagaAgGrid.fetch('/pos/delivery/order/list',gridDeliveryOptions, '#deliveryInfo');
+	});
+	
+	// 확정대기 조회
+	$('#btnConfirmSearch').on('click', function () {
+		if(!gagajf.validation('#confirmation'))
+			return;
+		gagaAgGrid.fetch('/pos/confirm/order/list',gridConfirmOptions, '#confirmation');
+	});
+	
+
+	// 정산내역 조회
+	$('#btnSearchUsac').on('click', function () {
+		gagaAgGrid.fetch('/pos/usac/list',gridUsacOptions, '#usacList');
+	});
+
+	// 출고거부 조회
+	$('#btnBanDelvSearch').on('click', function () {
+		gagaAgGrid.fetch('/pos/ban/delivery/list',gridBanDelvOptions, '#banDelv');
+	});
+
+	var fnSetDelvCallback = function() {
+		$('#tab1').trigger('click');
+		$('#btnWaitSearch').trigger('click');
+	};
+
+	var fnCancelCallback = function() {
+		$('#tab3').trigger('click');
+		$('#btnDeliveySearch').trigger('click');
+	};
+
+
+	// 출고수락
+	var fnApplyDelvLoc = function(ordNo, ordDtlNo, ordQty, goodsType) {
+		
+		var params = {};
+		params.ordNo     = ordNo;
+		params.ordDtlNo  = ordDtlNo;
+		params.delvLocCd = delvLocCd;
+		params.ordQty    = ordQty
+		params.delvArGb  = 'Y';  // 수락
+		
+		var msg ="";
+		if("G056_S" == goodsType){
+			msg ="세트상품입니다.<br>관련상품 모두 출고수락 하시겠습니까?";
+		} else {
+			msg ="출고수락 하시겠습니까?";
+		}
+		mcxDialog.confirm(msg, {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/pos/delivery/assign/save', jsonData, fnSetDelvCallback);
+			}
+		});			
+	};
+
+	// 출고거부
+	gridWaitingOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'delvArGbN' && event.data.delvArGb == 'P'){
+			if(gagajf.isNull(event.data.rejectReason) || event.data.rejectReason === '0'){
+				mcxDialog.alert('거부 사유를 선택해주세요.');
+			} else {
+				var params = {};
+				params.ordNo        = event.data.ordNo;
+				params.ordDtlNo     = event.data.ordDtlNo;
+				params.delvLocCd    = delvLocCd;
+				params.ordQty       = event.data.ordQty
+				params.delvArGb     = 'N';  // 거부
+				params.rejectReason = event.data.rejectReason;
+				
+				var msg = "";
+				if("G056_S" == event.data.goodsType){
+					msg = "세트상품입니다.<br>관련상품 모두 거부 하시겠습니까?";
+				} else {
+					msg = "거부 하시겠습니까?";
+				}
+				
+				mcxDialog.confirm(msg, {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var jsonData = JSON.stringify(params);
+						gagajf.ajaxJsonSubmit('/pos/delivery/assign/save', jsonData, fnSetDelvCallback);
+					}
+				});
+			}
+		}
+	}
+
+	// 수락취소
+	gridDeliveryOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'delvArGbCnl' && (event.data.ordDtlStat == 'G013_30' || event.data.ordDtlStat == 'G013_40')){
+			if(gagajf.isNull(event.data.rejectReason) || event.data.rejectReason === '0'){
+				mcxDialog.alert('수락취소 사유를 선택해주세요.');
+			} else {
+				var params = {};
+				params.ordNo = event.data.ordNo;
+				params.ordDtlNo = event.data.ordDtlNo;
+				params.delvLocCd = event.data.delvLocCd;
+				params.ordQty    = event.data.ordQty
+				params.delvArGb = 'N';  // 거부
+				params.rejectReason = event.data.rejectReason;
+				mcxDialog.confirm('수락취소 하시겠습니까?<br/> 다른출고처로 지정됩니다.', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						var jsonData = JSON.stringify(params);
+						gagajf.ajaxJsonSubmit('/pos/delivery/assign/save/cancel', jsonData, fnCancelCallback);
+					}
+				});
+			}
+		}
+	}
+
+	// Cnplus엑셀다운로드
+	$('#btnReCnplus').on('click', function() {
+
+		var selectedData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectedData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#deliveryInfo input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		mcxDialog.confirm('CNPlus양식 엑셀 다운로드 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnExcelDownLoad('#deliveryInfo');
+			}
+		});
+	});
+
+	//엑셀다운로드
+	var fnExcelDownLoad = function(formId) {
+		var params =  $(formId).serialize();
+		if(formId==='#waitingOrder') {
+			$('#orderExcelList').attr({ href : '/pos/order/excel/list?' + params }).get(0).click();
+		}
+		if(formId==='#deliveryInfo') {
+			$('#deliveryExcelList').attr({ href : '/pos/order/excel/list?' + params }).get(0).click();
+		}
+	};
+
+
+	// 송장번호 등록 버튼
+	$('#btnDeliveySave').on('click', function() {
+
+		var selectData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		var selectedData = gridDeliveryOptions.api.getSelectedNodes();
+
+		var chk ="Y";
+		$.each(selectedData, function(idx, row) {
+
+			if(!gagajf.isNull(row.data.ordDtlNo)) {
+				// 송장번호 저장 완료건들 체크 풀기
+				if(row.data.ordDtlStat =="G013_40" || row.data.ordDtlStat =="G013_50" || row.data.ordDtlStat =="G013_60" || row.data.ordDtlStat =="G013_70"){
+					gridDeliveryOptions.api.deselectIndex(row.rowIndex);
+				}
+
+				if(row.data.shipCompCd == "D1029"){
+					var invoNo = row.data.invoiceNo;
+
+					//송장번호 자리수 체크 12자리
+					var invoNoLen  = invoNo.length;
+					if(invoNoLen != 12){
+						mcxDialog.alert('['+invoNo+']은 잘못된 송장번호 형식입니다.');
+						chk = "N";
+						return false;
+					}
+					// 송장번호 유효성 체크 [ 앞2자리 제외하고 3번째자리부터 9개숫자를 7로나눈 나머지가 12번째 숫자임.]
+					var invoNolast = invoNo.substring(11,12);
+					var chkInvono = invoNo.substring(2,11);
+					var invonoMod = chkInvono % 7 ;
+
+					if(invoNolast != invonoMod ){
+						mcxDialog.alert('['+invoNo+']은 잘못된 송장번호 형식입니다.');
+						chk = "N";
+						return false;
+					}
+				}
+
+				if(gagajf.isNull(row.data.invoiceNo)){
+					mcxDialog.alert('송장번호를 입력해 주세요.');
+					chk = "N";
+					return false;
+				}
+			}
+		});
+
+
+		var selectedData2 = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength2 = selectedData2.length;
+		if (dataLength2 === 0) {
+			mcxDialog.alert('이미 완료된 대상입니다.');
+			return;
+		}
+
+		if(chk == "N") return false;
+		mcxDialog.confirm('송장번호등록 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnSaveInvoice();
+			}
+		});
+
+	});
+
+	// 송장번호 등록
+	var fnSaveInvoice = function(){
+		var selectedData = gagaAgGrid.selectedRowData(gridDeliveryOptions);
+		var dataLength = selectedData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#deliveryInfo input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		var jsonData = JSON.stringify(selectedData);
+		gagajf.ajaxJsonSubmit('/pos/invoice/save/invoiceno', jsonData, fnInvoiceCallback);
+	}
+
+	var fnInvoiceCallback = function() {
+		$('#tab3').trigger('click');
+		$('#btnDeliveySearch').trigger('click');
+		mcxDialog.alert('입력이 완료되었습니다.<br>확정대기목록에서 출고확정 하세요.');
+	};
+
+
+	
+	// 출고확정 
+	$('#btnConfirmSave').on('click', function() {
+
+		var selectData = gagaAgGrid.selectedRowData(gridConfirmOptions);
+		var dataLength = selectData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		var selectedData = gridConfirmOptions.api.getSelectedNodes();
+
+		$.each(selectedData, function(idx, row) {
+
+			if(!gagajf.isNull(row.data.ordDtlNo)) {
+				// 출고확정 완료건들 체크 풀기
+				if(row.data.ordDtlStat =="G013_50" || row.data.ordDtlStat =="G013_60" || row.data.ordDtlStat =="G013_70"){
+					gridConfirmOptions.api.deselectIndex(row.rowIndex);
+				}
+			}
+		});
+
+		var selectedData2 = gagaAgGrid.selectedRowData(gridConfirmOptions);
+		var dataLength2 = selectedData2.length;
+		if (dataLength2 === 0) {
+			mcxDialog.alert('이미 완료된 대상입니다.');
+			return;
+		}
+
+		mcxDialog.confirm('출고확정 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				fnConfirmSave();
+			}
+		});
+
+	});
+	
+	// 출고확정 저장 
+	var fnConfirmSave = function(){
+		var selectedData = gagaAgGrid.selectedRowData(gridConfirmOptions);
+		var dataLength = selectedData.length;
+		if (dataLength === 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		var ordDtlNoArr = [];
+		$.each(selectedData, function(idx, data) {
+			if(!gagajf.isNull(data.ordDtlNo)) {
+				ordDtlNoArr.push(data.ordDtlNo);
+			}
+		});
+
+		$('#confirmation input[name=ordDtlNos]').val(ordDtlNoArr.join(','));
+		var jsonData = JSON.stringify(selectedData);
+		gagajf.ajaxJsonSubmit('/pos/confirm/save', jsonData, fnConfirmCallback);
+	}
+	
+	// 출고확정 콜백 
+	var fnConfirmCallback = function() {
+		$('#tab2-1').trigger('click');
+		$('#btnConfirmSearch').trigger('click');
+		mcxDialog.alert('출고확정 되었습니다.');
+	};
+	
+
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('watingGrid',  gridWaitingOptions);
+		gagaAgGrid.createGrid('deliveryGrid',gridDeliveryOptions);
+		gagaAgGrid.createGrid('confirmGrid',gridConfirmOptions);
+		gagaAgGrid.createGrid('usacGrid',    gridUsacOptions);
+		gagaAgGrid.createGrid('banDelvGrid', gridBanDelvOptions);
+		
+		cfnCreateCalendar('#deliveryTerms', 'deliveryStDate', 'deliveryEdDate', true, '조회');
+		cfnCreateCalendar('#waitTerms',     'waitOrdStDate',  'waitOrdEdDate',  true, '조회');
+		cfnCreateCalendar('#confirmTerms',  'confirmStDate',  'confirmEdDate', true, '조회');		
+		cfnCreateCalendar('#usacTerms',     'usacStDate',     'usacEdDate',     true, '조회');
+		cfnCreateCalendar('#banDelvTerms',  'banDelvStDate',  'banDelvEdDate',  true, '조회');
+
+		setTimeout(fnSetDate, 100);
+	});
+
+	var fnSetDate = function(){
+		cfnChangeCalendar('2d', $('#deliveryStDate'), $('#deliveryEdDate'));
+		cfnChangeCalendar('1d', $('#waitOrdStDate'), $('#waitOrdEdDate'));
+		cfnChangeCalendar('2d', $('#confirmStDate'), $('#confirmEdDate'));
+		cfnChangeCalendar('1m', $('#usacStDate'), $('#usacEdDate'));
+		cfnChangeCalendar('1m', $('#banDelvStDate'), $('#banDelvEdDate'));
+
+		//$('#btnWaitSearch').trigger('click');
+	}
+
+	/*]]>*/
+</script>
+</body>
+</html>