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