Forráskód Böngészése

@ 입점업체 주문목록 조회 기능 추가

@ 입점업체 발주확정대상목록 조회 기능 추가
jsh77b 4 éve
szülő
commit
f69785d765

+ 204 - 0
src/main/java/com/style24/admin/biz/web/TsaOrderScmController.java

@@ -14,13 +14,18 @@ import org.springframework.web.servlet.ModelAndView;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscKakaotalkService;
+import com.style24.core.biz.service.TscNaverPayService;
+import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.OrderChange;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -44,6 +49,15 @@ public class TsaOrderScmController extends TsaBaseController {
 	@Autowired
 	private ObjectMapper mapper;
 	
+	@Autowired
+	private TscNaverPayService coreNaverPayService;
+	
+	@Autowired
+	private TscOrderChangeService coreOrderChangeService;
+	
+	@Autowired
+	private TscKakaotalkService coreKakaotalkService;
+	
 	/**
 	 * 입점업체미발주목록화면
 	 *
@@ -335,6 +349,196 @@ public class TsaOrderScmController extends TsaBaseController {
 		return OrderSellerClaimList;
 	}
 	
+	/**
+	 * 입점 상품 주문 목록
+	 * @param orderList - 주문목록화면
+	 * @return ModelAndView
+	 * @author xodud1202
+	 * @since 2020. 06. 07
+	 */
+	@GetMapping("/seller/delv/list/form")
+	public ModelAndView sellerDelvListForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("ordDtlStatList"	, rendererService.getAvailCommonCodeList("G013"));				// 주문상세상태코드
+		mav.addObject("shipCompanyList"	, rendererService.getShipCompanyList());						// 택배사 목록
+
+		mav.setViewName("order/OrderSellerDelvEndListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 입점업체 주문 목록 조회
+	 *
+	 * @param order - 주문정보
+	 * @return Collection<Order>
+	 * @author xodud1202
+	 * @since 2021. 06. 07
+	 */
+	@PostMapping("/seller/order/list")
+	@ResponseBody
+	public GagaMap getOrderSellerOrderList(@RequestBody Order order) {
+		GagaMap result = new GagaMap();
+
+		order.setPageable(new TscPageRequest(order.getPageNo() - 1, order.getPageSize()));
+		
+		// 2021.07.13 업체,브랜드 검색방법 변경
+		if (!StringUtils.isBlank(order.getBrandList())) {
+			try {
+				String[] arrBrandCd = mapper.readValue(order.getBrandList(), String[].class);
+				order.setMultiBrand(arrBrandCd);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(order.getSupplyCompList())) {
+			try {
+				String[] arrSupplyComp = mapper.readValue(order.getSupplyCompList(), String[].class);
+				order.setMultiSupplyCompCd(arrSupplyComp);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+		
+		// 주문전체건수 조회
+		int totalCount = coreOrderService.getOrderSellerUnorderListCount(order);
+		order.getPageable().setTotalCount(totalCount);
+
+		order.setIfYn("Y");			// 취소, 반품 신청/대기 건 제외하지 않도록 구분값 지정
+		Collection<Order> orderList = coreOrderService.getOrderSellerUnorderList(order);
+
+		result.set("pageing"	, order);
+		result.set("orderList"	, orderList);
+
+		return result;
+	}
+	
+	/**
+	 * 입점업체 최종 배송 확인
+	 *
+	 * @return ModelAndView
+	 * @author xodud1202
+	 * @since 2021. 04. 20
+	 */
+	@GetMapping("/seller/final/delv/list/form")
+	public ModelAndView sellerFinalDelvListForm() {
+		ModelAndView mav = new ModelAndView();
+		
+		mav.addObject("shipCompanyList"	, rendererService.getShipCompanyList());						// 택배사 목록
+		mav.setViewName("order/OrderSellerDelvListForm");
+		return mav;
+	}
+
+	/**
+	 * 입점업체 배송준비중 목록 조회
+	 * @param order - 주문정보
+	 * @return Collection<Order>
+	 * @author jsh77b
+	 * @since 2020. 11. 16
+	 */
+	@PostMapping("/seller/final/delv/list")
+	@ResponseBody
+	public Collection<Order> sellerFinalDelvList(@RequestBody Order order) throws Exception {
+		Collection<Order> orderList = coreOrderService.getOrderSellerUnorderList(order);
+		return orderList;
+	}
+
+	/**
+	 * 입점 상품 배송중 처리
+	 *
+	 * @param orderList - 미발주목록
+	 * @return GagaResponse
+	 * @author xodud1202
+	 * @since 2021. ?. ?
+	 */
+	@PostMapping("/seller/delv/started")
+	@ResponseBody
+	public GagaResponse sellerDelvStarted(@RequestBody Collection<Order> orderList) {
+		int userNo = TsaSession.getInfo().getUserNo();
+		Collection<OrderChange> cancelDataList = coreOrderService.getCancelDataList(orderList, userNo);
+		
+		log.info("cancelDataList >>> {}", cancelDataList);
+		log.info("size >>> {}", cancelDataList.size());
+
+		// [주문배송] 리스트로 지정된 주문상세번호와 취소수량 배열로 변경 후 취소
+		for (OrderChange change : cancelDataList) {
+			change.setOrdDtlNoArr(change.getOrdDtlNoList().stream().mapToInt(i->i).toArray());
+			change.setCnclRtnReqQtyArr(change.getCnclRtnReqQtyList().stream().mapToInt(i->i).toArray());
+
+			// 2021.07.15 교환배송건인 경우는 취소처리 대상에서 예외 처리
+			if (change.getOrdChgSq() == null || change.getOrdChgSq() < 1) {
+
+				// PG구분:KCP, 결제수단:무통장입금, 환불계좌가 없는경우 취소접수단계로 처리
+				// 2021.09.10 card007 핸드폰결제, 무통장입금은 부분취소 시 에러 발생함으로 취소접수로 처리
+				if (TscConstants.PgGb.KCP.value().equals(change.getPgGb()) && (TscConstants.PayMeans.BANK_DEPOSIT.value().equals(change.getPayMeans()) || TscConstants.PayMeans.CELL_PHONE.value().equals(change.getPayMeans()))) {
+					// 취소점수
+					change.setChgGb(TscConstants.OrderChangeGb.CANCEL.value());
+					coreOrderChangeService.cancelRequest(change);
+
+					// 2021.09.10 card007 취소 접수시에는 CS에서 OB함으로 카카오알림톡 발송 X
+					// try {
+					// 	// 환불계좌X 취소 접수 알림톡 관련 정보 조회
+					// 	OrderChange orderChange = new OrderChange();
+					// 	orderChange = coreOrderChangeService.getKakaoOrderCancelInfo(change.getOrdChgSq());
+					//
+					// 	// 취소 알림톡 발송
+					// 	orderChange.setChgGb(TscConstants.OrderCancelReason.SOLDOUT_CANCEL.value());
+					// 	coreKakaotalkService.sendOrderCancelComplete(orderChange, userNo);
+					// } catch (Exception e) {
+					// 	e.printStackTrace();
+					// }
+				}
+				// 무통장입금 주문 중 환불계좌정보 없을 경우 제외는 취소처리
+				// 2021.09.10 card007 핸드폰결제, 무통장입금 제외로 변경
+				else {
+					// 취소완료처리
+					GagaMap cancelInfo = coreOrderChangeService.orderCancelPreInfo(change, userNo);
+
+					// 3. 취소완료 카카오알림톡 발송
+					Integer ordChgSq = cancelInfo.getInt("ordChgSq");
+
+					if (ordChgSq != null && ordChgSq > 0) {
+
+						// 네이버페이 품절취소 송부
+						if(TscConstants.PgGb.NAVER_ORDER.value().equals(change.getPgGb())) {
+							for (int i = 0; i < change.getOrdDtlNoArr().length; i++) {
+								Order order = new Order();
+								order.setOrdDtlNo(change.getOrdDtlNoArr()[i]);
+								try {
+									coreNaverPayService.sendNaverPaySoldoutCancel(order, userNo);        // 품절취소
+								} catch (Exception e) {
+									e.printStackTrace();
+								}
+							}
+						}
+
+						try {
+							// 취소 알림톡 관련 정보 조회
+							OrderChange orderChange = new OrderChange();
+							orderChange = coreOrderChangeService.getKakaoOrderCancelInfo(ordChgSq);
+
+							// 취소 알림톡 발송
+							orderChange.setChgGb(TscConstants.OrderCancelReason.SOLDOUT_CANCEL.value());
+							coreKakaotalkService.sendOrderCancelComplete(orderChange, userNo);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+
+						// TODO 취소 메일 송부를 품절취소에서도 보내는지 ?
+					}
+				}
+			}
+		}
+
+		coreOrderService.updateSellerDelvStart(orderList, cancelDataList, userNo);
+
+		return super.ok("");
+	}
+	
 	
 }
 

+ 506 - 0
src/main/webapp/WEB-INF/views/order/OrderSellerDelvEndListForm.html

@@ -0,0 +1,506 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderSellerDelvEndListForm.html
+ * @desc    : 입점주문목록조회 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.06.07   xodud1202   최초 작성
+ *******************************************************************************
+ -->
+ 
+<div id="main">
+	<!-- 메인타이틀 영역 -->
+	<div class="main-title">
+	</div>
+	<!-- //메인타이틀 영역 -->
+
+	<!-- 메뉴 설명 -->
+	<div class="infoBox menu-desc">
+	</div>
+
+	<form id="searchForm" name="searchForm" action="#" th:action="@{'/order/seller/order/list'}">
+		<input type="hidden" id="searchGb" name="searchGb" />
+		<input type="hidden" id="imageViewYn" name="imageViewYn" />
+
+		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<!-- 검색조건 영역 -->
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3>
+					<i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">주문번호</font> 또는 <font color="red">검색조건</font> 하나를 꼭 입력해 주세요.
+				</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>업체</th>
+						<td>
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
+							<span id="supplyCompText"></span>
+							<input type="hidden" name="supplyCompList"/>
+						</td>
+						<th>브랜드</th>
+						<td colspan="5">
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
+							<span id="brandText"></span>
+							<input type="hidden" name="brandList"/>
+						</td>
+					</tr>
+					<tr>
+						<th>주문번호</th>
+						<td>
+							<input type="text" name="ordNo" placeholder="" maxlength="20"/>
+						</td>
+						<th>주문자명</th>
+						<td>
+							<input type="text" name="ordNm" placeholder="" maxlength="20"/>
+						</td>
+						<th>상품코드</th>
+						<td>
+							<input type="text" name="goodsCd" placeholder="" maxlength="20"/>
+						</td>
+						<th>주문상세상태</th>
+						<td>
+							<select name="ordDtlStat" id="ordDtlStat">
+								<option value="G013_20">결제완료</option>
+								<option value="G013_30">상품준비중</option>
+								<option value="G013_40">배송준비중</option>
+								<option value="G013_50" selected>배송중</option>
+								<option value="G013_60">배송완료</option>
+								<option value="G013_70">구매확정</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>조회일자</th>
+						<td colspan="7">
+							<select name="searchDateGb">
+								<option value="ordDt">주문일자</option>
+							</select>
+							<span id="terms"></span>
+						</td>
+					</tr>
+				</table>
+
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-info btn-lg" id="btnOrderSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit">초기화</button>
+					</li>
+				</ul>
+
+			</div>
+		</div>
+
+		<div class="panelStyle">
+			<input type="hidden" name="pageNo" id="pageNo" value ="1"/>
+
+			<ul class="panelBar">
+				<!--<li>
+					<button type="button" class="btn btn-info btn-lg" onclick="cfnDownloadSampleFile('SF020');">입점송장번호등록다운로드</button>
+				</li>
+				<li class="aR">
+					<button type="button" id="btnExcelDown" class="btn btn-info btn-lg">엑셀다운로드</button>
+					<button type="button" id="btnInvoiceExcelUpLoad" class="btn btn-success btn-lg">송장엑셀업로드</button>
+					<button type="button" id="btnSave" class="btn btn-success btn-lg">저장</button>
+				</li>-->
+				<li class="aR">
+					검색결과 : <strong><span id="rowCntOrderList">0</span> 건</strong>&nbsp;
+					쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
+					<select id="pageSize" name="pageSize">
+						<option value="100" selected="selected">100개씩 보기</option>
+						<option value="500">500개씩 보기</option>
+						<option value="1000">1000개씩 보기</option>
+						<option value="5000">5000개씩 보기</option>
+					</select>
+				</li>
+			</ul>
+
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width: 100%; height: 400px;" class="ag-theme-balham lh30"></div>
+			</div>
+
+			<ul class="panelBar">
+				<li class="center">
+					<div class="tablePaging" id="orderListPagination"></div>
+				</li>
+			</ul>
+		</div>
+
+	</form>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+var sessRoleCd 		= [[${sessionInfo.roleCd}]];
+var shipCompanyList = gagajf.convertToArray([[${shipCompanyList}]]);
+
+var columnDefs = [
+	{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+	{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+	{headerName: "원주문/교환",		field:"ordExchGb",			width:100, cellClass: 'text-center'
+		,valueFormatter: function(params) {
+			if(params.value && params.value == "O") {
+				return "원주문";
+			} else {
+				return "교환";
+			}
+		}
+	},
+	{headerName: "입점업체",			field:"supplyCompNm",		width:100, cellClass: 'text-center'},
+	{headerName: "입점업체코드",		field:"supplyCompCd",		width:100, cellClass: 'text-center', hide: true},
+	{headerName: "브랜드",			field:"brandKnm",			width:100, cellClass: 'text-center'},
+	{headerName: "주문번호",			field:"ordNo",				width:100, cellClass: 'text-center'},
+	{headerName: "주문상세번호",		field:"ordDtlNo",			width:100, cellClass: 'text-center'},
+	{headerName: "주문상세상태",		field:"ordDtlStatNm", 		width:100, cellClass: 'text-center'},
+	{headerName: "주문자명",			field:"ordNm",				width:100, cellClass: 'text-center'},
+	{headerName: "주문일시",			field:"ordDt",				width:100, cellClass: 'text-center',
+		cellRenderer		: function (params) {
+			return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
+		}
+	},
+	{headerName: "결제수단",			field:"payMeansNm",			width:100, cellClass: 'text-center'},
+	{headerName: "주문자휴대전화",		field:"ordPhnno",			width:100, cellClass: 'text-center'},
+	{headerName: "수령자명",			field:"recipNm",			width:100, cellClass: 'text-center'},
+	{headerName: "수령자휴대전화",		field:"recipPhnno",			width:120, cellClass: 'text-center'},
+	{headerName: "수령자우편번호",		field:"recipZipcode",		width:120, cellClass: 'text-center'},
+	{headerName: "수령자기본주소",		field:"recipBaseAddr",		width:120, cellClass: 'text-center'},
+	{headerName: "수령자상세주소",		field:"recipDtlAddr",		width:120, cellClass: 'text-center'},
+	{headerName: "업체상품코드",		field:"supplyGoodsCd",		width:100, cellClass: 'text-center'},
+	{headerName: "상품코드",			field:"goodsCd",			width:100, cellClass: 'text-center'},
+	{headerName: "상품명",			field:"goodsNm",			width:100, cellClass: 'text-center'},
+	{headerName: "사이즈",			field:"optCd2",				width:100, cellClass: 'text-center'},
+	{headerName: "주문수량",			field:"ordQty",				width:100, cellClass: 'text-center'},
+	{headerName: "취소수량",			field:"cnclRtnQty",			width:100, cellClass: 'text-center'},
+	{headerName: "주문금액",			field:"ordAmt",				width:100, cellClass: 'text-right'
+		,valueFormatter: function(params) {
+			if(params.value && params.value > 0) {
+				return params.value.addComma();
+			} else {
+				return 0;
+			}
+		}},
+	{headerName: "할인금액",			field:"totDcAmt",			width:100, cellClass: 'text-right'
+		,valueFormatter: function(params) {
+			if(params.value && params.value > 0) {
+				return params.value.addComma();
+			} else {
+				return 0;
+			}
+		}},
+	{headerName: "실결제금액",		field:"realOrdAmt",			width:100, cellClass: 'text-right'
+		,valueFormatter: function(params) {
+			if(params.value && params.value > 0) {
+				return params.value.addComma();
+			} else {
+				return 0;
+			}
+		}},
+	{headerName: "배송업체",			field:"shipCompCd",			width:150, cellClass: 'text-center'},
+	{headerName: "송장",				field:"invoiceNo",			width:150, cellClass: 'text-center'}
+];
+
+var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+gridOptions.suppressRowClickSelection = true;
+gridOptions.rowSelection = 'multiple';
+gridOptions.stopEditingWhenGridLosesFocus = true;
+
+// 조회버튼
+$('#btnOrderSearch').on('click', function() {
+	fnSearch();
+});
+
+// 검색
+var fnSearch = function() {
+	var formId 		= '#searchForm';
+	var ordNo 		= $('#searchForm input[name=ordNo]').val();
+	var stDate 		= $('#stDate').val();
+	var edDate 		= $('#edDate').val();
+
+	if (!gagajf.isNull(stDate)) {
+		if (gagajf.isNull(edDate)) {
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+	}
+
+	if (!gagajf.isNull(edDate)) {
+		if (gagajf.isNull(stDate)) {
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+	}
+	
+	// 2021.09.11 조회일자가 없을때 조회조건체크
+	var supplyCompSearchTxt 	= $("#searchForm #supplyCompSearchTxt").val();
+	var supplyCompList 			= $('#searchForm input[name=supplyCompList]').val();
+	var brandText 				= $("#searchForm #brandText").val();
+	var brandList 				= $('#searchForm input[name=brandList]').val();
+	
+	if (gagajf.isNull(stDate) && gagajf.isNull(edDate)) {
+		var temp = false;
+		
+		if (!gagajf.isNull(ordNo)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(supplyCompSearchTxt)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(supplyCompList)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(brandText)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(brandList)) {
+			temp = true;
+		}
+		
+		if (temp == false) {
+			mcxDialog.alert('조회조건을 설정 해주세요.');
+			return;
+		}
+	}
+
+	gagaPaging.init('searchForm', fnSearchCallBack, 'orderListPagination', 100);
+	gagaPaging.load($("#searchForm input[name=pageNo]").val());
+}
+
+var fnSearchCallBack = function(result){
+	$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+	$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+
+	gridOptions.api.setRowData(result.orderList);
+	gagaPaging.createPagination(result.pageing.pageable);
+}
+
+// 엑셀다운로드 시 주문상태 변경
+$('#btnExcelDown').on('click', function () {
+
+	var selectedData = gridOptions.api.getSelectedRows();
+
+	if (selectedData.length == 0) {
+		mcxDialog.alert('선택된 행이 없습니다.');
+		return;
+	}
+
+	mcxDialog.confirm('엑셀 다운로드 하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function(){
+			var jsonData = JSON.stringify(selectedData);
+			gagajf.ajaxJsonSubmit('/order/seller/unorder/status/save', jsonData, fnExcelDownCollback);
+		}
+	});
+});
+
+// 엑셀다운로드
+var fnExcelDownCollback = function(flag){
+	var selectedData = gridOptions.api.getSelectedRows();
+
+	if (selectedData.length == 0) {
+		mcxDialog.alert('선택된 행이 없습니다.');
+		return;
+	}
+
+	let ordDtlNoArr = new Array();
+	for(let i = 0 ; i < selectedData.length ; i++) {
+		ordDtlNoArr.push(selectedData[i].ordDtlNo);
+	}
+
+	let order = {
+		ordDtlNoArr : ordDtlNoArr
+	};
+	
+	$('#excelList').attr({ href : '/order/seller/unorder/excel/list?ordDtlNoArr=' + ordDtlNoArr }).get(0).click();
+}
+
+// 송장 엑셀 업로드
+$('#btnInvoiceExcelUpLoad').on('click', function() {
+	cfnExcelUploadPopup('invoiceExcelUpload', 'invoiceExcelUpload');
+});
+
+var invoiceExcelUpload = function(result){
+	mcxDialog.confirm('송장 변경을 진행하시겠습니까?', {
+		cancelBtnText	: "취소"
+		, sureBtnText	: "확인"
+		, sureBtnClick	: function(){
+			var data = {
+				procJob 		: result.procJob
+				, excelFileNm 	: result.excelFileNm
+			};
+
+			var jsonData = JSON.stringify(data);
+			gagajf.ajaxJsonSubmit('/order/seller/unorder/invoice/excelupload/save', jsonData, fnInvoiceSaveCollback);
+		}
+	});
+}
+
+// 송장번호 저장후
+var fnInvoiceSaveCollback = function(result){
+	mcxDialog.alert(result.msg);
+	fnSearch();
+	return;
+}
+
+//송장번호 저장시
+$('#btnSave').on('click', function () {
+
+	var selectedData = gridOptions.api.getSelectedRows();
+
+	if (selectedData.length == 0) {
+		mcxDialog.alert('선택된 행이 없습니다.');
+		return;
+	}
+
+	var checkFlag = false;
+	$.each(selectedData, function(idx, item) {
+		if (gagajf.isNull(item.shipCompCd)){
+			checkFlag = true;
+			mcxDialog.alert('배송업체를 선택하세요.');
+			return;
+		}
+
+		if (gagajf.isNull(item.invoiceNo)){
+			checkFlag = true;
+			mcxDialog.alert('송장번호를 입력하세요.');
+			return;
+		}
+	});
+
+	if (checkFlag){
+		return false;
+	}
+
+	mcxDialog.confirm('저장 하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function(){
+			var jsonData = JSON.stringify(selectedData);
+			gagajf.ajaxJsonSubmit('/order/seller/unorder/invoice/save', jsonData, fnInvoiceSaveCollback);
+
+		}
+	});
+
+});
+
+// 초기화 클릭시
+$('#btnInit').on('click', function() {
+	$('#searchForm')[0].reset();
+	
+	$("#searchForm #supplyCompText").text("");
+	$("#searchForm #brandText").text("");
+
+	$('#searchForm input[name=brandList]').val('');
+	$('#searchForm input[name=supplyCompList]').val('');
+});
+
+// 초기설정
+$(document).ready(function() {
+	// 달력기능 활성화
+	cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', 'X');
+	
+	gagaAgGrid.createGrid('gridList', gridOptions);
+	gridOptions.api.hideOverlay();
+	
+	// 최근한주검색
+	$('.btnRecentWeek').trigger('click');
+});
+
+//2021.07.13 업체,브랜드 검색방법 변경
+//업체 조회 선택시
+$('#btnSearchSupplyComp').on('click', function() {
+	cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');
+});
+
+//업체 조회 팝업에서 호출
+var fnSetSupplyCompInfo = function(result) {
+	var arrSupplyComp 	= [];
+	var supplyCompText 	= "";
+	var sIndex 			= 0;
+
+	$('#searchForm').find('#supplyCompText').html('');
+	$('#searchForm input[name=supplyCompSearchTxt]').val('');
+
+	result.forEach(function(supplyComp){
+		sIndex++;
+		arrSupplyComp.push(supplyComp.supplyCompCd);
+	});
+
+	// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
+	if (sIndex == 1) {
+		$('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
+	} else {
+		supplyCompText = sIndex + " 개";
+		$('#searchForm').find('#supplyCompText').html(supplyCompText);
+	}
+
+	var jsonData = JSON.stringify(arrSupplyComp);
+	$("#searchForm input[name=supplyCompList]").val(jsonData);
+}
+
+//브랜드 조회 선택시
+$('#btnSearchBrand').on('click', function() {
+	cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
+});
+
+//브랜드 조회 팝업에서 호출
+var fnSetBrandInfo = function(result) {
+	var arrbrandCd 	= [];
+	var brandText 	= "";
+	var bIndex 		= 0;
+
+	$('#searchForm').find('#brandText').html('');
+	$('#searchForm input[name=searchTxt]').val('');
+
+	result.forEach(function(brand){
+		bIndex++;
+		arrbrandCd.push(brand.brandCd);
+	});
+
+	// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
+	if (bIndex == 1) {
+		$('#searchForm input[name=searchTxt]').val(arrbrandCd[0]);
+	}else{
+		brandText = bIndex + " 개";
+		$('#searchForm').find('#brandText').html(brandText);
+	}
+	var jsonData = JSON.stringify(arrbrandCd);
+	$("#searchForm input[name=brandList]").val(jsonData);
+}
+
+</script>
+
+</html>
+
+
+
+
+

+ 395 - 0
src/main/webapp/WEB-INF/views/order/OrderSellerDelvListForm.html

@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : OrderSellerDelvListForm.html
+ * @desc    : 입점발주최종확인 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.20   xodud1202   최초 작성
+ *******************************************************************************
+ -->
+ 
+<div id="main">
+	<!-- 메인타이틀 영역 -->
+	<div class="main-title">
+	</div>
+	<!-- //메인타이틀 영역 -->
+	
+	<!-- 메뉴 설명 -->
+	<div class="infoBox menu-desc">
+	</div>
+	
+	<form id="searchForm" name="searchForm" action="#" th:action="@{'/order/seller/unorder/list'}">
+		<input type="hidden" name="ordDtlStat" 						value="G013_40" />
+		<input type="hidden" name="pageNo" 			id="pageNo" 	value ="1"/>
+		<input type="hidden" name="supplyCompCd" 					th:value="${supplyCompCd}" />
+		
+		<!-- 패널 영역1 -->
+		<div class="panelStyle" >
+			<!-- 검색조건 영역 -->
+			<!-- TITLE -->
+			<div class="panelTitle">
+				<h3>
+					<i class="fa fa-info-circle"></i>아래 검색조건 중 <font color="red">주문번호</font> 또는 <font color="red">검색조건</font> 하나를 꼭 입력해 주세요.
+				</h3>
+				<span class="panelControl">
+					<i class="fa fa-chevron-up"></i>
+				</span>
+			</div>
+
+			<div class="panelContent">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>업체</th>
+						<td>
+							<input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
+							<span id="supplyCompText"></span>
+							<input type="hidden" name="supplyCompList"/>
+						</td>
+						<th>브랜드</th>
+						<td colspan="5">
+							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
+							<button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
+							<span id="brandText"></span>
+							<input type="hidden" name="brandList"/>
+						</td>
+					</tr>
+					<tr>
+						<th>주문번호</th>
+						<td>
+							<input type="text" name="ordNo" placeholder="" maxlength="20"/>
+						</td>
+						<th>주문자명</th>
+						<td>
+							<input type="text" name="ordNm" placeholder="" maxlength="20"/>
+						</td>
+						<th>상품코드</th>
+						<td colspan="3">
+							<input type="text" name="goodsCd" placeholder="" maxlength="20"/>
+						</td>
+					</tr>
+					<tr>
+						<th>조회일자</th>
+						<td colspan="7">
+							<select name="searchDateGb">
+								<option value="ordDt">주문일자</option>
+							</select>
+							<span id="terms"></span>
+						</td>
+					</tr>
+				</table>
+
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-info btn-lg" id="btnOrderSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" id="btnInit">초기화</button>
+					</li>
+				</ul>
+			</div>
+		</div>
+		
+		<div class="panelStyle">
+			<ul class="panelBar">
+				<li class="aR">
+					<button type="button" id="btnSave" class="btn btn-success btn-lg">저장</button>
+				</li>
+			</ul>
+			
+			<div class="panelContent" style="overflow: hidden;">
+				<div id="gridList" style="width: 100%; height: 700px;" class="ag-theme-balham lh30"></div>
+			</div>
+		</div>
+	</form>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=20210114"></script>
+
+<script th:inline="javascript">
+var shipCompanyList = gagajf.convertToArray([[${shipCompanyList}]]);
+var columnDefs = [
+	{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+	{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+	{headerName: "원주문/교환",		field:"ordExchGb",			width:100, cellClass: 'text-center'
+		,valueFormatter: function(params) {
+			if(params.value && params.value == "O") {
+				return "원주문";
+			} else {
+				return "교환";
+			}
+		}
+	},
+	{headerName: "입점업체",			field:"supplyCompNm",		width:70, cellClass: 'text-center'},
+	{headerName: "입점업체코드",		field:"supplyCompCd",		width:80, cellClass: 'text-center', hide: true},
+	{headerName: "브랜드",			field:"brandKnm",			width:80, cellClass: 'text-center'},
+	{headerName: "주문번호",			field:"ordNo",				width:70, cellClass: 'text-center'},
+	{headerName: "주문상세번호",		field:"ordDtlNo",			width:100, cellClass: 'text-center'},
+	{headerName: "업체상품코드",		field:"supplyGoodsCd",		width:100, cellClass: 'text-center'},
+	{headerName: "상품코드",			field:"goodsCd",			width:100, cellClass: 'text-center'},
+	{headerName: "상품명",			field:"goodsNm",			width:100, cellClass: 'text-center'},
+	{headerName: "옵션1",			field:"optCd1",				width:100, cellClass: 'text-center'},
+	{headerName: "옵션2",			field:"optCd2",				width:100, cellClass: 'text-center'},
+	{headerName: "배송업체",			field:"shipCompCd",			width:120, cellClass: 'text-center'
+		, valueFormatter: function (params) {
+			return gagaAgGrid.lookupValue(shipCompanyList, params.value);
+		}
+		, valueParser: function (params) {
+			return gagaAgGrid.lookupKey(shipCompanyList, params.newValue);
+		}
+	},
+	{headerName: "송장",				field:"invoiceNo",			width:120, cellClass: 'text-center'},
+	{headerName: "주문수량",			field:"ordQty",				width:100, cellClass: 'text-center'},
+	{headerName: "취소수량",			field:"cnclRtnQty",			width:100, cellClass: 'text-center'},
+	{headerName: "출고수량",			field:"delvQty",			width:100, cellClass: 'text-center'},
+	{headerName: "미출고수량",			field:"cancelQty",			width:100, cellClass: 'text-center'
+		, editable 			: true
+		, cellEditor		: 'agRichSelectCellEditor'
+		, cellStyle			: {color: '#fffff', 'background-color': '#aaaaff'}
+		, cellEditorParams	: function(params){
+		
+			// 2021.07.22 교환미출고수량 발생도 처리완료
+			var qtyList = new Array();
+			var qty = params.data.ordQty - params.data.cnclRtnQty
+			if(params.data.pgGb == "NAVER_ORDER") {
+				qtyList.push(0);
+				qtyList.push(qty);
+			} else {
+				for(var i = 0 ; i <= qty ; i++) qtyList.push(i);
+			}
+			return {values: qtyList};
+		},
+		onCellValueChanged : function(params) {
+			if(params.data.cancelQty > -1) {
+				// params.data.cnclRtnQty = params.data.cancelQty;
+				params.data.delvQty = params.data.ordQty - params.data.cnclRtnQty - params.data.cancelQty;
+				gridOptions.api.refreshCells();
+			}
+		}
+	},
+	{headerName: "결제PG",			field: "pgGb",				width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "결제수단",			field: "payMeans",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "고객번호",			field: "custNo",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "주문고객명",			field: "ordNm",				width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "환불계좌은행코드",		field: "bankCd",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "환불계좌예금주명",		field: "accountNm",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "주문고객휴대폰번호",	field: "ordPhnno",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "환불계좌번호",		field: "accountNo",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "배송정책",			field: "delvFeeCd",			width: 100, cellClass: 'text-center', hide: true},
+	{headerName: "변경요청번호",		field: "ordChgSq",			width: 100, cellClass: 'text-center', hide: true}
+];
+
+var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+gridOptions.suppressRowClickSelection = true;
+gridOptions.rowSelection = 'multiple';
+gridOptions.stopEditingWhenGridLosesFocus = true;
+
+//조회버튼
+$('#btnOrderSearch').on('click', function() {
+	fnSearch();
+});
+
+// 검색
+var fnSearch = function() {
+	var formId 		= '#searchForm';
+	var ordNo 		= $('#searchForm input[name=ordNo]').val();
+	var stDate 		= $('#stDate').val();
+	var edDate 		= $('#edDate').val();
+
+	if (!gagajf.isNull(stDate)) {
+		if (gagajf.isNull(edDate)) {
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+	}
+
+	if (!gagajf.isNull(edDate)) {
+		if (gagajf.isNull(stDate)) {
+			mcxDialog.alert('종료 기간을 입력하세요.');
+			return;
+		}
+	}
+	
+	// 2021.09.11 조회일자가 없을때 조회조건체크
+	var supplyCompSearchTxt 	= $("#searchForm #supplyCompSearchTxt").val();
+	var supplyCompList 			= $('#searchForm input[name=supplyCompList]').val();
+	var brandText 				= $("#searchForm #brandText").val();
+	var brandList 				= $('#searchForm input[name=brandList]').val();
+	
+	if (gagajf.isNull(stDate) && gagajf.isNull(edDate)) {
+		var temp = false;
+		
+		if (!gagajf.isNull(ordNo)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(supplyCompSearchTxt)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(supplyCompList)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(brandText)) {
+			temp = true;
+		}
+		if (!gagajf.isNull(brandList)) {
+			temp = true;
+		}
+		
+		if (temp == false) {
+			mcxDialog.alert('조회조건을 설정 해주세요.');
+			return;
+		}
+	}
+	
+	gagaPaging.init('searchForm', fnSearchCallBack, 'orderListPagination', 100);
+	gagaPaging.load($("#searchForm input[name=pageNo]").val());
+}
+
+var fnSearchCallBack = function(result){
+	$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+	$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+	$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+
+	gridOptions.api.setRowData(result.orderList);
+	gagaPaging.createPagination(result.pageing.pageable);
+}
+
+//초기화 클릭시
+$('#btnInit').on('click', function() {
+	$('#searchForm')[0].reset();
+	
+	$("#searchForm #supplyCompText").text("");
+	$("#searchForm #brandText").text("");
+
+	$('#searchForm input[name=brandList]').val('');
+	$('#searchForm input[name=supplyCompList]').val('');
+});
+
+//초기설정
+$(document).ready(function() {
+	// 달력기능 활성화
+	cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '주문', 'X');
+	
+	gagaAgGrid.createGrid('gridList', gridOptions);
+	gridOptions.api.hideOverlay();
+	
+	// 최근한주검색
+	$('.btnRecentWeek').trigger('click');
+});
+
+$("#btnSave").on("click", function(e) {
+	var selectedData = gridOptions.api.getSelectedRows();
+
+	if (selectedData.length == 0) {
+		mcxDialog.alert('선택된 행이 없습니다.');
+		return;
+	}
+
+	for(let i = 0 ; i < selectedData.length ; i++) {
+		let rowData = selectedData[i];
+		if(typeof rowData.cancelQty == "undefined") {
+			mcxDialog.alert('선택된 행의 미출고수량을 입력해주세요.');
+			return;
+		}
+	}
+
+	mcxDialog.confirm('선택된 주문을 배송중으로 변경하시겠습니까?', {
+		cancelBtnText	: "취소",
+		sureBtnText		: "확인",
+		sureBtnClick	: function(){
+			var jsonData = JSON.stringify(selectedData);
+			gagajf.ajaxJsonSubmit('/order/seller/delv/started', jsonData, fnEndFunction);
+		}
+	});
+
+	// 엑셀다운로드
+	var fnEndFunction = function(result){
+		mcxDialog.alert("성공적으로 저장되었습니다.");
+		fnSearch();
+	}
+});
+
+//2021.07.13 업체,브랜드 검색방법 변경
+//업체 조회 선택시
+$('#btnSearchSupplyComp').on('click', function() {
+	cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');
+});
+
+//업체 조회 팝업에서 호출
+var fnSetSupplyCompInfo = function(result) {
+	var arrSupplyComp 	= [];
+	var supplyCompText 	= "";
+	var sIndex 			= 0;
+
+	$('#searchForm').find('#supplyCompText').html('');
+	$('#searchForm input[name=supplyCompSearchTxt]').val('');
+
+	result.forEach(function(supplyComp){
+		sIndex++;
+		arrSupplyComp.push(supplyComp.supplyCompCd);
+	});
+
+	// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
+	if (sIndex == 1) {
+		$('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
+	} else {
+		supplyCompText = sIndex + " 개";
+		$('#searchForm').find('#supplyCompText').html(supplyCompText);
+	}
+
+	var jsonData = JSON.stringify(arrSupplyComp);
+	$("#searchForm input[name=supplyCompList]").val(jsonData);
+}
+
+//브랜드 조회 선택시
+$('#btnSearchBrand').on('click', function() {
+	cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
+});
+
+//브랜드 조회 팝업에서 호출
+var fnSetBrandInfo = function(result) {
+	var arrbrandCd 	= [];
+	var brandText 	= "";
+	var bIndex 		= 0;
+
+	$('#searchForm').find('#brandText').html('');
+	$('#searchForm input[name=searchTxt]').val('');
+
+	result.forEach(function(brand){
+		bIndex++;
+		arrbrandCd.push(brand.brandCd);
+	});
+
+	// 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
+	if (bIndex == 1) {
+		$('#searchForm input[name=searchTxt]').val(arrbrandCd[0]);
+	}else{
+		brandText = bIndex + " 개";
+		$('#searchForm').find('#brandText').html(brandText);
+	}
+	var jsonData = JSON.stringify(arrbrandCd);
+	$("#searchForm input[name=brandList]").val(jsonData);
+}
+</script>
+
+</html>
+
+
+
+
+