tenantTrend.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <div class="content--r--b">
  3. <div class="content--inner">
  4. <div class="content--inner--title">
  5. <p>Trend<!--<i class="ico"></i>--></p>
  6. <div class="select--wrap">
  7. <v-select
  8. v-model="objSltSearch.neFamilyName"
  9. :items="objSltOptions.neFamilyNameList"
  10. variant="outlined"
  11. style="width:12.875rem"
  12. class="custom-select"
  13. hide-details
  14. />
  15. <!-- <v-btn class="custom-btn btn-blue mid">
  16. 적용
  17. </v-btn> -->
  18. </div>
  19. <div class="btn-wrap">
  20. <!-- <v-btn class="custom-btn mini btn-white btn-pip">
  21. <i class="ico" />전체보기
  22. </v-btn> -->
  23. </div>
  24. </div>
  25. <div
  26. v-if="chartItem && Object.keys(chartItem).length > 0"
  27. class="chart--con"
  28. >
  29. <div class="chart--in">
  30. <trendBar :chart-item="chartItem" />
  31. </div>
  32. </div>
  33. <!-- 데이터 없을 경우 -->
  34. <div
  35. v-else
  36. class="content--inner--content no--data"
  37. >
  38. <i class="ico" />데이터가 없습니다.
  39. </div>
  40. </div>
  41. </div>
  42. </template>
  43. <script setup>
  44. /***********************
  45. * import
  46. ************************/
  47. import { useI18n } from "vue-i18n"
  48. import apiUrl from '@/composables/useApi';
  49. import useAxios from '@/composables/useAxios';
  50. import useUtil from '@/composables/useUtil';
  51. import dayjs from "#build/dayjs.imports.mjs";
  52. import trendBar from '@/components/home/tenant/chart/trendBar.vue'
  53. import testJson from '../dashboard/test.json'
  54. /***********************
  55. * plugins inject
  56. ************************/
  57. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  58. // props
  59. const props = defineProps({})
  60. // 참조가능 데이터 설정
  61. defineExpose({
  62. fnInit,
  63. })
  64. // 발신 이벤트 선언
  65. const emit = defineEmits([""]);
  66. const i18n = useI18n();
  67. /***********************
  68. * data & created
  69. ************************/
  70. // 차트데이터 조회 간격
  71. const chartInterval = ref(15);
  72. // 차트데이터 시작 시간
  73. const chartDiffHour = ref(-6);
  74. // 검색 option List object
  75. const objSltOptions = ref({
  76. neFamilyNameList: [],
  77. });
  78. // 검색 조건 Object
  79. const objSltSearch = ref({
  80. neFamilyName: '',
  81. })
  82. // 선택된 테넌트명
  83. const selectedTenantName = ref('');
  84. // chartdata
  85. const chartItem = ref({});
  86. /***********************
  87. * Methods
  88. ************************/
  89. function fnInit(tenantName) {
  90. console.log('::::::: tenantTrend init ::::' , tenantName)
  91. fnReset();
  92. selectedTenantName.value = tenantName;
  93. fnGetTrendList()
  94. }
  95. const fnReset = () => {
  96. chartItem.value = {};
  97. objSltSearch.value.neFamilyName = '';
  98. objSltOptions.value.neFamilyNameList = [];
  99. }
  100. /**
  101. * 트렌드 목록 조회 : familyName 목록
  102. */
  103. const fnGetTrendList = (neFamilyName = '') => {
  104. return new Promise((resolve, reject) => {
  105. const params = {
  106. tenantName: selectedTenantName.value,
  107. intv: chartInterval.value,
  108. start: dayjs().add(chartDiffHour.value, 'hours').format('YYYY-MM-DD HH:mm:ss'),
  109. end: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  110. }
  111. useAxios().get(useApi.getTrendHomeList, {params: params}).then((res) => {
  112. const {resCode, resMsg, data} = res.data;
  113. if(resCode == 200) {
  114. fnSetData(data, neFamilyName);
  115. $log.debug("[tenantDashboard][fnGetTrendList][success]")
  116. } else {
  117. $log.debug("[tenantDashboard][fnGetTrendList][error]", `[${resCode}] ${resMsg}`);
  118. }
  119. resolve();
  120. console.log('::::::::: 트렌드 목록 조회 ::', data)
  121. }).catch((error)=>{
  122. // 데이터가 없는 경우 204로 넘어온다...
  123. if(error?.response?.data?.status == 204) {
  124. fnSetData(null, neFamilyName);
  125. resolve();
  126. $log.debug("[tenantDashboard][fnGetTrendList][success empty]")
  127. } else {
  128. reject();
  129. $log.debug("[tenantDashboard][fnGetTrendList][error]", error)
  130. useErrorHandler().fnSetCommErrorHandle(error, fnGetTrendList)
  131. }
  132. }).finally(()=>{
  133. $log.debug("[tenantDashboard][fnGetTrendList][finished]")
  134. })
  135. })
  136. }
  137. const fnSetData = (data, neFamilyName) => {
  138. if(data && data.length > 0) {
  139. if(neFamilyName) {
  140. // 테스트 데이터 - 삭제 필수 : Todo: items가 어떻게 전달되는지 확인 후 적용 필요
  141. // const findData = data.find((nf) => nf.neFamilyName == neFamilyName) || {};
  142. // if(neFamilyName == 'nename001_RRC_ESTAB' || neFamilyName == 'nename001_RRC_REESTAB' || neFamilyName == 'nename001_UE_NUM_PER_GNB') {
  143. // findData.items = [...testJson.tenantTrendItems1]
  144. // } else {
  145. // findData.items = [...testJson.tenantTrendItems2]
  146. // }
  147. chartItem.value = data.find((nf) => nf.neFamilyName == neFamilyName) || {};
  148. } else {
  149. objSltOptions.value.neFamilyNameList = data.map((f) => {
  150. return {title: f.neFamilyName, value: f.neFamilyName}
  151. });
  152. objSltSearch.value.neFamilyName = objSltOptions.value.neFamilyNameList[0].value;
  153. chartItem.value = data.find((nf) => nf.neFamilyName == objSltOptions.value.neFamilyNameList[0].value) || {};
  154. }
  155. } else {
  156. fnReset();
  157. }
  158. }
  159. /***********************
  160. * Watch Computed
  161. ************************/
  162. watch(
  163. () => objSltSearch.value.neFamilyName,
  164. async (neFamilyName) => {
  165. await fnGetTrendList(neFamilyName);
  166. console.log("chart neFamily change :::::::" , neFamilyName)
  167. }
  168. )
  169. </script>