healthDrank.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "headDrank"
  4. });
  5. import { ref, reactive, nextTick } 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 barDimEcharts from "@/components/echarts/barDim.vue";
  10. import rankTable from "@/components/rankTable/draw.vue";
  11. import personList from "@/components/personList/index.vue";
  12. import qvanping from "@/assets/rank/qvanping@2x.png";
  13. import seachData from "./componements/seach.vue";
  14. import {
  15. getPersonDimensionChartsList,
  16. getPersonDimensionChartsRanking,
  17. getChartsList
  18. } from "@/api/draw";
  19. import type { TabsPaneContext } from "element-plus";
  20. const router = useRouter();
  21. const value = ref("");
  22. const radarRef = ref();
  23. const rankTableRef = ref();
  24. const activeName = ref("1");
  25. const barEchartsRef = ref();
  26. const barDimEchartsRef = ref();
  27. const seachParams = ref();
  28. // 排行榜
  29. const showLength = ref(0);
  30. const rankTableRefList = reactive({
  31. data: [],
  32. dept: "",
  33. name: ""
  34. });
  35. const chartList = ref([]);
  36. const getChartsListApi = async () => {
  37. const { code, data } = await getChartsList({
  38. ...seachParams.value,
  39. type: 2
  40. });
  41. if (code == 200) {
  42. // showLength.value = data.length;
  43. nextTick(() => {
  44. if (data && data.length > 0) {
  45. showLength.value = data.length;
  46. setTimeout(() => {
  47. console.log("1243tethdgfsa", data);
  48. rankTableRef.value.init(data, "医疗组");
  49. }, 500);
  50. }
  51. });
  52. }
  53. };
  54. // 雷达图
  55. const dataList = reactive({
  56. dimName: []
  57. });
  58. const getPersonDimensionChartsListApiDimList = async () => {
  59. const { code, data } = await getPersonDimensionChartsList({
  60. ...seachParams.value,
  61. type: 2
  62. });
  63. if (code == 200) {
  64. dataList.dimName = [];
  65. if (data && data.length > 0) {
  66. data.map(it => {
  67. it.dimensionList.map(item => {
  68. dataList.dimName.push({
  69. name: item.dimName,
  70. id: item.dimId
  71. });
  72. });
  73. });
  74. }
  75. }
  76. };
  77. const radarRefList = ref([]);
  78. const getPersonDimensionChartsListApi = async (
  79. dimensionName?: string,
  80. dimId?: number | string,
  81. index?: any
  82. ) => {
  83. let tabIndex = Number(index);
  84. const { code, data } = await getPersonDimensionChartsList({
  85. ...seachParams.value,
  86. dimId,
  87. dimensionName,
  88. type: 2
  89. });
  90. if (code == 200) {
  91. if (data && data.length > 0) {
  92. if (dimensionName && dimId) {
  93. setTimeout(() => {
  94. nextTick(() => {
  95. // personListRef?.value[tabIndex - 1]?.init(data);
  96. });
  97. }, 500);
  98. } else {
  99. setTimeout(() => {
  100. nextTick(() => {
  101. // radarRefList.value = data;
  102. // radarRef.value.initChart(data);
  103. });
  104. }, 500);
  105. }
  106. }
  107. }
  108. // console.log(res);
  109. };
  110. // 柱状图
  111. const getPersonDimensionChartsRankingApi = async (
  112. dimensionName?: string,
  113. dimId?: number | string
  114. ) => {
  115. // const { code, data } = await getPersonDimensionChartsRanking({
  116. // ...seachParams.value,
  117. // dimId,
  118. // dimensionName,
  119. // type: 2
  120. // });
  121. // if (code == 200) {
  122. // if (data.length > 0) {
  123. // }
  124. // }
  125. };
  126. const barDimEchartsList = reactive({
  127. data: null,
  128. type: null
  129. });
  130. const init = (item, type) => {
  131. seachParams.value = item;
  132. if (Number(type)) {
  133. nextTick(() => {
  134. radarRefList.value = { ...seachParams.value, type: 2 };
  135. barDimEchartsList.data = item;
  136. barDimEchartsList.type = 2;
  137. getPersonDimensionChartsListApi();
  138. getPersonDimensionChartsRankingApi();
  139. getPersonDimensionChartsListApiDimList();
  140. getChartsListApi();
  141. activeName.value = "1";
  142. });
  143. }
  144. setTimeout(() => {
  145. nextTick(() => {
  146. if (barDimEchartsRef.value) {
  147. // barDimEchartsRef.value[0].init(seachParams.value, 0);
  148. if (Array.isArray(barDimEchartsRef.value)) {
  149. dataList.dimName.map((it, id) => {
  150. barDimEchartsRef?.value[id - 1]?.init(seachParams.value, 0);
  151. });
  152. } else {
  153. barDimEchartsRef.value.init(seachParams.value, 0);
  154. }
  155. }
  156. });
  157. }, 500);
  158. };
  159. // 维度表格
  160. const paramsIndex = ref({});
  161. const personListRef = ref();
  162. const handleClick = (tab: TabsPaneContext, event: Event) => {
  163. loading.value = true;
  164. if (tab.props.label == "总览") {
  165. getPersonDimensionChartsListApi();
  166. getPersonDimensionChartsRankingApi();
  167. getChartsListApi();
  168. } else {
  169. getPersonDimensionChartsListApi(tab.props.label, tab.props.name, tab.index);
  170. getPersonDimensionChartsRankingApi(tab.props.label, tab.props.name);
  171. }
  172. nextTick(() => {
  173. Object.assign(paramsIndex.value, {
  174. ...seachParams.value,
  175. dimId: tab.props.name,
  176. dimensionName: tab.props.label,
  177. type: 2
  178. });
  179. });
  180. setTimeout(() => {
  181. loading.value = false;
  182. }, 1000);
  183. // barEchartsRef.value.init(tab.props);
  184. };
  185. const fullBig = (item: any) => {
  186. router.push({
  187. path: "/fullBig",
  188. query: {
  189. ...item,
  190. ...seachParams.value,
  191. type: 2
  192. }
  193. });
  194. };
  195. const loading = ref(false);
  196. </script>
  197. <template>
  198. <div class="w-[100%]">
  199. <div class="w-[100%]">
  200. <seachData @handClick="init" />
  201. <div v-if="showLength > 0">
  202. <div class="flex mr-2">
  203. <radar ref="radarRef" :radarRefList="radarRefList" />
  204. </div>
  205. <el-tabs
  206. v-model="activeName"
  207. v-loading="loading"
  208. class="demo-tabs"
  209. :lazy="true"
  210. @tab-click="handleClick"
  211. >
  212. <el-tab-pane label="总览" name="1">
  213. <div class="flex mr-8">
  214. <rankTable ref="rankTableRef" />
  215. </div>
  216. <!-- 总得分 -->
  217. <div class="mt-5 pr-8 w-full h-60">
  218. <barEcharts
  219. ref="barEchartsRef"
  220. :title="'总得分'"
  221. :barDimEchartsList="barDimEchartsList"
  222. />
  223. </div>
  224. <!-- 维度得分 -->
  225. <!-- <div
  226. v-for="(item, index) in dataList.dimName"
  227. :key="index"
  228. class="flex justify-between flex-wrap items-center"
  229. >
  230. <div class="mt-5 pr-8 w-1/2 h-60">
  231. <barDimEcharts ref="barDimEchartsRef" :title="item.name" />
  232. </div>
  233. </div> -->
  234. <div class="flex justify-between flex-wrap items-center">
  235. <div v-for="(item, index) in dataList.dimName" :key="index">
  236. <div class="mt-5 pr-8 h-60 w-[600px]">
  237. <barDimEcharts
  238. ref="barDimEchartsRef"
  239. :title="item.name"
  240. :barDimEchartsList="barDimEchartsList"
  241. :itemDim="item"
  242. />
  243. </div>
  244. </div>
  245. </div>
  246. </el-tab-pane>
  247. <el-tab-pane
  248. v-for="(item, index) in dataList.dimName"
  249. :key="index"
  250. :label="item.name"
  251. :name="item.id"
  252. :lazy="true"
  253. >
  254. <div class="w-full">
  255. <div class="flex justify-between">
  256. <personList
  257. ref="personListRef"
  258. class="w-11/12"
  259. :paramsIndex="paramsIndex"
  260. />
  261. <div
  262. class="w-[30px] h-[30px] mr-10 cursor-pointer"
  263. @click="fullBig(item)"
  264. >
  265. <img class="w-full h-full" :src="qvanping" alt="" />
  266. </div>
  267. </div>
  268. <div class="w-full h-60 mt-5 pr-8">
  269. <barEcharts
  270. ref="barEchartsRef"
  271. :title="item.name"
  272. :barDimEchartsList="barDimEchartsList"
  273. :itemDim="item"
  274. />
  275. </div>
  276. </div>
  277. </el-tab-pane>
  278. </el-tabs>
  279. </div>
  280. </div>
  281. </div>
  282. </template>