departmentDrank.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "departmentDrank"
  4. });
  5. import { ref, reactive } from "vue";
  6. import { useRouter } from "vue-router";
  7. import radar from "@/components/echarts/radar.vue";
  8. import barEcharts from "@/components/echarts/bar.vue";
  9. import rankTable from "@/components/rankTable/draw.vue";
  10. import personList from "@/components/personList/index.vue";
  11. import qvanping from "@/assets/rank/qvanping@2x.png";
  12. import seachData from "./componements/seach.vue";
  13. import {
  14. getPersonDimensionChartsList,
  15. getPersonDimensionChartsRanking,
  16. getAssessmentList,
  17. getChartsList
  18. } from "@/api/draw";
  19. import type { TabsPaneContext } from "element-plus";
  20. const router = useRouter();
  21. const activeName = ref("1");
  22. // 柱状图
  23. const barEchartsRef = ref();
  24. const radarRef = ref();
  25. const rankTableRef = ref();
  26. const barDimEchartsRef = ref();
  27. const dataList = reactive({
  28. dimName: []
  29. });
  30. const seachParams = ref();
  31. const getPersonDimensionChartsListApi = async (
  32. dimensionName?: string,
  33. dimId?: number | string
  34. ) => {
  35. const { code, data } = await getPersonDimensionChartsList({
  36. ...seachParams.value,
  37. dimId,
  38. dimensionName,
  39. type: 1
  40. });
  41. if (code == 200) {
  42. if (data.length > 0) {
  43. data.dimensionList.map(item => {
  44. dataList.dimName.push({
  45. name: item.dimName,
  46. id: item.dimId
  47. });
  48. });
  49. if (dimensionName && dimId) {
  50. personListRef.value.init(data);
  51. } else {
  52. radarRef.value.initChart(data);
  53. rankTableRef.value.init(data, "科室");
  54. }
  55. }
  56. }
  57. // console.log(res);
  58. };
  59. const getPersonDimensionChartsRankingApi = async (
  60. dimensionName?: string,
  61. dimId?: number | string
  62. ) => {
  63. const { code, data } = await getPersonDimensionChartsRanking({
  64. ...seachParams.value,
  65. dimId,
  66. dimensionName,
  67. type: 1
  68. });
  69. if (code == 200) {
  70. if (data.length > 0) {
  71. barEchartsRef.value.init(data);
  72. }
  73. }
  74. };
  75. const init = item => {
  76. seachParams.value = item;
  77. getPersonDimensionChartsListApi();
  78. getPersonDimensionChartsRankingApi();
  79. barDimEchartsRef.value.init(seachParams.value, 1);
  80. };
  81. // 维度表格
  82. const personListRef = ref();
  83. const handleClick = (tab: TabsPaneContext, event: Event) => {
  84. console.log(tab, event);
  85. if (tab.props.label == "总览") {
  86. getPersonDimensionChartsListApi();
  87. getPersonDimensionChartsRankingApi();
  88. } else {
  89. getPersonDimensionChartsListApi(tab.props.label, tab.props.name);
  90. getPersonDimensionChartsRankingApi(tab.props.label, tab.props.name);
  91. }
  92. barEchartsRef.value.init(tab.props);
  93. };
  94. const fullBig = (item: any) => {
  95. router.push({
  96. path: "/fullBig",
  97. query: { title: item, ...seachParams.value, type: 1 }
  98. });
  99. };
  100. </script>
  101. <template>
  102. <div class="w-[100%]">
  103. <div class="w-[100%]">
  104. <seachData @handClick="init" />
  105. <div v-if="dataList.dimName.length > 0">
  106. <div class="flex mr-2">
  107. <radar ref="radarRef" />
  108. </div>
  109. <el-tabs
  110. v-model="activeName"
  111. class="demo-tabs"
  112. :lazy="true"
  113. @tab-click="handleClick"
  114. >
  115. <el-tab-pane label="总览" name="1">
  116. <div class="flex mr-8">
  117. <rankTable ref="rankTableRef" />
  118. </div>
  119. <!-- 总得分 -->
  120. <div class="mt-5 pr-8 w-full h-60">
  121. <barEcharts ref="barEchartsRef" :title="'总得分'" />
  122. </div>
  123. <!-- 维度得分 -->
  124. <div
  125. v-for="(item, index) in dataList.dimName"
  126. :key="index"
  127. class="flex justify-between flex-wrap items-center"
  128. >
  129. <div class="mt-5 pr-8 w-1/2 h-60">
  130. <barDimEcharts ref="barDimEchartsRef" :title="item.name" />
  131. </div>
  132. </div>
  133. </el-tab-pane>
  134. <el-tab-pane
  135. v-for="(item, index) in dataList.dimName"
  136. :key="index"
  137. :label="item.name"
  138. :name="item.id"
  139. :lazy="true"
  140. >
  141. <div class="w-full">
  142. <div class="flex justify-between">
  143. <personList ref="personListRef" class="w-11/12" />
  144. <div
  145. class="w-[30px] h-[30px] mr-10 cursor-pointer"
  146. @click="fullBig(item.name)"
  147. >
  148. <img class="w-full h-full" :src="qvanping" alt="" />
  149. </div>
  150. </div>
  151. <div class="w-full h-60 mt-5 pr-8">
  152. <barEcharts ref="barEchartsRef" :title="item.name" />
  153. </div>
  154. </div>
  155. </el-tab-pane>
  156. </el-tabs>
  157. </div>
  158. </div>
  159. </div>
  160. </template>