DeliveryLocForm.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : DeliveryLocForm.html
  7. * @desc : 출고처관리 Page
  8. *============================================================================
  9. * STYLE24
  10. * Copyright(C) 2020 TSIT, All rights reserved.
  11. *============================================================================
  12. * VER DATE AUTHOR DESCRIPTION
  13. * === =========== ========== =============================================
  14. * 1.0 2020.10.14 gagamel 최초 작성
  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. <!-- //메뉴 설명 -->
  26. <!-- 검색조건 영역 -->
  27. <div class="panelStyle">
  28. <form id="searchForm" name="searchForm" action="#" th:action="@{'/business/supply/company/delvloc/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
  29. <table class="frmStyle" aria-describedby="검색조건">
  30. <colgroup>
  31. <col style="width:10%;"/>
  32. <col style="width:15%;"/>
  33. <col style="width:10%;"/>
  34. <col style="width:15%;"/>
  35. <col style="width:10%;"/>
  36. <col style="width:15%;"/>
  37. <col style="width:10%;"/>
  38. <col/>
  39. </colgroup>
  40. <tr>
  41. <th>공급업체</th>
  42. <td>
  43. <!-- <select name="supplyCompCd"> -->
  44. <!-- <option value="">[전체]</option> -->
  45. <!-- <option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option> -->
  46. <!-- </select> -->
  47. <input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20"/>
  48. <button type="button" class="btn icn" onclick="cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');"><i class="fa fa-search"></i></button>
  49. <span id="supplyCompTxt"></span>
  50. <input type="hidden" name="supplyCompList"/>
  51. </td>
  52. <th>출고처유형</th>
  53. <td>
  54. <select name="delvLocClsf">
  55. <option value="">[전체]</option>
  56. <option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  57. </select>
  58. </td>
  59. <th>출고처명</th>
  60. <td>
  61. <input type="text" name="delvLocNm" maxlength="50"/>
  62. </td>
  63. <th>사용여부</th>
  64. <td>
  65. <select name="useYn">
  66. <option value="Y">Yes</option>
  67. <option value="N">No</option>
  68. </select>
  69. </td>
  70. </tr>
  71. </table>
  72. <ul class="panelBar">
  73. <li class="center">
  74. <button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
  75. <button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
  76. </li>
  77. </ul>
  78. </form>
  79. </div>
  80. <!-- 검색조건 영역 -->
  81. <!-- 리스트 영역 -->
  82. <div class="panelStyle">
  83. <!-- 버튼 배치 영역 -->
  84. <ul class="panelBar">
  85. <li class="right">
  86. <button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
  87. </li>
  88. </ul>
  89. <!-- //버튼 배치 영역 -->
  90. <div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
  91. </div>
  92. <!-- //리스트 영역 -->
  93. <!-- 등록/수정 -->
  94. <div class="panelStyle">
  95. <form id="detailForm" name="detailForm" action="#" th:action="@{'/business/supply/company/delvloc/save'}">
  96. <input type="hidden" name="mode" value="N"/>
  97. <table class="frmStyle" aria-describedby="등록/수정 폼">
  98. <colgroup>
  99. <col style="width:10%;"/>
  100. <col style="width:15%;"/>
  101. <col style="width:10%;"/>
  102. <col style="width:15%;"/>
  103. <col style="width:10%;"/>
  104. <col style="width:15%;"/>
  105. <col style="width:10%;"/>
  106. <col style="width:15%;"/>
  107. </colgroup>
  108. <tr>
  109. <th>출고처코드<i class="required" title="필수"></i></th>
  110. <td colspan="7">
  111. <input type="text" class="w100" name="delvLocCd" maxlength="20" placeholder="자동생성" required="required" data-valid-type="alphaNumeric" data-valid-name="출고처코드" readonly="readonly"/>
  112. <span class="infoTxt cBlue">
  113. <i class="fa fa-info-circle" aria-hidden="true"></i>물류창고 : ST0001, <i class="fa fa-info-circle" aria-hidden="true"></i>일반매장/직송매장 : ERP매장코드, <i class="fa fa-info-circle" aria-hidden="true"></i>입점업체 : DL+일련번호4자리로 자동생성
  114. </span>
  115. </td>
  116. </tr>
  117. <tr>
  118. <th>출고처명<i class="required" title="필수"></i></th>
  119. <td>
  120. <input type="text" class="w200" name="delvLocNm" maxlength="100" placeholder="출고처명" required="required" data-valid-name="출고처명"/>
  121. </td>
  122. <th>출고처유형<i class="required" title="필수"></i></th>
  123. <td>
  124. <select name="delvLocClsf" required="required" data-valid-name="출고처유형">
  125. <option value="">[선택]</option>
  126. <option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  127. </select>
  128. </td>
  129. <th>공급업체<i class="required" title="필수"></i></th>
  130. <td colspan="3">
  131. <select name="supplyCompCd" required="required" data-valid-name="공급업체">
  132. <option value="">[선택]</option>
  133. <option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  134. </select>
  135. </td>
  136. </tr>
  137. <tr>
  138. <th>재고적용율</th>
  139. <td colspan="3">
  140. <input type="text" class="w100 aR" name="stockApplRate" maxlength="5" data-valid-type="real"/>%
  141. <span class="cBlue">* WMS부터 수신된 재고의 판매가용재고 적용율(%). 물류창고와 직송매장에 한함</span>
  142. </td>
  143. <th>출고수수료율</th>
  144. <td colspan="3">
  145. <input type="text" class="w100 aR" name="delvFeeRate" maxlength="5" data-valid-type="real"/>%
  146. <span class="cBlue">* 직송매장 출고 시 적용할 출고수수료율(%)</span>
  147. </td>
  148. </tr>
  149. <tr>
  150. <th>출고지정순서</th>
  151. <td colspan="3">
  152. <input type="text" class="w100 aR" name="delvAssignOrd" maxlength="3" data-valid-type="integer"/>
  153. <span class="cBlue">* 물류창고와 직송매장에 대해 출고지정되는 순서</span>
  154. </td>
  155. <!-- <th>출고지정등급</th> -->
  156. <!-- <td> -->
  157. <!-- <select name="delvAssignGrade"> -->
  158. <!-- <option value="">[선택]</option> -->
  159. <!-- <option value="A">[A] A등급</option> -->
  160. <!-- <option value="B">[B] B등급</option> -->
  161. <!-- <option value="C">[C] C등급</option> -->
  162. <!-- <option value="Z">[Z] 출고지정제외</option> -->
  163. <!-- </select> -->
  164. <!-- </td> -->
  165. <th>사용여부<i class="required" title="필수"></i></th>
  166. <td colspan="3">
  167. <label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes<span></span></label>
  168. <label class="rdoBtn"><input type="radio" name="useYn" value="N">No<span></span></label>
  169. </td>
  170. </tr>
  171. <tr>
  172. <th>출고처주소<i class="required" title="필수"></i></th>
  173. <td colspan="7">
  174. <input type="text" class="w100" name="delvLocZipcode" data-valid-name="출고처 우편번호" readonly="readonly"/>
  175. <button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
  176. <input type="text" class="w300" name="delvLocBaseAddr" required="required" data-valid-name="출고처 기본주소" readonly="readonly"/>
  177. -
  178. <input type="text" class="w300" name="delvLocDtlAddr" maxlength="100" required="required" data-valid-name="출고처 상세주소"/>
  179. </td>
  180. </tr>
  181. <tr>
  182. <th>반품처명</th>
  183. <td>
  184. <input type="text" class="w200" name="rtnLocNm" maxlength="100" placeholder="반품처명"/>
  185. </td>
  186. <th>반품처주소<i class="required" title="필수"></i></th>
  187. <td colspan="5">
  188. <input type="text" class="w100" name="rtnLocZipcode" data-valid-name="반품처 우편번호" readonly="readonly"/>
  189. <button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('rtnLoc');">우편번호찾기</button>
  190. <input type="text" class="w300" name="rtnLocBaseAddr" required="required" data-valid-name="반품처 기본주소" readonly="readonly"/>
  191. -
  192. <input type="text" class="w300" name="rtnLocDtlAddr" maxlength="100" required="required" data-valid-name="반품처 상세주소"/>
  193. </td>
  194. </tr>
  195. <tr>
  196. <th>택배사<i class="required" title="필수"></i></th>
  197. <td colspan="7">
  198. <select name="shipCompCd" required="required" data-valid-name="택배사">
  199. <option value="">[선택]</option>
  200. <option th:if="${shipCompanyList}" th:each="oneData, status : ${shipCompanyList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
  201. </select>
  202. </td>
  203. </tr>
  204. </table>
  205. </form>
  206. <!-- 버튼 배치 영역 -->
  207. <ul class="panelBar">
  208. <li class="right">
  209. <button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
  210. <button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
  211. </li>
  212. </ul>
  213. <!-- //버튼 배치 영역 -->
  214. </div>
  215. <!-- 등록/수정 -->
  216. </div>
  217. <script th:inline="javascript">
  218. /*<![CDATA[*/
  219. let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
  220. let delvLocClsfList = gagajf.convertToArray([[${delvLocClsfList}]]);
  221. let delvGradeList = { "A":"A등급", "B":"B등급", "C":"C등급", "Z":"출고지정제외" };
  222. let invoicePrintTypeList = gagajf.convertToArray([[${invoicePrintTypeList}]]);
  223. let columnDefs = [
  224. { headerName: "출고처코드", field: "delvLocCd", width: 100, cellClass: 'text-center' },
  225. {
  226. headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center',
  227. cellRenderer: function(params) {
  228. return '<a href="javascript:void(0);">' + params.value + '</a>';
  229. }
  230. },
  231. {
  232. headerName: "출고처유형", field: "delvLocClsf", width: 150, cellClass: 'text-center',
  233. valueGetter: function (params) {
  234. return gagaAgGrid.lookupValue(delvLocClsfList, params.data.delvLocClsf);
  235. }
  236. },
  237. // {
  238. // headerName: "매장POS", field: "btnPos", width: 120, cellClass: 'text-center',
  239. // cellRenderer: function(params) {
  240. // var btn = '';
  241. // if (params.data.delvLocClsf === 'G024_21') {
  242. // btn ='<button type="button" class="btn btn-success btn-sm" onclick="cfnPopPos(\'' + params.data.delvLocCd + '\');\">매장[POS]</button>';
  243. // }
  244. // return btn;
  245. // }
  246. // },
  247. {
  248. headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
  249. valueGetter: function (params) {
  250. return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
  251. }
  252. },
  253. { headerName: "재고적용율(%)", field: "stockApplRate", width: 120, cellClass: 'text-center' },
  254. { headerName: "출고수수료율(%)", field: "delvFeeRate", width:120, cellClass: 'text-center' },
  255. { headerName: "출고지정순서", field: "delvAssignOrd", width: 120, cellClass: 'text-center' },
  256. // {
  257. // headerName: "출고지정등급", field: "delvAssignGrade", width: 150, cellClass: 'text-center',
  258. // cellRenderer: function (params) {
  259. // return gagaAgGrid.lookupValue(delvGradeList, params.value);
  260. // }
  261. // },
  262. // {
  263. // headerName: "송장출력형태", field: "invoicePrintType", width:150 , cellClass: 'text-center',
  264. // valueGetter: function (params) {
  265. // return gagaAgGrid.lookupValue(invoicePrintTypeList, params.data.invoicePrintType);
  266. // }
  267. // },
  268. { headerName: "출고처우편번호", field: "delvLocZipcode", width: 150, cellClass: 'text-center', hide: true },
  269. { headerName: "출고처기본주소", field: "delvLocBaseAddr", width: 300, hide: true },
  270. { headerName: "출고처상세주소", field: "delvLocDtlAddr", width: 300, hide: true },
  271. { headerName: "반품처명", field: "rtnLocNm", width: 100, cellClass: 'text-center', hide: true },
  272. { headerName: "반품처우편번호", field: "rtnLocZipcode", width: 150, cellClass: 'text-center', hide: true },
  273. { headerName: "반품처기본주소", field: "rtnLocBaseAddr", width: 300, hide: true },
  274. { headerName: "반품처상세주소", field: "rtnLocDtlAddr", width: 300, hide: true },
  275. {
  276. headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
  277. valueGetter: function (params) { return params.data.useYn == 'Y' ? 'Yes' : 'No'; }
  278. }
  279. ];
  280. let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
  281. // Cell click
  282. gridOptions.onCellClicked = function(event) {
  283. if (event.colDef.field != 'delvLocNm')
  284. return;
  285. $('#detailForm input[name=mode]').val('U');
  286. $('#detailForm input[name=delvLocCd]').attr('readonly', true);
  287. $('#detailForm input[name=delvLocCd]').val(event.data.delvLocCd);
  288. $('#detailForm input[name=delvLocNm]').val(event.data.delvLocNm);
  289. $('#detailForm select[name=delvLocClsf]').val(event.data.delvLocClsf);
  290. $('#detailForm select[name=supplyCompCd]').val(event.data.supplyCompCd);
  291. $('#detailForm input[name=delvAssignOrd]').val(event.data.delvAssignOrd);
  292. $('#detailForm select[name=delvAssignGrade]').val(event.data.delvAssignGrade);
  293. $('#detailForm input[name=stockApplRate]').val(Number(event.data.stockApplRate).addComma());
  294. $('#detailForm input[name=delvFeeRate]').val(Number(event.data.delvFeeRate).addComma());
  295. // $('#detailForm select[name=invoicePrintType]').val(event.data.invoicePrintType);
  296. $('#detailForm input[name=delvLocZipcode]').val(event.data.delvLocZipcode);
  297. $('#detailForm input[name=delvLocBaseAddr]').val(event.data.delvLocBaseAddr);
  298. $('#detailForm input[name=delvLocDtlAddr]').val(event.data.delvLocDtlAddr);
  299. $('#detailForm input[name=rtnLocZipcode]').val(event.data.rtnLocZipcode);
  300. $('#detailForm input[name=rtnLocBaseAddr]').val(event.data.rtnLocBaseAddr);
  301. $('#detailForm input[name=rtnLocDtlAddr]').val(event.data.rtnLocDtlAddr);
  302. $('#detailForm input[name=rtnLocNm]').val(event.data.rtnLocNm);
  303. $('#detailForm select[name=shipCompCd]').val(event.data.shipCompCd);
  304. if (event.data.useYn == 'Y') {
  305. $('#detailForm input:radio[name=useYn]').eq(0).attr('checked', true);
  306. } else {
  307. $('#detailForm input:radio[name=useYn]').eq(1).attr('checked', true);
  308. }
  309. }
  310. // 업체 조회 팝업에서 호출
  311. var fnSetSupplyCompInfo = function(result) {
  312. var arrSupplyComp = [];
  313. var supplyCompTxt = "";
  314. var sIndex = 0;
  315. $('#supplyCompTxt').html('');
  316. $('#searchForm input[name=supplyCompSearchTxt]').val('');
  317. result.forEach(function(supplyComp) {
  318. sIndex++;
  319. arrSupplyComp.push(supplyComp.supplyCompCd);
  320. });
  321. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  322. if (sIndex == 1) {
  323. $('#searchForm input[name=supplyCompSearchTxt]').val(arrSupplyComp[0]);
  324. } else {
  325. supplyCompTxt = sIndex + " 개";
  326. $('#supplyCompTxt').html(supplyCompTxt);
  327. }
  328. var jsonData = JSON.stringify(arrSupplyComp);
  329. $("#searchForm input[name=supplyCompList]").val(jsonData);
  330. }
  331. // 출고처유형 셀렉트박스 변경 시 이벤트
  332. $('#detailForm select[name=delvLocClsf]').on('change', function() {
  333. let val = $(this).val();
  334. let mode = $('#detailForm input[name=mode]').val();
  335. if (val == 'G024_10') { // 물류창고
  336. if (mode == 'N') {
  337. $('#detailForm input[name=delvLocCd]').attr('readonly', true); // 직접입력 불가
  338. $('#detailForm input[name=delvLocCd]').val('ST0001');
  339. }
  340. $('#detailForm input[name=stockApplRate]').val(100);
  341. } else if (val == 'G024_20' || val == 'G024_21') { // 일반매장, 직송매장
  342. if (mode == 'N') {
  343. $('#detailForm input[name=delvLocCd]').attr('readonly', false); // 직접입력 가능
  344. $('#detailForm input[name=delvLocCd]').val('');
  345. $('#detailForm input[name=delvLocCd]').attr('placeholder', 'ERP매장코드');
  346. }
  347. $('#detailForm input[name=stockApplRate]').val(100);
  348. } else { // 입점업체
  349. if (mode == 'N') {
  350. $('#detailForm input[name=delvLocCd]').attr('readonly', true); // 직접입력 불가
  351. $('#detailForm input[name=delvLocCd]').val('AUTO');
  352. $('#detailForm input[name=delvLocCd]').attr('placeholder', '자동생성');
  353. }
  354. $('#detailForm input[name=stockApplRate]').val('');
  355. }
  356. });
  357. // 검색
  358. $('#btnSearch').on('click', function() {
  359. gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
  360. });
  361. // 신규버튼
  362. $('#btnNew').on('click', function() {
  363. $("#detailForm")[0].reset();
  364. $('#detailForm input[name=delvLocCd]').attr('readonly', true);
  365. $('#detailForm input[name=delvLocNm]').focus();
  366. });
  367. // 저장
  368. $("#btnSave").on("click", function() {
  369. // 필수값 체크
  370. if (!gagajf.validation('#detailForm'))
  371. return false;
  372. mcxDialog.confirm("저장하시겠습니까?", {
  373. cancelBtnText: "취소",
  374. sureBtnText: "확인",
  375. sureBtnClick: function() {
  376. gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
  377. $('#btnNew').trigger('click');
  378. $('#btnSearch').trigger('click');
  379. });
  380. }
  381. });
  382. });
  383. // 엑셀다운로드
  384. $('#btnExcel').on('click', function() {
  385. gagaAgGrid.exportToExcel('출고처 목록', gridOptions);
  386. });
  387. /**
  388. * DAUM을 이용한 우편번호 팝업 레이어
  389. * @param callbackPosition - 우편번호 정보를 설정할 위치
  390. */
  391. var fnOpenDaumAddr = function(callbackPosition) {
  392. let daumZip = new daum.Postcode({
  393. oncomplete: function(data) {
  394. // 우편번호와 주소 정보를 해당 필드에 넣는다.
  395. if (callbackPosition == 'delvLoc') {
  396. $('#detailForm input[name=delvLocZipcode]').val(data.zonecode);
  397. $('#detailForm input[name=delvLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
  398. $('#detailForm input[name=delvLocDtlAddr]').focus();
  399. } else if (callbackPosition == 'rtnLoc') {
  400. $('#detailForm input[name=rtnLocZipcode]').val(data.zonecode);
  401. $('#detailForm input[name=rtnLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
  402. $('#detailForm input[name=rtnLocDtlAddr]').focus();
  403. }
  404. cfnCloseDaumAddr();
  405. },
  406. width: '100%'
  407. });
  408. cfnOpenDaumAddr(daumZip);
  409. }
  410. $(document).ready(function() {
  411. // Create a agGrid
  412. gagaAgGrid.createGrid('gridList', gridOptions);
  413. });
  414. /*]]>*/
  415. </script>
  416. </html>