healthDrank.vue 8.0 KB

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