layout02Ran.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <template>
  2. <div class="core--component--wrap">
  3. <div class="inner--header--wrap">
  4. <h2 class="inner--component--title none--after">
  5. RAN
  6. </h2>
  7. <!--<div class="pagenation--wrapper">
  8. <div class="total--wrapper">
  9. Total : <span class="total--count">18</span>
  10. </div>
  11. <div class="pager--btn--wrap">
  12. <v-btn flat class="page--btn prev--btn"></v-btn>
  13. <div class="page--numb">
  14. <span class="current">1</span>/<span>3</span>
  15. </div>
  16. <v-btn flat class="page--btn next--btn"></v-btn>
  17. <div class="user--type">
  18. <v-select
  19. v-model="sltModel1"
  20. :items="slt1"
  21. variant="outlined"
  22. style="width:9.5rem"
  23. class="custom-select"
  24. >
  25. </v-select>
  26. <v-select
  27. v-model="sltModel2"
  28. :items="slt2"
  29. variant="outlined"
  30. style="width:9.5rem"
  31. class="custom-select"
  32. >
  33. </v-select>
  34. <v-btn class="custom-btn mini lgd--btn"></v-btn>
  35. </div>
  36. </div>
  37. </div>-->
  38. </div>
  39. <div class="inner--content">
  40. <ul class="ran--card">
  41. <li v-for="(item, idx) in cardRanInfo" :key="idx" :class="item.cls">
  42. <div class="ran--title">
  43. <span class="ran--area">{{item.areaName}}</span>
  44. <v-btn class="more--btn" flat @click="fnClickCardDetail(item)"></v-btn>
  45. </div>
  46. <div class="ran--stat">
  47. <p>
  48. <span>테넌트 수</span><span>{{item.tenantCnt}}</span>
  49. </p>
  50. <p>
  51. <span>NE그룹 수</span><span>{{item.neGroupCnt}}</span>
  52. </p>
  53. <p>
  54. <span>NE 수</span><span>{{item.neCnt}}</span>
  55. </p>
  56. </div>
  57. </li>
  58. </ul>
  59. </div>
  60. <RanCardGroupDetailModal v-if="isShowRanCardGroupDetailModal" :propsObj="propsCardObj" :centerPosition="centerPosition" @closeModal="isShowRanCardGroupDetailModal = false"/>
  61. </div>
  62. </template>
  63. <script setup>
  64. /***********************
  65. * import
  66. ************************/
  67. import { useI18n } from "vue-i18n"
  68. import apiUrl from '@/composables/useApi';
  69. import useAxios from '@/composables/useAxios';
  70. import useUtil from '@/composables/useUtil';
  71. import RanCardGroupDetailModal from '@/components/home/dashboard/common/ranCardGroupDetailModal.vue';
  72. /***********************
  73. * plugins inject
  74. ************************/
  75. const { $toast, $log, $dayjs, $eventBus } = useNuxtApp()
  76. // props
  77. const props = defineProps({})
  78. // 참조가능 데이터 설정
  79. defineExpose({})
  80. // 발신 이벤트 선언
  81. const emit = defineEmits([""]);
  82. const i18n = useI18n();
  83. /***********************
  84. * data & created
  85. ************************/
  86. const isShowRanCardGroupDetailModal = ref(false)
  87. // 카카오맵 센터좌표
  88. const centerPosition = ref({
  89. lat: 33.450701,
  90. lng: 126.570667
  91. })
  92. const ranInterval = ref(null)
  93. const sidoCode = ref([])
  94. const cardRanInfo = ref([]) // 카드형 데이터
  95. const propsCardObj = ref({})
  96. onMounted(() => {
  97. console.log('%c 대시보드 레이아웃2 RAN 카드형 24*12' ,'color:#bada55','')
  98. fnGeoTenantNeInfo()
  99. ranInterval.value = setInterval(() => {
  100. fnGeoTenantNeInfo()
  101. }, 1000 * 60 * 5)
  102. })
  103. onUnmounted(() => {
  104. clearInterval(ranInterval.value)
  105. ranInterval.value = null
  106. })
  107. watchEffect(() =>{
  108. fnGetEnumCode(useLangStore().getLang)
  109. })
  110. /**
  111. * ENUM 업데이트
  112. * @param lang
  113. */
  114. function fnGetEnumCode(lang){
  115. let objEnum = useEnumCode.getEnumCode(lang)
  116. // ...objEnum.sidoCode
  117. sidoCode.value = _cloneDeep(objEnum.sidoCode.slice(1))
  118. fnSetInitMapData()
  119. }
  120. const getCardAllRan = computed(() => {
  121. let result = {
  122. areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []
  123. }
  124. cardRanInfo.value.forEach((item, idx) => {
  125. if(idx !== 0) {
  126. result.criCnt += item.criCnt
  127. result.majCnt += item.majCnt
  128. result.minCnt += item.minCnt
  129. result.tenantCnt += item.tenantCnt
  130. result.neGroupCnt += item.neGroupCnt
  131. result.neCnt += item.neCnt
  132. result.tenantList.push(...item.tenantList)
  133. result.neGroupList.push(...item.neGroupList)
  134. }
  135. })
  136. return result
  137. })
  138. /***********************
  139. * Methods
  140. ************************/
  141. // 초기 데이터 세팅
  142. function fnSetInitMapData(){
  143. let tempCardRanData = [{areaName: '전국현황', areaCode: 0, cls: 'ran--all', criCnt: 0, majCnt: 0, minCnt: 0, tenantCnt: 0, neGroupCnt: 0, neCnt: 0, tenantList:[], neGroupList: []}]
  144. sidoCode.value.forEach((item) => {
  145. let cardRanObj = {}
  146. cardRanObj.areaName = item.title[0]
  147. cardRanObj.areaCode = item.value
  148. cardRanObj.cls = ''
  149. cardRanObj.criCnt = 0
  150. cardRanObj.majCnt = 0
  151. cardRanObj.minCnt = 0
  152. cardRanObj.tenantCnt = 0
  153. cardRanObj.neGroupCnt = 0
  154. cardRanObj.neCnt = 0
  155. cardRanObj.tenantList = []
  156. cardRanObj.neGroupList = []
  157. tempCardRanData.push(cardRanObj)
  158. })
  159. cardRanInfo.value = _cloneDeep(tempCardRanData)
  160. }
  161. /**
  162. * P5G RAN
  163. */
  164. function fnGeoTenantNeInfo() {
  165. let _req = {
  166. tenantName: useAuthStore().getTenantName
  167. }
  168. useAxios().post(useApi.tenantNeInfo, _req).then((res) => {
  169. $log.debug("[dashboard][fnGeoTenantNeInfo][success]")
  170. let datas = res.data.data.items
  171. fnMakeNeData(datas)
  172. }).catch((error)=>{
  173. $log.debug("[dashboard][fnGeoTenantNeInfo][error]")
  174. useErrorHandler().fnSetCommErrorHandle(error, fnGeoTenantNeInfo)
  175. }).finally(()=>{
  176. $log.debug("[dashboard][fnGeoTenantNeInfo][finished]")
  177. })
  178. }
  179. /**
  180. * 지도 데이터 및 모든 데이터 가공
  181. */
  182. function fnMakeNeData(arr){
  183. // 데이터 초기화
  184. fnSetInitMapData()
  185. arr.forEach((item, idx) => {
  186. // 카드형 데이터 세팅
  187. let cardFindIndex = cardRanInfo.value.findIndex((obj => obj.areaCode === item.areaCode))
  188. if(cardFindIndex !== -1) {
  189. // 테넌트 리스트 세팅
  190. cardRanInfo.value[cardFindIndex].minCnt += item.minCnt
  191. cardRanInfo.value[cardFindIndex].majCnt += item.majCnt
  192. cardRanInfo.value[cardFindIndex].criCnt += item.criCnt
  193. if(!cardRanInfo.value[cardFindIndex].tenantList.includes(item.tenantName)) {
  194. cardRanInfo.value[cardFindIndex].tenantList.push(item.tenantName)
  195. cardRanInfo.value[cardFindIndex].tenantCnt++
  196. }
  197. // 그룹 및 NE 세팅
  198. if(!_isEmpty(_find(cardRanInfo.value[cardFindIndex].neGroupList, {neGroup: item.neGroup}))) {
  199. let groupFindIndex = cardRanInfo.value[cardFindIndex].neGroupList.findIndex((obj => obj.neGroup === item.neGroup))
  200. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].minCnt += item.minCnt
  201. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].majCnt += item.majCnt
  202. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].criCnt += item.criCnt
  203. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neCnt++
  204. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].tenantName = item.tenantName
  205. cardRanInfo.value[cardFindIndex].neGroupList[groupFindIndex].neList.push(item)
  206. cardRanInfo.value[cardFindIndex].neCnt++
  207. }else{
  208. cardRanInfo.value[cardFindIndex].neGroupList.push({neGroup: item.neGroup, tenantName: item.tenantName, neCnt: 1, minCnt: item.minCnt, majCnt: item.majCnt, criCnt: item.criCnt, neList: [item]})
  209. cardRanInfo.value[cardFindIndex].neGroupCnt++
  210. cardRanInfo.value[cardFindIndex].neCnt++
  211. }
  212. }
  213. })
  214. // 카드형 데이터 > 전국현황 데이터 세팅
  215. cardRanInfo.value[0] = _cloneDeep(getCardAllRan.value)
  216. console.log('%c 카드형 전국현황 데이터 [cardRanInfo]' ,'color:#bada55', cardRanInfo.value)
  217. }
  218. /**
  219. * 카드형 UI 상세보기 클릭
  220. */
  221. function fnClickCardDetail(item) {
  222. console.log('%c 클릭 item' ,'color:#bada55', item)
  223. propsCardObj.value = item
  224. isShowRanCardGroupDetailModal.value = true
  225. }
  226. </script>