index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <script setup>
  2. import request from "@/utils/request.js";
  3. // 引入ECharts
  4. import * as echarts from 'echarts';
  5. import {onMounted, ref, watch} from 'vue';
  6. const getData = async () => {
  7. const res = await request.get('/basicData/xcrPayTaxes/of-year-list');
  8. // 处理数据并更新图表
  9. updateChart(res.data.ofYearDetail, 'year');
  10. }
  11. const getCurrentYear = () => {
  12. return new Date().getFullYear();
  13. }
  14. const getLastYear = () => {
  15. return new Date().getFullYear() - 1;
  16. }
  17. const selectedQuarter = ref('1'); // 默认选择第一个季度
  18. const getQuarterData = async () => {
  19. console.log(selectedQuarter.value);
  20. const res = await request.get('/basicData/xcrPayTaxes/of-quarter-list', {
  21. params: {
  22. quarter: selectedQuarter.value // 使用选中的季度
  23. }
  24. });
  25. // 处理数据并更新图表
  26. updateChart(res.data.ofQuarterDetail, 'quarter');
  27. }
  28. let yearChartInstance = null;
  29. let quarterChartInstance = null;
  30. const updateChart = (data, type) => {
  31. if (type === 'year') {
  32. if (!yearChartInstance) {
  33. yearChartInstance = echarts.init(document.getElementById('yearChart'));
  34. }
  35. } else if (type === 'quarter') {
  36. if (!quarterChartInstance) {
  37. quarterChartInstance = echarts.init(document.getElementById('quarterChart'));
  38. }
  39. }
  40. // 处理数据
  41. const taxpayerNames = data.map(item => item.taxpayerName).reverse();
  42. const lastYearTaxes = data.map(item => item[type === 'year' ? 'lastYearTaxesTotal' : 'lastYearOfQuarterTaxesTotal']).reverse();
  43. const thisYearTaxes = data.map(item => item[type === 'year' ? 'thisYearTaxesTotal' : 'thisYearOfQuarterTaxesTotal']).reverse();
  44. // 设置图表配置
  45. const option = {
  46. title: {
  47. text: type === 'year' ? '年度税收对比' : '季度税收对比'
  48. },
  49. tooltip: {
  50. trigger: 'axis'
  51. },
  52. legend: {
  53. data: [getLastYear() + '年税收', getCurrentYear() + '年税收']
  54. },
  55. xAxis: {
  56. type: 'value',
  57. },
  58. yAxis: {
  59. type: 'category',
  60. data: taxpayerNames,
  61. axisLabel: {
  62. fontSize: 12,
  63. formatter: function (value) {
  64. return value.length > 10 ? value.substring(0, 10) + '...' : value;
  65. }
  66. }
  67. },
  68. series: [
  69. {
  70. name: getLastYear() + '年税收',
  71. type: 'bar',
  72. data: lastYearTaxes,
  73. },
  74. {
  75. name: getCurrentYear() + '年税收',
  76. type: 'bar',
  77. data: thisYearTaxes,
  78. }
  79. ],
  80. dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
  81. type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
  82. yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
  83. start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
  84. end: 97, // 数据窗口范围的结束百分比, 表示到60%的位置结束
  85. moveOnMouseWheel: true, // 启用滚轮滚动
  86. moveOnMouseMove: false,
  87. zoomOnMouseWheel: false,
  88. },{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
  89. type: 'slider', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
  90. yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
  91. start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
  92. end: 97, // 数据窗口范围的结束百分比, 表示到60%的位置结束
  93. moveOnMouseWheel: true, // 启用滚轮滚动
  94. moveOnMouseMove: false,
  95. zoomOnMouseWheel: false,
  96. }]
  97. };
  98. // 更新图表数据
  99. if (type === 'year') {
  100. yearChartInstance.setOption(option);
  101. } else if (type === 'quarter') {
  102. quarterChartInstance.setOption(option);
  103. }
  104. }
  105. const activeTab = ref('year'); // 添加一个变量来记录当前激活的tab
  106. onMounted(() => {
  107. getData();
  108. getQuarterData();
  109. })
  110. watch(selectedQuarter, () => {
  111. getQuarterData(); // 当季度选择改变时,重新获取数据
  112. })
  113. // 添加tab-change事件监听
  114. const handleTabChange = (tab) => {
  115. if (tab.props.label === '年度税收对比') {
  116. getData();
  117. } else if (tab.props.label === '季度税收对比') {
  118. getQuarterData();
  119. }
  120. }
  121. </script>
  122. <template>
  123. <div>
  124. <el-tabs @tab-change="handleTabChange">
  125. <el-tab-pane label="季度税收对比">
  126. <el-select v-model="selectedQuarter" placeholder="请选择季度" class="mb-10px">
  127. <el-option label="第一季度" value="1"></el-option>
  128. <el-option label="第二季度" value="2"></el-option>
  129. <el-option label="第三季度" value="3"></el-option>
  130. <el-option label="第四季度" value="4"></el-option>
  131. </el-select>
  132. <div id="quarterChart" style="width: 90vw; height: 85vh;" ></div>
  133. </el-tab-pane>
  134. <el-tab-pane label="年度税收对比">
  135. <div id="yearChart" style="width: 90vw; height: 85vh;"></div>
  136. </el-tab-pane>
  137. </el-tabs>
  138. </div>
  139. </template>