GoodsReinboundInformForm.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : GoodsReinboundInformForm.html
  7. * @desc : 재입고알림관리
  8. *============================================================================
  9. * STYLE24
  10. * Copyright(C) 2020 TSIT, All rights reserved.
  11. *============================================================================
  12. * VER DATE AUTHOR DESCRIPTION
  13. * === =========== ========== =============================================
  14. * 1.0 2020.11.18 eskim 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div id="main">
  18. <!-- 메인타이틀 영역 -->
  19. <div class="main-title">
  20. </div>
  21. <!-- //메인타이틀 영역 -->
  22. <!-- 메뉴 설명 -->
  23. <div class="infoBox menu-desc">
  24. </div>
  25. <form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/reinbound/inform/list'}">
  26. <input type="hidden" id="searchGb" name="searchGb" />
  27. <!-- 패널 영역1 -->
  28. <div class="panelStyle" >
  29. <div class="panelTitle">
  30. <h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
  31. </div>
  32. <div class="panelContent">
  33. <table class="frmStyle">
  34. <colgroup>
  35. <col width="10%"/>
  36. <col width="30%"/>
  37. <col width="10%"/>
  38. <col width="20%"/>
  39. <col width="10%"/>
  40. <col/>
  41. </colgroup>
  42. <tr>
  43. <th>업체/브랜드</th>
  44. <td>
  45. <select name="supplyCompCd" id="supplyCompCd">
  46. <option value="" th:if="${sessionInfo.roleCd} != 'G001_B000'">[전체]</option>
  47. <option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  48. </select>
  49. <select name="brandCd" id="brandCd">
  50. <option value="">[전체]</option>
  51. </select>
  52. </td>
  53. <th>키워드</th>
  54. <td>
  55. <select name="search" id="search">
  56. <option value="searchGoodsCd">상품코드</option>
  57. <option value="searchGoodsNm">상품명</option>
  58. <!-- <option value="searchColorNm">색상명</option>
  59. <option value="searchSizeNm">사이즈명명</option>
  60. --> </select>
  61. <input type="text" class="w50p" name="condition" id="condition" maxlength="50"/>
  62. </td>
  63. <th>발송여부</th>
  64. <td>
  65. <select id="alarmYn" name="alarmYn">
  66. <option value="">[전체]</option>
  67. <option value="N">미발송</option>
  68. <option value="Y">발송완료</option>
  69. </select>
  70. </td>
  71. </tr>
  72. <tr>
  73. <th>카테고리</th>
  74. <td colspan="5">
  75. <input name="siteCd" id="siteCd" type="hidden" value="G000_10"/>
  76. <input name="selLvl" id="selLvl" type="hidden"/>
  77. <input name="cateNo" id="cateNo" type="hidden"/>
  78. <input name="cateType" id="cateType" type="hidden"/>
  79. <select name="cateGb" id="selCate1" onchange="fnChangeSelect($(this).val(), 2);">
  80. <option value="">[카테고리구분]</option>
  81. <option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  82. </select>
  83. <select id="selCate2" name="cate1No" onchange="fnChangeSelect($(this).val(), 3);">
  84. <option value="">[카테고리1]</option>
  85. </select>
  86. <select id="selCate3" name="cate2No" onchange="fnChangeSelect($(this).val(), 4);">
  87. <option value="">[카테고리2]</option>
  88. </select>
  89. <select id="selCate4" name="cate3No" onchange="fnChangeSelect($(this).val(), 5);">
  90. <option value="">[카테고리3]</option>
  91. </select>
  92. <select id="selCate5" name="cate4No" onchange="fnChangeSelect($(this).val(), 6);">
  93. <option value="">[카테고리4]</option>
  94. </select>
  95. <select id="selCate6" name="cate5No" onchange="fnChangeSelect($(this).val(), 7);">
  96. <option value="">[카테고리5]</option>
  97. </select>
  98. </td>
  99. </tr>
  100. <tr>
  101. <th>일자</th>
  102. <td colspan="5" id="sellTerms"></td>
  103. </tr>
  104. </table>
  105. <ul class="panelBar">
  106. <li class="center">
  107. <button type="button" class="btn btn-gray btn-lg" id="btnInit" >초기화</button>
  108. <button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
  109. </li>
  110. </ul>
  111. </div>
  112. <!-- //검색조건 영역 -->
  113. </div>
  114. <!-- 패널 영역1 -->
  115. <div class="panelStyle">
  116. <!-- 상단버튼 영역 -->
  117. <ul class="panelBar">
  118. <li class="right">
  119. <button type="button" class="btn btn-primary btn-lg" id="reinboundInformSend">재입고알림 발송</button>
  120. 검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp;
  121. 쪽번호 <span id="pgNo">0</span>/ <strong id="endPgNo">0</strong>&nbsp;&nbsp;
  122. <select id="pageSize" name="pageSize">
  123. <option value="50" selected="selected">50개씩 보기</option>
  124. <option value="100">100개씩 보기</option>
  125. <option value="500">500개씩 보기</option>
  126. <option value="1000">1000개씩 보기</option>
  127. </select>
  128. <input type="hidden" name="pageNo" id="pageNo" value ="1"/>
  129. </li>
  130. </ul>
  131. <!-- //상단버튼 영역 -->
  132. <div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham lh60"></div>
  133. <ul class="panelBar">
  134. <li class="center">
  135. <div class="tablePaging" id="goodsListPagination"></div>
  136. </li>
  137. </ul>
  138. <!-- 검색결과 영역 -->
  139. </div>
  140. </form>
  141. <!-- //패널 영역2 -->
  142. </div>
  143. <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
  144. <script th:inline="javascript">
  145. /*<![CDATA[*/
  146. //var toDateStr = new Date().format("YYYYMMDD");
  147. var date = new Date();
  148. var beforeDay = date.before(0, 0, 15).format("YYYYMMDD");
  149. var sessRoleCd = [[${sessionInfo.roleCd}]];
  150. var goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
  151. var uploadGoodsUrl = [[${@environment.getProperty('upload.goods.view')}]];
  152. var columnDefs = [
  153. {width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, filter: false
  154. , checkboxSelection: function (params) {
  155. return (beforeDay > params.data.reqDt ) ? false : true;
  156. }
  157. },
  158. {headerName: 'No', width: 60, cellClass: 'text-center',
  159. valueGetter: function(params) { return cfnGridNumner('searchForm',params.node.rowIndex, 'A');}
  160. },
  161. {headerName: "브랜드명", field: "brandEnm", width: 130, cellClass: 'text-center'},
  162. {headerName: "이미지", field: "sysImgNm", width: 100, height: 60, cellClass: 'text-center'
  163. ,cellRenderer: function(params) {
  164. return '<img width="60" src="'+ _goodsUrl+ "/" + params.value + '" alt="" onerror="this.src=\'/image/no.gif\';"/>';
  165. }
  166. },
  167. {headerName: "상품코드", field: "goodsCd", width: 130, cellClass: 'text-center'},
  168. {headerName: "상품명", field: "goodsNm", width: 200, cellClass: 'text-left'
  169. ,cellRenderer: function(params) {
  170. return '<a href="javascript:void(0);">' + params.value + '</a>';
  171. }
  172. },
  173. {headerName: "상품상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
  174. cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
  175. valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
  176. valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
  177. },
  178. {headerName: "색상명", field: "optCd1", width: 100, cellClass: 'text-center'},
  179. {headerName: "사이즈", field: "optCd2" , width: 100, cellClass: 'text-center'},
  180. {headerName: "가용재고", field: "currStockQty" , width: 80, cellClass: 'text-center'},
  181. {headerName: "고객ID", field: "custId" , width: 100, cellClass: 'text-center'},
  182. {headerName: "고객명", field: "custNm" , width: 100, cellClass: 'text-center'},
  183. {headerName: "알림요청일시", field: "reqDt", width: 120, cellClass: 'text-center',
  184. cellRenderer: function(params) {
  185. return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDD").format("YYYY-MM-DD") : '';
  186. }
  187. },
  188. {headerName: "알림 발송일시", field: "informDt", width: 120, cellClass: 'text-center',
  189. cellRenderer: function(params) {
  190. return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD") : '';
  191. }
  192. },
  193. {headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
  194. cellRenderer: function(params) {
  195. return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
  196. }
  197. },
  198. {headerName: "등록자", field: "regNm" , width: 100, cellClass: 'text-center'},
  199. {headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
  200. cellRenderer: function(params) {
  201. return !gagajf.isNull(params.value) ? params.value.toDate("YYYYMMDDHHmmss").format("YYYY-MM-DD HH:mm:ss") : '';
  202. }
  203. },
  204. {headerName: "수정자", field: "updNm" , width: 100, cellClass: 'text-center'}
  205. ];
  206. // Get GridOptions
  207. var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
  208. // 중복 선택 가능
  209. gridOptions.rowSelection = 'multiple';
  210. gridOptions.suppressRowClickSelection = true;
  211. gridOptions.rowHeight = 60; //이미지가 있을경우 높이 지정해야함.
  212. // Row Click
  213. gridOptions.onCellClicked = function(event) {
  214. var goodsCd = event.data.goodsCd;
  215. if (event.colDef.field == "goodsNm"){
  216. cfnOpenGoodsDetailPopup('U',goodsCd);
  217. }else if (event.colDef.field == "goodsCd"){
  218. }
  219. }
  220. // 초기화 클릭시
  221. $('#btnInit').on('click', function() {
  222. fnInit();
  223. });
  224. var fnInit = function(){
  225. $('#searchForm')[0].reset();
  226. }
  227. // 조회클릭시
  228. $('#btnSearch').on('click', function() {
  229. $("#searchForm input[name=pageNo]").val('1');
  230. fnReinboundInformListSearch();
  231. });
  232. // 조회
  233. var fnReinboundInformListSearch = function(gbn) {
  234. $("#searchForm input[name=searchGb]").val("BASIC");
  235. if(!fnConditionCheck()) return;
  236. gagaPaging.init('searchForm', fnSearchCallBack, 'goodsListPagination', $('#searchForm').find('#pageSize').val());
  237. gagaPaging.load($("#searchForm input[name=pageNo]").val());
  238. }
  239. //검색 조건 확인
  240. var fnConditionCheck = function(){
  241. var formId = '#searchForm';
  242. var form = document.searchForm;
  243. if($("#searchForm input[name=searchGb]").val() == "EXCEL") return true;
  244. var searchFlag = false;
  245. var cnt = 0;
  246. for (i = 0; i < form.elements.length; i++ ) {
  247. var el = form.elements[i];
  248. if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize" && el.name != "termGb")) {
  249. if (!(el.value == null || el.value == "")) {
  250. cnt++;
  251. }
  252. }
  253. }
  254. if(cnt > 0) searchFlag = true;
  255. if(searchFlag == false){
  256. gagaAlert.alert("검색조건을 입력하세요.", function(){
  257. });
  258. return false;
  259. }
  260. var fromDate = $('#searchForm input[name=stDate]').val();
  261. var toDate = $('#searchForm input[name=edDate]').val();
  262. if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
  263. if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
  264. gagaAlert.alert("일자 조회시 시작일자와 종료일자를 입력하세요.", function() {
  265. $('#searchForm input[name=stDate]').focus();
  266. });
  267. return false;
  268. }
  269. if (fromDate > toDate) {
  270. gagaAlert.alert("시작일자는 종료일자 보다 클 수 없습니다.", function() {
  271. $('#searchForm input[name=stDate]').focus();
  272. });
  273. return false;
  274. }
  275. }
  276. return true;
  277. }
  278. var fnChangeSelect = function(val, selLvl){
  279. $("#cateNo").val('');
  280. /* $('#cate1No').val('');
  281. $('#cate2No').val('');
  282. $('#cate3No').val('');
  283. $('#cate4No').val('');
  284. $('#cate5No').val(''); */
  285. if(val==''){
  286. if(selLvl>1){
  287. selLvl = selLvl - 1;
  288. if(selLvl>2){
  289. $("#cateNo").val($("#selCate"+(selLvl-1)).val());
  290. }
  291. }else{
  292. selLvl = '';
  293. }
  294. }else{
  295. if(selLvl>2){
  296. $("#cateNo").val(val);
  297. }
  298. }
  299. $("#searchForm input[name=selLvl]").val(selLvl);
  300. $("#searchForm input[name=searchGb]").val("BASIC");
  301. gagajf.ajaxFormSubmit('/display/category/list', "#searchForm", fnChangeCategory);
  302. }
  303. var fnChangeCategory = function(data){
  304. var selLvl = $("#searchForm input[name=selLvl]").val();
  305. var html = '<option value="">[선택]</option>';
  306. for(var i=1; i<7; i++){
  307. if(i>selLvl){
  308. $("#selCate"+i).html(html);
  309. }
  310. }
  311. for(var i=0; i<data.length; i++){
  312. var cd = '';
  313. var nm = '';
  314. if(data[i].useYn=='Y'){
  315. if(selLvl=='1'){
  316. cd = data[i].cateGb;
  317. nm = gagaAgGrid.lookupValue(cateGbList, cd);
  318. }else{
  319. cd = data[i].cateNo;
  320. nm = data[i].cateNm;
  321. $("#cateType").val(data[i].cateType);
  322. }
  323. html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
  324. }
  325. }
  326. $("#selCate"+selLvl).html(html);
  327. }
  328. var fnSearchCallBack = function(result){
  329. $('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
  330. $('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
  331. $('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
  332. $('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
  333. gridOptions.api.setRowData(result.reinboundInformList);
  334. gagaPaging.createPagination(result.pageing.pageable);
  335. }
  336. //페이징
  337. $('#searchForm select[name=pageSize]').on('change', function() {
  338. $("#searchForm input[name=pageNo]").val('1');
  339. fnReinboundInformListSearch($("#searchForm input[name=searchGb]").val());
  340. });
  341. //업체변경시
  342. $('#searchForm select[name=supplyCompCd]').on('change', function() {
  343. var actionUrl = '/renderer/supplyCompany/brand/list/' + $(this).val();
  344. if(sessRoleCd == "G001_B000"){
  345. actionUrl = '/renderer/brand/AuthBrandlist';
  346. }
  347. $("#searchForm select[name=brandCd] option:gt(0)").remove();
  348. cfnCreateCombo(actionUrl, $('#searchForm select[name=brandCd]'), "[전체]", "");
  349. });
  350. // 재입고알림 발송
  351. $('#reinboundInformSend').click(function(e) {
  352. var selectedData = gridOptions.api.getSelectedRows();
  353. if (selectedData.length == 0) {
  354. mcxDialog.alert('선택된 행이 없습니다.');
  355. return false;
  356. }
  357. var arrRinbdInfoSq = [];
  358. var chkFlag = false;
  359. $.each(selectedData, function(idx, item) {
  360. if (!gagajf.isNull(item.informDt)){
  361. chkFlag = true;
  362. mcxDialog.alert(item.custId+'('+ item.custNm+ ') 의 ' + item.goodsCd +"상품은 이미 재입고알림 발송되었습니다.");
  363. return false;
  364. }
  365. if (item.currStockQty < 1 || item.soldoutYn == 'Y'){
  366. chkFlag = true;
  367. mcxDialog.alert(item.goodsCd +"상품( 사이즈 : " + item.sizeNm + " )은 가용재고가 없습니다.");
  368. return false;
  369. }
  370. if (beforeDay > item.reqDt){
  371. chkFlag = true;
  372. mcxDialog.alert("요청일이 15일경과한 재입고알림은 발송할 수 없습니다.");
  373. return false;
  374. }
  375. arrRinbdInfoSq.push(item.rinbdInfoSq);
  376. });
  377. if (chkFlag){
  378. return;
  379. }
  380. mcxDialog.confirm('재입고알림을 발송하시겠습니까?', {
  381. cancelBtnText: "취소",
  382. sureBtnText: "확인",
  383. sureBtnClick: function(){
  384. var data = {arrRinbdInfoSq : arrRinbdInfoSq
  385. };
  386. var jsonData = JSON.stringify(data);
  387. gagajf.ajaxJsonSubmit('/goods/reinbound/inform/send', jsonData, fnSendInstockCallBack);
  388. }
  389. });
  390. });
  391. // 재입고알림 발송 콜백
  392. var fnSendInstockCallBack = function(){
  393. fnReinboundInformListSearch();
  394. }
  395. $(document).ready(function() {
  396. var chkBeforSkipFlag = '&nbsp;&nbsp;<label class="chkBox"><input type="checkbox" name="beforSkipFlag" value="Y">경과데이터 제외</label>';
  397. cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '예약일', 'X');
  398. var selectCode = '<select name="dateGbn" id="dateGbn">';
  399. selectCode += '<option value="reqDt" seledted>요청일</option>';
  400. selectCode += '<option value="alarmDt">발송일</option>';
  401. selectCode += '</select>';
  402. $("#searchForm").find('#sellTerms').prepend(selectCode);
  403. $("#searchForm").find('#sellTerms').append(chkBeforSkipFlag);
  404. // Create a agGrid
  405. gagaAgGrid.createGrid('gridList', gridOptions);
  406. });
  407. /*]]>*/
  408. </script>
  409. </html>