departmentDrank.vue 7.2 KB

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