traf-hs.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  1. let _list;
  2. let _totList;
  3. let ixrNm;
  4. let istlLctn;
  5. let unit;
  6. let strtDt;
  7. let endDt;
  8. let searchBtn;
  9. let closeBtn;
  10. let _multiChart;
  11. let _pieChart;
  12. const _pageName = '교통량 통계';
  13. const dateTime = 'yyyy-MM-dd HH:mm';
  14. const dateHour = 'yyyy-MM-dd HH시';
  15. const time = 'HH:mm';
  16. const hour = 'HH시';
  17. const date = 'yyyy-MM-dd';
  18. const month = 'yyyy-MM';
  19. let strtDtVal = new Date();
  20. let endDtVal = new Date();
  21. strtDtVal.setHours("00");
  22. strtDtVal.setMinutes("00");
  23. strtDtVal.setSeconds("00");
  24. endDtVal.setHours("23");
  25. endDtVal.setMinutes("59");
  26. endDtVal.setSeconds("59");
  27. let searchStart = firstSettingTime;
  28. let searchEnd = endSettingTime;
  29. const drctMap = new Map();
  30. const categories = ['-', 'A', 'B', 'C', 'D', 'E', 'F', 'FF', 'FFF'];
  31. const pieSeries = [
  32. {
  33. name :'교통량 통계 조회 (합계)',
  34. data : [
  35. {
  36. id : 'go_tfvl',
  37. name : '직진',
  38. color : 'coral',
  39. y : 0,
  40. },
  41. {
  42. id : 'left_tfvl',
  43. name : '좌회전',
  44. color : 'rgb(124, 181, 236)',
  45. y : 0,
  46. },
  47. {
  48. id : 'rght_tfvl',
  49. name : '우회전',
  50. color : 'rgb(144, 237, 125)',
  51. y : 0,
  52. }
  53. ]
  54. },
  55. ]
  56. const multiSeries = [
  57. {
  58. name: '직진',
  59. type : 'column',
  60. data: [],
  61. color : 'coral',
  62. },
  63. {
  64. name: '좌회전',
  65. type : 'column',
  66. data: [],
  67. color : 'rgb(124, 181, 236)',
  68. },
  69. {
  70. name: '우회전',
  71. type : 'column',
  72. data: [],
  73. color : 'rgb(144, 237, 125)',
  74. },
  75. {
  76. name: '서비스수준 ( LOS )',
  77. type : 'line',
  78. yAxis: 1,
  79. data: [],
  80. color : 'red',
  81. }
  82. ]
  83. const lookupData = [
  84. {
  85. code : 0,
  86. desc : '-',
  87. },
  88. {
  89. code : 1,
  90. desc : 'A',
  91. },
  92. {
  93. code : 2,
  94. desc : 'B',
  95. },
  96. {
  97. code : 3,
  98. desc : 'C',
  99. },
  100. {
  101. code : 4,
  102. desc : 'D',
  103. },
  104. {
  105. code : 5,
  106. desc : 'E',
  107. },
  108. {
  109. code : 6,
  110. desc : 'F',
  111. },
  112. {
  113. code : 7,
  114. desc : 'FF',
  115. },
  116. {
  117. code : 8,
  118. desc : 'FFF',
  119. }
  120. ]
  121. const unitData = [
  122. {
  123. unit : '15m',
  124. desc : '15분 통계',
  125. },
  126. // {
  127. // unit : '30m',
  128. // desc : '30분 통계',
  129. // },
  130. {
  131. unit : 'hh',
  132. desc : '시간 통계(1시간)',
  133. },
  134. {
  135. unit : 'dd',
  136. desc : '일 통계(1일)',
  137. },
  138. {
  139. unit : 'mn',
  140. desc : '월 통계(1개월)',
  141. },
  142. ];
  143. $(()=>{
  144. //교차로교통량 통계 테이블
  145. let listColumns = [
  146. {
  147. dataField : "ixr_nm",
  148. caption : '교차로명',
  149. alignment : 'center',
  150. },
  151. {
  152. dataField : "stat_dt",
  153. caption : '수집일시',
  154. alignment : 'center',
  155. sortIndex : 1,
  156. sortOrder : 'asc',
  157. },
  158. {
  159. caption : '교통량(대)',
  160. alignment : "center",
  161. columns : [
  162. {
  163. dataField : "go_tfvl",
  164. caption : '직진',
  165. alignment : 'center',
  166. format : '#,##0',
  167. width : 80,
  168. },
  169. {
  170. dataField : "left_tfvl",
  171. caption : '좌회전',
  172. alignment : 'center',
  173. format : '#,##0',
  174. width : 90,
  175. },
  176. {
  177. dataField : "rght_tfvl",
  178. caption : '우회전',
  179. alignment : 'center',
  180. format : '#,##0',
  181. width : 90,
  182. },
  183. {
  184. dataField : "tot_tfvl",
  185. caption : '총교통량',
  186. alignment : "center",
  187. format : '#,##0',
  188. width : 120,
  189. },
  190. ],
  191. },
  192. {
  193. dataField : "dely_hh",
  194. caption : '지체시간(초/대)',
  195. alignment : "center",
  196. width : 140,
  197. },
  198. {
  199. dataField : "srvc_lvl",
  200. caption : 'LOS',
  201. alignment : "center",
  202. width : 70,
  203. lookup : {
  204. dataSource : lookupData,
  205. displayExpr : 'desc',
  206. valueExpr : 'code',
  207. }
  208. },
  209. ];
  210. _list = initializedGrid($(".list"), '100%', '100%', listColumns,
  211. [], 'single', 'virtual', ['ixr_nm', 'stat_dt'], false, true,
  212. false, '', false, false, true, _pageName,
  213. true, '', null).dxDataGrid('instance');
  214. //교차로교통량 통계 합계 테이블
  215. let totColumns = [
  216. {
  217. dataField : "go_tfvl",
  218. caption : '직진',
  219. alignment : 'center',
  220. format : '#,##0',
  221. },
  222. {
  223. dataField : "left_tfvl",
  224. caption : '좌회전',
  225. alignment : 'center',
  226. format : '#,##0',
  227. },
  228. {
  229. dataField : "rght_tfvl",
  230. caption : '우회전',
  231. alignment : 'center',
  232. format : '#,##0',
  233. },
  234. {
  235. dataField : "tot_tfvl",
  236. caption : '총교통량',
  237. alignment : "center",
  238. format : '#,##0',
  239. },
  240. ];
  241. _totList = initializedGrid($(".tot-list"), '100%', '100%', totColumns,
  242. [], 'none', 'virtual', '', false, false,
  243. false, '', false, false, false, '',
  244. false, '', null).dxDataGrid('instance');
  245. _totList.option('sorting', {mode : 'none'});
  246. ixrNm = new dxSelect($(".ixr_nm"), 'outlined', 300, 30, 'ixr_nm', 'ixr_id', false, 'ixr_id', '교차로명');
  247. istlLctn = new dxSelect($(".istl_lctn"), 'outlined', 300, 30, 'desc', 'cmra_id', false, 'cmra_id', '설치위치');
  248. unit = new dxSelect($(".unit"), 'outlined', 150, 30, 'desc', 'unit', false, 'unit', '단위');
  249. strtDt = new dxDate($(".strt-dt"), 'yyyy-MM-dd', '조회기간 시작일', 110, 30, 'date', null, '', null);
  250. strtTime = new dxDate($(".strt-time"), 'HH:mm', '조회기간 시각', 80, 30, 'time', 5, '', null);
  251. endDt = new dxDate($(".end-dt"), 'yyyy-MM-dd', '조회기간 종료일', 110, 30, 'date', null, '', null);
  252. endTime = new dxDate($(".end-time"), 'HH:mm', '조회기간 시각', 80, 30, 'time', 5, '', null);
  253. unit.setDataSource(unitData);
  254. unit.setValue('15m');
  255. unit.onItemClick(unitClick);
  256. strtDt.setValue(strtDtVal);
  257. strtTime.setValue(strtDtVal);
  258. endDt.setValue(endDtVal);
  259. endTime.setValue(endDtVal);
  260. ixrNm.onItemClick((e)=>ixrNmClick(e.itemData.ixr_id));
  261. searchBtn = new dxBtn($(".search-btn"),'조회', 'refresh', 'outlined', 80, 30, false, true);
  262. closeBtn = new dxBtn($(".close-btn"), '닫기', 'close', 'outlined', 80, 30, false, true);
  263. closeBtn.onClick(()=>window.close());
  264. searchBtn.onClick(searchBtnClick);
  265. _multiChart = Highcharts.chart('multi-chart', {
  266. chart: {
  267. type: 'column',
  268. backgroundColor: {
  269. classNmae: 'dx-theme-background-color dx-theme-border-color',
  270. },
  271. },
  272. title: {
  273. text : '교통량 통계 조회',
  274. style : {
  275. color: $('.dx-theme-material-typography').css('color'),
  276. },
  277. },
  278. xAxis: {
  279. categories: [],
  280. labels: {
  281. style: {
  282. color: $('.dx-theme-material-typography').css('color')
  283. }
  284. },
  285. },
  286. yAxis: [{
  287. ticks : 5,
  288. labels: {
  289. style: {
  290. color: $('.dx-theme-material-typography').css('color')
  291. }
  292. },
  293. title: {
  294. text: '교통량(대)',
  295. style: {
  296. color: $('.dx-theme-material-typography').css('color')
  297. }
  298. }
  299. },
  300. { // Secondary yAxis
  301. min : 1,
  302. max : 8,
  303. title: {
  304. text: '서비스수준(LOS)',
  305. style: {
  306. color: $('.dx-theme-material-typography').css('color'),
  307. }
  308. },
  309. labels: {
  310. style: {
  311. color: $('.dx-theme-material-typography').css('color'),
  312. },
  313. },
  314. categories : categories,
  315. opposite: true,
  316. }],
  317. plotOptions: {
  318. column: {
  319. stacking: 'percent'
  320. }
  321. },
  322. legend: {
  323. align: 'center',
  324. verticalAlign: 'bottom',
  325. itemStyle:{
  326. color: $('.dx-theme-material-typography').css('color'),
  327. },
  328. backgroundColor: {
  329. className : 'dx-nav-item dx-theme-border-color',
  330. }
  331. },
  332. series : multiSeries,
  333. tooltip: {
  334. formatter: function () {
  335. let name = this.series.name;
  336. let dt = name.substring(0,name.indexOf('('));
  337. if (this.series.name.indexOf('( LOS )') > -1) {
  338. let rank = this.series.yAxis.categories[this.y];
  339. if (this.y >= 0){
  340. return '<b>교통량 통계 조회</b><br>'
  341. + '일시 : <b>'
  342. + this.x
  343. + '</b><br>'
  344. + '서비스수준(LOS) : <b>'
  345. + rank
  346. + '</b>';
  347. }
  348. }
  349. else {
  350. return '<b>교통량 통계 조회 - ' + name +'</b><br>'
  351. + '일시 : <b>'
  352. + this.x
  353. + '</b><br>'
  354. + '교통량 : <b>'
  355. + this.y
  356. + ' 대</b>';
  357. }
  358. }
  359. },
  360. exporting : {
  361. enabled : false,
  362. },
  363. credits : {
  364. enabled : false
  365. },
  366. });
  367. _pieChart = Highcharts.chart('pie-chart', {
  368. chart: {
  369. type: 'pie',
  370. marginLeft: 20,
  371. marginTop : 20,
  372. plotBackgroundColor: null,
  373. plotBorderWidth: null,
  374. plotShadow: false,
  375. backgroundColor: {
  376. classNmae: 'dx-theme-background-color dx-theme-border-color',
  377. },
  378. },
  379. title: {
  380. text : '교통량 통계 조회 (합계)',
  381. y : 35,
  382. style : {
  383. color: $('.dx-theme-material-typography').css('color'),
  384. },
  385. },
  386. plotOptions: {
  387. pie: {
  388. allowPointSelect: true,
  389. cursor: 'pointer',
  390. size: '70%',
  391. dataLabels: {
  392. enabled: true,
  393. format: '<b>{point.name}</b><br>{point.y:,.0f} 대',
  394. distance: -50,
  395. filter: {
  396. property: 'percentage',
  397. operator: '>',
  398. value: 4
  399. },
  400. color: $('.dx-theme-material-typography').css('color'),
  401. },
  402. showInLegend: true
  403. }
  404. },
  405. tooltip : {
  406. pointFormat: '{series.name}: <b>{point.y}대</b>'
  407. },
  408. legend: {
  409. layout: 'vertical',
  410. align: 'left',
  411. verticalAlign: 'top',
  412. floating: false,
  413. y: 0,
  414. borderWidth: 1,
  415. itemStyle:{
  416. color: $('.dx-theme-material-typography').css('color'),
  417. },
  418. backgroundColor: {
  419. className : 'dx-nav-item dx-theme-border-color',
  420. },
  421. shadow: true,
  422. },
  423. exporting : {
  424. enabled : false,
  425. },
  426. credits : {
  427. enabled : false
  428. },
  429. series : pieSeries,
  430. });
  431. window.$chartArr = [_multiChart, _pieChart];
  432. fetchBaseData();
  433. })
  434. function fetchBaseData(){
  435. const uri = "/api/scrs/tb_sc_ixr_mngm";
  436. let drctData = [];
  437. getData(_codeUrl + '/DRCT', drctData);
  438. if (drctData[0] && drctData[0].length > 0) {
  439. drctData[0].map((item)=>{
  440. drctMap.set(Number(item.cmmn_cd), item.cmmn_cd_kor_nm);
  441. })
  442. }
  443. getDataAsync(uri, (jsonData)=>{
  444. dataSorting(jsonData, 'ixr_nm');
  445. ixrNm.setDataSource(jsonData);
  446. if (jsonData[0]) {
  447. ixrNm.setValue(jsonData[0].ixr_id);
  448. ixrNmClick(jsonData[0].ixr_id);
  449. }
  450. })
  451. }
  452. /**
  453. * 교차로 명칭 클릭 이벤트
  454. * @param ixrIdVal 교차로 Id
  455. */
  456. function ixrNmClick(ixrIdVal){
  457. let istlData = [];
  458. getData('/api/scrs/tb_sc_ixr_cmra_mngm/' + encodeURIComponent(ixrIdVal), istlData);
  459. if (istlData[0] && istlData[0].length > 0) {
  460. istlData[0].map((item)=>{
  461. item.desc = item.istl_lctn + ' [' + drctMap.get(item.drct_dvsn_cd) + ']';
  462. })
  463. istlLctn.setValue(istlData[0][0].cmra_id);
  464. }
  465. istlLctn.setDataSource(istlData[0]);
  466. }
  467. /**
  468. * 단위 클릭 변경 이벤트
  469. * @param {*} e select 상자 정보
  470. */
  471. function unitClick(e){
  472. if (e.itemData && e.itemData.unit) {
  473. let format = null;
  474. let display = null;
  475. let changeColumn = null;
  476. const dateColumn = [strtDt, endDt];
  477. const timeColumn = [strtTime, endTime];
  478. const strtTimeBox = $('.strt-time-box');
  479. const endTimeBox = $('.end-time-box');
  480. switch (e.itemData.unit) {
  481. case 'hh':
  482. changeColumn = 'time';
  483. format = hour;
  484. display = 'flex';
  485. break;
  486. case 'dd':
  487. changeColumn = 'date';
  488. format = date;
  489. display = 'none';
  490. break;
  491. case 'mn':
  492. changeColumn = 'date';
  493. format = month;
  494. display = 'none';
  495. break;
  496. default :
  497. changeColumn = 'time';
  498. format = time;
  499. display = 'flex';
  500. break;
  501. }
  502. if (changeColumn) {
  503. if (changeColumn === 'time') {
  504. timeColumn.map((item)=>{
  505. item.setFormat(format);
  506. });
  507. dateColumn.map((item)=>{
  508. item.setFormat(date);
  509. });
  510. }
  511. else {
  512. dateColumn.map((item)=>{
  513. item.setFormat(format);
  514. });
  515. }
  516. strtTimeBox.css('display', display);
  517. endTimeBox.css('display', display);
  518. }
  519. }
  520. }
  521. /**
  522. * 상단 조회 버튼 이벤트
  523. * @returns 유효성 체크용
  524. */
  525. function searchBtnClick(){
  526. if (ixrNm.isNull()) {
  527. return alertWarning('교차로명을 선택해주세요', null, ixrNm);
  528. }
  529. else if (istlLctn.isNull()) {
  530. return alertWarning('설치위치를 선택해주세요', null, istlLctn);
  531. }
  532. const unitVal = unit.getValue();
  533. let timeArr = getSearchValues(unitVal);
  534. if (timeArr.length === 0){
  535. return;
  536. };
  537. const FROM_DT = timeArr[0];
  538. const TO_DT = timeArr[1];
  539. const idVal = ixrNm.getValue();
  540. const cmraVal = istlLctn.getValue()
  541. let statData = {
  542. ixrId : idVal,
  543. cmraIds : cmraVal,
  544. FROM_DT : FROM_DT,
  545. TO_DT : TO_DT,
  546. };
  547. let losData = {
  548. ixrIds : idVal,
  549. FROM_DT : FROM_DT,
  550. TO_DT : TO_DT,
  551. };
  552. const stat = [];
  553. getData("/api/scrs/statistics/tfvl/" + unitVal + '/' + idVal, stat, statData); // 교차로 통계
  554. const los = [];
  555. getData("/api/scrs/statistics/srvc/" + unitVal, los, losData); // 서비스수준 통계
  556. let formatData = [];
  557. if (stat[0] && stat[0].length > 0) {
  558. stat[0].map((item)=>{
  559. let clone = {...item};
  560. if (los[0] && los[0].length > 0) {
  561. los[0].map((obj)=>{
  562. if (item.ixr_id === obj.ixr_id && item.stat_dt === obj.stat_dt) {
  563. clone.srvc_lvl = nullChecker(obj.srvc_lvl) === "" ? 0 : obj.srvc_lvl;
  564. clone.dely_hh = nullChecker(obj.dely_hh) === "" ? '-' : obj.dely_hh;
  565. }
  566. })
  567. }
  568. formatData.push(clone);
  569. })
  570. }
  571. drawTableAndChart(formatData, unitVal);
  572. }
  573. function drawTableAndChart(jsonData, unitVal){
  574. let xAxis = [];
  575. let totGo = 0;
  576. let totLeft = 0;
  577. let totRght = 0;
  578. let totTot = 0;
  579. let totDataSource;
  580. let yAxis = [
  581. {data: []},
  582. {data: []},
  583. {data: []},
  584. {data: []},
  585. ];
  586. if (jsonData.length > 0) {
  587. dataSorting(jsonData, 'clct_dt');
  588. jsonData.map((item)=>{
  589. console.log(item);
  590. if (item.stat_dt) item.stat_dt = timeFommater(item.stat_dt, unitVal);
  591. item.go_tfvl = 0;
  592. item.left_tfvl = 0;
  593. item.rght_tfvl = 0;
  594. for (let key in item) {
  595. if (key.indexOf("pce_") === -1 ) {
  596. if ( key.indexOf('go') > -1 && key !== 'go_tfvl' ) {
  597. item.go_tfvl += item[key];
  598. }
  599. if ( key.indexOf('left') > -1 && key !== 'left_tfvl' ) {
  600. item.left_tfvl += item[key];
  601. }
  602. if ( key.indexOf('rght') > -1 && key !== 'rght_tfvl') {
  603. item.rght_tfvl += item[key];
  604. }
  605. }
  606. }
  607. item.tot_tfvl = item.go_tfvl + item.left_tfvl + item.rght_tfvl;
  608. totGo += item.go_tfvl;
  609. totLeft += item.left_tfvl;
  610. totRght += item.rght_tfvl;
  611. totTot += item.tot_tfvl;
  612. yAxis[0].data.push(item.go_tfvl);
  613. yAxis[1].data.push(item.left_tfvl);
  614. yAxis[2].data.push(item.rght_tfvl);
  615. yAxis[3].data.push(nullChecker(item.srvc_lvl) === "" ? 0 : item.srvc_lvl);
  616. xAxis.push(item.stat_dt);
  617. })
  618. totDataSource = [{
  619. go_tfvl : totGo,
  620. left_tfvl : totLeft,
  621. rght_tfvl : totRght,
  622. tot_tfvl : totTot,
  623. }];
  624. }
  625. else {
  626. totDataSource = [];
  627. }
  628. let pieYAxis = [
  629. {y:totGo},
  630. {y:totLeft},
  631. {y:totTot},
  632. ]
  633. _list.option('dataSource', jsonData);
  634. _totList.option('dataSource', totDataSource);
  635. _multiChart.update({
  636. xAxis : {
  637. categories : xAxis,
  638. },
  639. series : [
  640. {
  641. data : yAxis[0].data
  642. },
  643. {
  644. data : yAxis[1].data
  645. },
  646. {
  647. data : yAxis[2].data
  648. },
  649. {
  650. data : yAxis[3].data
  651. },
  652. ]
  653. });
  654. _pieChart.update({
  655. series : [
  656. {
  657. data : pieYAxis
  658. },
  659. ]
  660. });
  661. selResultMsg(jsonData);
  662. }
  663. function getSearchValues(unitVal){
  664. const display = $('.strt-time-box').css('diplay');
  665. let dateColumns = [strtDt, strtTime, endDt, endTime];
  666. if (display === "none") {
  667. dateColumns = [strtDt, endDt];
  668. }
  669. for (let dateColumn of dateColumns) {
  670. if (dateColumn.isValidation()) {
  671. alertWarning('형식에 맞게 입력해주세요. [ ' + dateColumn.label + ' ]', null, dateColumn);
  672. return [];
  673. }
  674. else if (dateColumn.isNull()) {
  675. alertWarning('조회기간을 입력해주세요. [ ' + dateColumn.label + ' ]', null, dateColumn);
  676. return [];
  677. }
  678. }
  679. let FROM_DT;
  680. let TO_DT;
  681. let format;
  682. switch (unitVal) {
  683. case '15m':
  684. case '30m':
  685. FROM_DT = concateVal(strtDt, 8, strtTime, 4) + '00';
  686. TO_DT = concateVal(endDt, 8, endTime, 4) + '59';
  687. break;
  688. case 'hh':
  689. FROM_DT = concateVal(strtDt, 8, strtTime, 2) + '0000';
  690. TO_DT = concateVal(endDt, 8, endTime, 2) + '5959';
  691. break;
  692. case 'dd':
  693. FROM_DT = strtDt.getSendDateValue().substring(0, 8) + '000000';
  694. TO_DT = endDt.getSendDateValue().substring(0, 8) + '235959';
  695. break;
  696. case 'mn':
  697. FROM_DT = strtDt.getSendDateValue().substring(0, 6) + '01000000';;
  698. TO_DT = endDt.getSendDateValue().substring(0, 6) + '31235959';
  699. break;
  700. }
  701. if (FROM_DT > TO_DT) {
  702. alertWarning('검색 시작 기간 보다 검색 종료 기간이 큽니다.', null, endDt);
  703. return [];
  704. }
  705. return [FROM_DT, TO_DT];
  706. }
  707. function concateVal(dt, dtNum, time, timeNum){
  708. return dt.getSendDateValue().substring(0,dtNum) + time.getSendTimeValue().substring(0, timeNum);
  709. }
  710. function timeFommater(data, unitVal){
  711. let str = "";
  712. str += data.substring(0, 4);
  713. str += "-";
  714. str += data.substring(4, 6);
  715. switch (unitVal) {
  716. case '15m':
  717. str += "-";
  718. str += data.substring(6, 8);
  719. str += " ";
  720. str += data.substring(8, 10);
  721. str += ":";
  722. str += data.substring(10, 12);
  723. break;
  724. case '30m':
  725. str += "-";
  726. str += data.substring(6, 8);
  727. str += " ";
  728. str += data.substring(8, 10);
  729. str += ":";
  730. str += data.substring(10, 12);
  731. break;
  732. case 'hh':
  733. str += "-";
  734. str += data.substring(6, 8);
  735. str += " ";
  736. str += data.substring(8, 10);
  737. str += "시";
  738. break;
  739. case 'dd':
  740. str += "-";
  741. str += data.substring(6, 8);
  742. break;
  743. case 'mn':
  744. break;
  745. }
  746. return str;
  747. }