workerDrak.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "workerDrak"
  4. });
  5. import { ref, reactive, nextTick, onMounted, 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 { getPersonDimensionChartsList, getChartsList } from "@/api/draw";
  15. import type { TabsPaneContext } from "element-plus";
  16. const router = useRouter();
  17. const value = ref("");
  18. const radarRef = ref();
  19. const rankTableRef = ref();
  20. const activeName = ref("1");
  21. const barEchartsRef = ref();
  22. const barDimEchartsRef = ref();
  23. const seachParams = ref<any>();
  24. // 排行榜
  25. const showLength = ref(0);
  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: 0
  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 dataList = reactive({
  49. dimName: []
  50. });
  51. const getPersonDimensionChartsListApiDimList = async () => {
  52. const { code, data } = await getPersonDimensionChartsList({
  53. ...seachParams.value,
  54. type: 0
  55. });
  56. if (code == 200) {
  57. radarRefList.value = data;
  58. dataList.dimName = [];
  59. if (data && data.length > 0) {
  60. data.map(it => {
  61. it.dimensionList.map(item => {
  62. dataList.dimName.push({
  63. name: item.dimName,
  64. id: item.dimId
  65. });
  66. });
  67. });
  68. }
  69. }
  70. };
  71. const radarRefList = ref();
  72. const barDimEchartsList = reactive({
  73. data: null,
  74. type: null
  75. });
  76. const init = (item: any, type: any, val: any) => {
  77. seachParams.value = item;
  78. barDimEchartsList.data = null;
  79. barDimEchartsList.type = null;
  80. if (Number(type)) {
  81. nextTick(() => {
  82. barDimEchartsList.data = item;
  83. barDimEchartsList.type = 0;
  84. if (val) {
  85. getPersonDimensionChartsListApiDimList();
  86. seachParams.value = {
  87. ...item,
  88. assessmentObjectName: "",
  89. assessmentObjectId: ""
  90. };
  91. barDimEchartsList.data = {
  92. ...item,
  93. assessmentObjectName: "",
  94. assessmentObjectId: ""
  95. };
  96. } else {
  97. radarRefList.value = [];
  98. }
  99. getChartsListApi();
  100. activeName.value = "1";
  101. });
  102. } else {
  103. showLength.value = 0;
  104. return;
  105. }
  106. setTimeout(() => {
  107. nextTick(() => {
  108. if (barDimEchartsRef.value) {
  109. if (Array.isArray(barDimEchartsRef.value)) {
  110. dataList.dimName.map((it, id) => {
  111. barDimEchartsRef?.value[id - 1]?.init(seachParams.value, 0);
  112. });
  113. } else {
  114. barDimEchartsRef.value.init(seachParams.value, 0);
  115. }
  116. }
  117. });
  118. }, 500);
  119. };
  120. // 维度表格
  121. const paramsIndex = ref({});
  122. const personListRef = ref();
  123. const radarRefList2 = ref([]);
  124. const handleClick = (tab: TabsPaneContext, event: Event) => {
  125. loading.value = true;
  126. if (tab.props.label == "总览") {
  127. getChartsListApi();
  128. } else {
  129. nextTick(() => {
  130. Object.assign(paramsIndex.value, {
  131. ...seachParams.value,
  132. dimId: tab.props.name,
  133. dimensionName: tab.props.label,
  134. type: 0
  135. });
  136. radarRefList2.value = [];
  137. setTimeout(() => {
  138. const data = [];
  139. const lists = [...radarRefList.value];
  140. lists.forEach(el => {
  141. data.push({ ...el });
  142. });
  143. data[0].dimensionList = data[0].dimensionList.filter(item => {
  144. if (item.dimId === tab.props.name) {
  145. return true;
  146. }
  147. });
  148. radarRefList2.value = data;
  149. }, 1000);
  150. });
  151. }
  152. setTimeout(() => {
  153. loading.value = false;
  154. }, 1000);
  155. };
  156. const fullBig = (item: any) => {
  157. router.push({
  158. path: "/fullBig",
  159. query: {
  160. ...item,
  161. ...seachParams.value,
  162. type: 0
  163. }
  164. });
  165. };
  166. // 加载loading
  167. const loading = ref(false);
  168. </script>
  169. <template>
  170. <div class="w-[100%]">
  171. <div class="w-[100%]">
  172. <seachData @handClick="init" />
  173. <div v-if="showLength > 0">
  174. <div class="flex mr-2">
  175. <radar ref="radarRef" :radarRefList="radarRefList" />
  176. </div>
  177. <el-tabs
  178. v-model="activeName"
  179. v-loading="loading"
  180. class="demo-tabs"
  181. :lazy="true"
  182. @tab-click="handleClick"
  183. >
  184. <el-tab-pane label="总览" name="1">
  185. <div class="flex mr-8">
  186. <rankTable
  187. ref="rankTableRef"
  188. :rankTableRefList="rankTableRefList"
  189. />
  190. </div>
  191. <!-- 总得分 -->
  192. <div class="mt-5 pr-8 w-full h-60">
  193. <barEcharts
  194. ref="barEchartsRef"
  195. :title="'总得分'"
  196. :barDimEchartsList="barDimEchartsList"
  197. />
  198. </div>
  199. <!-- 维度得分 -->
  200. <div class="flex justify-between flex-wrap items-center">
  201. <div v-for="item in dataList.dimName" :key="item.id">
  202. <div class="mt-5 pr-8 h-60 w-[600px]">
  203. <barDimEcharts
  204. ref="barDimEchartsRef"
  205. :title="item.name"
  206. :barDimEchartsList="barDimEchartsList"
  207. :itemDim="item"
  208. />
  209. </div>
  210. </div>
  211. </div>
  212. </el-tab-pane>
  213. <el-tab-pane
  214. v-for="(item, index) in dataList.dimName"
  215. :key="item.id + index"
  216. :label="item.name"
  217. :name="item.id"
  218. :lazy="true"
  219. >
  220. <div class="w-full">
  221. <div class="flex justify-between">
  222. <personList
  223. :key="item.id + index"
  224. ref="personListRef"
  225. class="w-11/12"
  226. :paramsIndex="paramsIndex"
  227. :detailData="radarRefList2"
  228. />
  229. <div
  230. class="w-[30px] h-[30px] mr-10 cursor-pointer"
  231. @click="fullBig(item)"
  232. >
  233. <img class="w-full h-full" :src="qvanping" alt="" />
  234. </div>
  235. </div>
  236. <div class="w-full h-60 mt-5 pr-8">
  237. <barEcharts
  238. ref="barEchartsRef"
  239. :title="item.name"
  240. :barDimEchartsList="barDimEchartsList"
  241. :itemDim="item"
  242. />
  243. </div>
  244. </div>
  245. </el-tab-pane>
  246. </el-tabs>
  247. </div>
  248. </div>
  249. </div>
  250. </template>