ChannelTradingForm.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : ChannelTradingForm.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 2021-09-15 수 lmc 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div id="main">
  18. <!-- 메인타이틀 영역 -->
  19. <div class="main-title"></div>
  20. <!-- //메인타이틀 영역 -->
  21. <!-- 메뉴 설명 -->
  22. <div class="infoBox menu-desc"></div>
  23. <!-- //메뉴 설명 -->
  24. <!-- 검색조건 영역 -->
  25. <div class="panelStyle">
  26. <form id="searchForm" name="searchForm" action="#" th:action="@{'/statistics/channel/order/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
  27. <input type="hidden" name="dayGb" value="D"/>
  28. <table class="frmStyle" aria-describedby="검색조건">
  29. <colgroup>
  30. <col style="width:10%;"/>
  31. <col style="width:25%;"/>
  32. <col style="width:10%;"/>
  33. <col/>
  34. </colgroup>
  35. <tr>
  36. <th>기간<i class="required" title="필수" aria-hidden="true"></i></th>
  37. <td colspan="3" id="terms">
  38. </td>
  39. </tr>
  40. <tr>
  41. <th>디바이스</th>
  42. <td colspan="3">
  43. <label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="P" checked="checked"/>PC웹</label>
  44. <label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="M" checked="checked"/>모바일웹</label>
  45. <label class="chkBox checked"><input type="checkbox" name="multiFrontGb" value="A" checked="checked"/>APP</label>
  46. </td>
  47. </tr>
  48. <tr>
  49. <th>물류구분</th>
  50. <td>
  51. <label class="chkBox checked"><input type="checkbox" name="multiDistributionGb" value="SCM" checked="checked"/>입점</label>
  52. <label class="chkBox checked"><input type="checkbox" name="multiDistributionGb" value="WMS" checked="checked"/>위탁</label>
  53. </td>
  54. <th>정상/이월구분</th>
  55. <td>
  56. <label th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" class="chkBox checked"><input type="checkbox" name="multiFormalGb" th:value="${oneData.cd}" th:text="${oneData.cdNm}" checked="checked"/></label>
  57. </td>
  58. </tr>
  59. <tr>
  60. <th>공급업체</th>
  61. <td>
  62. <input type="text" class="w100" name="supplyCompCdSearchTxt" id="supplyCompCdSearchTxt" maxlength="20"/>
  63. <button type="button" class="btn icn" onclick="cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');"><i class="fa fa-search"></i></button>
  64. <span id="supplyCompCdTxt"></span>
  65. <input type="hidden" name="supplyCompCdList"/>
  66. </td>
  67. <th>품목</th>
  68. <td>
  69. <input type="text" class="w100" name="itemkindCdSearchTxt" id="itemkindCdSearchTxt" maxlength="20" />
  70. <button type="button" class="btn icn" onclick="cfnOpenItemkindListPopup('fnSetItemkindInfo', 'M');"><i class="fa fa-search"></i></button>
  71. <span id="itemkindCdTxt"></span>
  72. <input type="hidden" name="itemkindCdList"/>
  73. </td>
  74. </tr>
  75. </table>
  76. <ul class="panelBar">
  77. <li class="center">
  78. <button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
  79. <button type="button" class="btn btn-gray btn-lg" id="btnInit">초기화</button>
  80. </li>
  81. </ul>
  82. </form>
  83. </div>
  84. <!-- 검색조건 영역 -->
  85. <!-- 리스트 영역 -->
  86. <div class="panelStyle">
  87. <ul class="panelBar">
  88. <li>
  89. <button type="button" class="btn btn-default btn-lg" onclick="fnExcelDownLoad();">엑셀다운로드</button>
  90. </li>
  91. </ul>
  92. <div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
  93. </div>
  94. <!-- //리스트 영역 -->
  95. </div>
  96. <style>
  97. .ag-header-group-text{
  98. margin-left: calc(50% - 25px);
  99. }
  100. </style>
  101. <script th:inline="javascript">
  102. /*<![CDATA[*/
  103. let columnDefs = [
  104. { headerName: "채널별", field: "afLinkCd", width: 120, cellClass: 'text-center', hide:true },
  105. { headerName: "채널별", field: "afLinkNm", width: 120, cellClass: 'text-center' },
  106. { headerName: "주문/매출 현황", field: "총매출(A-B)", width: 100, cellClass: 'text-center',
  107. children: [
  108. {headerName: "총매출(A-B)", field: "totAmt", width: 120, cellClass: 'text-right',
  109. cellRenderer: function (params) {
  110. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  111. }
  112. },
  113. {headerName: "매출YOY (%)", field: "yoyRate", width: 120, cellClass: 'text-right',
  114. cellRenderer: function (params) {
  115. return params.value +'%';
  116. }
  117. },
  118. {headerName: "판매수", field: "sellQty", width: 120, cellClass: 'text-right',
  119. cellRenderer: function (params) {
  120. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  121. }
  122. },
  123. {headerName: "매출액(A)", field: "totAmt", width: 120, cellClass: 'text-right',
  124. cellRenderer: function (params) {
  125. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  126. }
  127. },
  128. {headerName: "취/반품갯수", field: "cnclQty", width: 120, cellClass: 'text-right',
  129. cellRenderer: function (params) {
  130. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  131. }
  132. },
  133. {headerName: "취/반품액", field: "cnclAmt", width: 120, cellClass: 'text-right',
  134. cellRenderer: function (params) {
  135. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  136. }
  137. }
  138. ]
  139. },
  140. { headerName: "결제/예상정산 현황", field: "", width: 100, cellClass: 'text-center',
  141. children: [
  142. {headerName: "실결제액(C)", field: "realOrdAmt", width: 120, cellClass: 'text-right',
  143. cellRenderer: function(params) {
  144. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  145. }
  146. },
  147. {headerName: "수수로율(D)", field: "sellFeeRate", width: 120, cellClass: 'text-right',
  148. cellRenderer: function(params) {
  149. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  150. }
  151. },
  152. {headerName: "예상 정산액C*(1-D)", field: "exUsacAmt", width: 150, cellClass: 'text-right',
  153. cellRenderer: function(params) {
  154. return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
  155. }
  156. },
  157. ]
  158. },
  159. ];
  160. let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
  161. // Row Click
  162. gridOptions.onCellClicked = function(event) {
  163. var goodsCd = event.data.goodsCd;
  164. if (event.colDef.field == "goodsCd"){
  165. cfnOpenGoodsDetailPopup('U',goodsCd);
  166. }
  167. if (event.colDef.field == "goodsNm"){
  168. cfnOpenGoodsDetailPopup('U',goodsCd);
  169. }
  170. }
  171. gridOptions.excelStyles = [
  172. {
  173. id: 'text-center',
  174. dataType: 'string',
  175. font: {size : 10, bold: false}
  176. },
  177. {
  178. id: 'text-left',
  179. dataType: 'string',
  180. font: {size : 10, bold: false}
  181. },
  182. {
  183. id: 'text-right',
  184. dataType: 'number',
  185. font: {size : 10, bold: false}
  186. }
  187. ];
  188. var fnExcelDownLoad = function(){
  189. var totalRows = gridOptions.api.getDisplayedRowCount();
  190. if(totalRows==0){
  191. mcxDialog.alert('조회된 내역이 없습니다.');
  192. return;
  193. }
  194. var date = new Date().format("YYYYMMDDHHmmss");
  195. var params = {
  196. fileName : "채널별 주문목록_"+ date,
  197. sheetName: "DATA"
  198. };
  199. gridOptions.api.exportDataAsExcel(params);
  200. }
  201. // 제휴몰 조회 팝업에서 호출
  202. var fnSetExtmallInfo = function(result) {
  203. var arrExtmallId = [];
  204. var extmallIdTxt = "";
  205. var sIndex = 0;
  206. $('#extmallIdTxt').html('');
  207. $('#searchForm input[name=extmallIdSearchTxt]').val('');
  208. result.forEach(function(extmall) {
  209. sIndex++;
  210. arrExtmallId.push(extmall.extmallId);
  211. });
  212. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  213. if (sIndex == 1) {
  214. $('#searchForm input[name=extmallIdSearchTxt]').val(arrExtmallId[0]);
  215. } else {
  216. extmallIdTxt = sIndex + " 개";
  217. $('#extmallIdTxt').html(extmallIdTxt);
  218. }
  219. var jsonData = JSON.stringify(arrExtmallId);
  220. $("#searchForm input[name=extmallIdList]").val(arrExtmallId.join(','));
  221. }
  222. // 업체 조회 팝업에서 호출
  223. var fnSetSupplyCompInfo = function(result) {
  224. var arrSupplyCompCd = [];
  225. var supplyCompCdTxt = "";
  226. var sIndex = 0;
  227. var supplyCompNm = "";
  228. $('#supplyCompCdTxt').html('');
  229. $('#searchForm input[name=supplyCompCdSearchTxt]').val('');
  230. result.forEach(function(supplyComp) {
  231. sIndex++;
  232. arrSupplyCompCd.push(supplyComp.supplyCompCd);
  233. supplyCompNm = supplyComp.supplyCompNm;
  234. });
  235. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  236. if (sIndex == 1) {
  237. $('#searchForm input[name=supplyCompCdSearchTxt]').val(supplyCompNm);
  238. } else {
  239. supplyCompCdTxt = sIndex + " 개";
  240. $('#supplyCompCdTxt').html(supplyCompCdTxt);
  241. }
  242. var jsonData = JSON.stringify(arrSupplyCompCd);
  243. $("#searchForm input[name=supplyCompCdList]").val(arrSupplyCompCd.join(','));
  244. }
  245. // 제휴채널 조회 팝업에서 호출
  246. var fnSetAfLinkInfo = function(result) {
  247. var arrAfLinkCd = [];
  248. var afLinkCdTxt = "";
  249. var sIndex = 0;
  250. var afLinkNm = "";
  251. $('#afLinkCdTxt').html('');
  252. $('#searchForm input[name=afLinkCdSearchTxt]').val('');
  253. result.forEach(function(afLink) {
  254. sIndex++;
  255. arrAfLinkCd.push(afLink.afLinkCd);
  256. afLinkNm = afLink.afLinkNm;
  257. });
  258. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  259. if (sIndex == 1) {
  260. $('#searchForm input[name=afLinkCdSearchTxt]').val(afLinkNm);
  261. } else {
  262. afLinkCdTxt = sIndex + " 개";
  263. $('#afLinkCdTxt').html(afLinkCdTxt);
  264. }
  265. var jsonData = JSON.stringify(arrAfLinkCd);
  266. $("#searchForm input[name=afLinkCdList]").val(arrAfLinkCd.join(","));
  267. }
  268. // 브랜드 조회 팝업에서 호출
  269. var fnSetBrandInfo = function(result) {
  270. var arrBrandCd = [];
  271. var brandCdTxt = "";
  272. var bIndex = 0;
  273. var brandNm = "";
  274. $('#brandCdTxt').html('');
  275. $('#searchForm input[name=brandCdSearchTxt]').val('');
  276. result.forEach(function(brand){
  277. bIndex++;
  278. arrBrandCd.push(brand.brandCd);
  279. brandNm = brand.brandKnm;
  280. });
  281. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  282. if (bIndex == 1) {
  283. $('#searchForm input[name=brandCdSearchTxt]').val(brandNm);
  284. } else {
  285. brandCdTxt = bIndex + " 개";
  286. $('#brandCdTxt').html(brandCdTxt);
  287. }
  288. var jsonData = JSON.stringify(arrBrandCd);
  289. $("#searchForm input[name=brandCdList]").val(arrBrandCd.join(","));
  290. }
  291. // 품목 조회 팝업에서 호출
  292. var fnSetItemkindInfo = function(result) {
  293. var arrItemkindCd = [];
  294. var itemkindCdTxt = "";
  295. var bIndex = 0;
  296. $('#itemkindCdTxt').html('');
  297. $('#searchForm input[name=itemkindCdSearchTxt]').val('');
  298. result.forEach(function(itemkind){
  299. bIndex++;
  300. arrItemkindCd.push(itemkind.itemkindCd);
  301. });
  302. // 조회 값이 하나일 경우 화면에 코드 노출. 그 외는 갯수 처리
  303. if (bIndex == 1) {
  304. $('#searchForm input[name=itemkindCdSearchTxt]').val(arrItemkindCd[0]);
  305. } else {
  306. itemkindCdTxt = bIndex + " 개";
  307. $('#itemkindCdTxt').html(itemkindCdTxt);
  308. }
  309. var jsonData = JSON.stringify(arrItemkindCd);
  310. $("#searchForm input[name=itemkindCdList]").val(arrItemkindCd.join(','));
  311. }
  312. // 검색
  313. $('#btnSearch').on('click', function() {
  314. // 입력 값 체크
  315. if (!gagajf.validation($('#searchForm')))
  316. return false;
  317. gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnCreateTotal);
  318. });
  319. // 합계 생성
  320. let fnCreateTotal = function() {
  321. let totInfo = {};
  322. totInfo.afLinkNm = 'TOTAL';
  323. totInfo.channelAmt = 0;
  324. totInfo.totAmt = 0;
  325. totInfo.sellQty = 0;
  326. totInfo.cnclQty = 0;
  327. totInfo.cnclAmt = 0;
  328. totInfo.realOrdAmt = 0;
  329. totInfo.sellFeeRate = 0;
  330. totInfo.exUsacAmt = 0;
  331. totInfo.yoyTotOrdAmt = 0;
  332. totInfo.yoyRate = 0;
  333. gridOptions.api.forEachNode(function(rowNode, index) {
  334. if (!rowNode.group) {
  335. if( typeof rowNode.data.channelAmt == 'number') { totInfo.channelAmt += rowNode.data.channelAmt ; }
  336. if( typeof rowNode.data.totAmt == 'number') { totInfo.totAmt += rowNode.data.totAmt ; }
  337. if( typeof rowNode.data.sellQty == 'number') { totInfo.sellQty += rowNode.data.sellQty ; }
  338. if( typeof rowNode.data.cnclQty == 'number') { totInfo.cnclQty += rowNode.data.cnclQty ; }
  339. if( typeof rowNode.data.cnclAmt == 'number') { totInfo.cnclAmt += rowNode.data.cnclAmt ; }
  340. if( typeof rowNode.data.realOrdAmt == 'number') { totInfo.realOrdAmt += rowNode.data.realOrdAmt ; }
  341. if( typeof rowNode.data.sellFeeRate == 'number') { totInfo.sellFeeRate += rowNode.data.sellFeeRate ; }
  342. if( typeof rowNode.data.exUsacAmt == 'number') { totInfo.exUsacAmt += rowNode.data.exUsacAmt ; }
  343. if( typeof rowNode.data.yoyTotOrdAmt == 'number') { totInfo.yoyTotOrdAmt += rowNode.data.yoyTotOrdAmt ; }
  344. }
  345. });
  346. /*if(totInfo.totAmt > 0 && totInfo.yoyTotOrdAmt > 0 ){
  347. totInfo.yoyRate = (totInfo.totAmt / totInfo.yoyTotOrdAmt * 100 - 100).toFixed(1);
  348. }else{
  349. totInfo.yoyRate = 0;
  350. }*/
  351. var mod = 1;
  352. if(totInfo.yoyTotOrdAmt > 0) mod = totInfo.yoyTotOrdAmt;
  353. totInfo.yoyRate = Math.floor(totInfo.totAmt / mod * 100 * 100) / 100;
  354. gagaAgGrid.setPinnedRowData(gridOptions, totInfo, 'top');
  355. }
  356. // 초기화 클릭시
  357. $('#btnInit').on('click', function() {
  358. $('#searchForm')[0].reset();
  359. $('#extmallIdTxt').html('');
  360. $('#searchForm input[name=extmallIdList]').val('');
  361. $('#supplyCompCdTxt').html('');
  362. $('#searchForm input[name=supplyCompCdList]').val('');
  363. $('#afLinkCdTxt').html('');
  364. $('#searchForm input[name=afLinkCdList]').val('');
  365. $('#brandCdTxt').html('');
  366. $('#searchForm input[name=brandCdList]').val('');
  367. $('#itemkindCdTxt').html('');
  368. $('#searchForm input[name=itemkindCdList]').val('');
  369. });
  370. // 일자구분 변경 시
  371. var fnSetDayGb = function(dayGb) {
  372. $('#searchForm input[name=dayGb]').val(dayGb);
  373. $('#dayGbD').removeClass('active');
  374. $('#dayGbW').removeClass('active');
  375. $('#dayGbM').removeClass('active');
  376. $('#dayGb' + dayGb).addClass('active');
  377. $('#btnSearch').trigger('click');
  378. }
  379. $(document).ready(function() {
  380. cfnCreateCalendar('#terms', 'startDt', 'endDt', true, '주문', undefined, ['btnToday']);
  381. $('.btnYesterday').trigger('click');
  382. // Create a agGrid
  383. gagaAgGrid.createGrid('gridList', gridOptions);
  384. });
  385. /*]]>*/
  386. </script>
  387. </html>