ContractPriceRank.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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
  16. label="合同金额(元)"
  17. align="center"
  18. prop="count"
  19. min-width="200"
  20. :formatter="fenToYuanFormat"
  21. />
  22. </el-table>
  23. </el-card>
  24. </template>
  25. <script setup lang="ts">
  26. import { RankApi, BiRankRespVO } from '@/api/crm/bi/rank'
  27. import { EChartsOption } from 'echarts'
  28. import { fenToYuanFormat } from '@/utils/formatter'
  29. import { fenToYuan } from '@/utils'
  30. import { clone } from 'unocss'
  31. defineOptions({ name: 'ContractPriceRank' })
  32. const props = defineProps<{ queryParams: any }>() // 搜索参数
  33. const loading = ref(false) // 加载中
  34. const list = ref<BiRankRespVO[]>([]) // 列表的数据
  35. /** 柱状图配置:横向 */
  36. const echartsOption = reactive<EChartsOption>({
  37. dataset: {
  38. dimensions: ['nickname', 'count'],
  39. source: []
  40. },
  41. grid: {
  42. left: 20,
  43. right: 20,
  44. bottom: 20,
  45. containLabel: true
  46. },
  47. legend: {
  48. top: 50
  49. },
  50. series: [
  51. {
  52. name: '合同金额排行',
  53. type: 'bar'
  54. }
  55. ],
  56. toolbox: {
  57. feature: {
  58. dataZoom: {
  59. yAxisIndex: false // 数据区域缩放:Y 轴不缩放
  60. },
  61. brush: {
  62. type: ['lineX', 'clear'] // 区域缩放按钮、还原按钮
  63. },
  64. saveAsImage: { show: true, name: '合同金额排行' } // 保存为图片
  65. }
  66. },
  67. tooltip: {
  68. trigger: 'axis',
  69. axisPointer: {
  70. type: 'shadow'
  71. },
  72. valueFormatter: fenToYuan
  73. },
  74. xAxis: {
  75. type: 'value',
  76. name: '合同金额(元)'
  77. },
  78. yAxis: {
  79. type: 'category',
  80. name: '签订人'
  81. }
  82. }) as EChartsOption
  83. /** 获取合同金额排行 */
  84. const loadData = async () => {
  85. // 1. 加载排行数据
  86. loading.value = true
  87. const rankingList = await RankApi.getContractPriceRank(props.queryParams)
  88. // 2.1 更新 Echarts 数据
  89. if (echartsOption.dataset && echartsOption.dataset['source']) {
  90. echartsOption.dataset['source'] = clone(rankingList).reverse()
  91. }
  92. // 2.2 更新列表数据
  93. list.value = rankingList
  94. loading.value = false
  95. }
  96. defineExpose({ loadData })
  97. /** 初始化 */
  98. onMounted(() => {
  99. loadData()
  100. })
  101. </script>