ContactsCountRank.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <!-- 新增联系人数排行 -->
  2. <template>
  3. <!-- 柱状图 -->
  4. <el-card shadow="never">
  5. <el-skeleton :loading="loading" animated>
  6. <Echart :height="500" :options="echartsOption" />
  7. </el-skeleton>
  8. </el-card>
  9. <!-- 排行列表 -->
  10. <el-card shadow="never" class="mt-16px">
  11. <el-table v-loading="loading" :data="list">
  12. <el-table-column label="公司排名" align="center" type="index" width="80" />
  13. <el-table-column label="创建人" align="center" prop="nickname" min-width="200" />
  14. <el-table-column label="部门" align="center" prop="deptName" min-width="200" />
  15. <el-table-column label="新增联系人数(个)" align="center" prop="count" min-width="200" />
  16. </el-table>
  17. </el-card>
  18. </template>
  19. <script setup lang="ts">
  20. import { StatisticsRankApi, StatisticsRankRespVO } from '@/api/crm/statistics/rank'
  21. import { EChartsOption } from 'echarts'
  22. import { clone } from 'lodash-es'
  23. defineOptions({ name: 'ContactsCountRank' })
  24. const props = defineProps<{ queryParams: any }>() // 搜索参数
  25. const loading = ref(false) // 加载中
  26. const list = ref<StatisticsRankRespVO[]>([]) // 列表的数据
  27. /** 柱状图配置:横向 */
  28. const echartsOption = reactive<EChartsOption>({
  29. dataset: {
  30. dimensions: ['nickname', 'count'],
  31. source: []
  32. },
  33. grid: {
  34. left: 20,
  35. right: 20,
  36. bottom: 20,
  37. containLabel: true
  38. },
  39. legend: {
  40. top: 50
  41. },
  42. series: [
  43. {
  44. name: '新增联系人数排行',
  45. type: 'bar'
  46. }
  47. ],
  48. toolbox: {
  49. feature: {
  50. dataZoom: {
  51. yAxisIndex: false // 数据区域缩放:Y 轴不缩放
  52. },
  53. brush: {
  54. type: ['lineX', 'clear'] // 区域缩放按钮、还原按钮
  55. },
  56. saveAsImage: { show: true, name: '新增联系人数排行' } // 保存为图片
  57. }
  58. },
  59. tooltip: {
  60. trigger: 'axis',
  61. axisPointer: {
  62. type: 'shadow'
  63. }
  64. },
  65. xAxis: {
  66. type: 'value',
  67. name: '新增联系人数(个)'
  68. },
  69. yAxis: {
  70. type: 'category',
  71. name: '创建人'
  72. }
  73. }) as EChartsOption
  74. /** 获取新增联系人数排行 */
  75. const loadData = async () => {
  76. // 1. 加载排行数据
  77. loading.value = true
  78. const rankingList = await StatisticsRankApi.getContactsCountRank(props.queryParams)
  79. // 2.1 更新 Echarts 数据
  80. if (echartsOption.dataset && echartsOption.dataset['source']) {
  81. echartsOption.dataset['source'] = clone(rankingList).reverse()
  82. }
  83. // 2.2 更新列表数据
  84. list.value = rankingList
  85. loading.value = false
  86. }
  87. defineExpose({ loadData })
  88. /** 初始化 */
  89. onMounted(() => {
  90. loadData()
  91. })
  92. </script>