| | |
| | | range-separator="至" |
| | | start-placeholder="开始月份" |
| | | end-placeholder="结束月份" |
| | | :disabled-date="disabledDate" |
| | | @change="handleDateChange" |
| | | class="w-full md:w-auto" |
| | | style="margin-right: 30px;" |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted, reactive, nextTick } from 'vue'; |
| | | import { ref, computed, onMounted, reactive, nextTick, getCurrentInstance } from 'vue'; |
| | | import 'element-plus/dist/index.css'; |
| | | import Echarts from "@/components/Echarts/echarts.vue"; |
| | | import { reportForms,reportIncome,reportExpense } from "@/api/financialManagement/financialStatements"; |
| | |
| | | |
| | | // 日期范围 |
| | | const dateRange = ref(null); |
| | | const { proxy } = getCurrentInstance(); |
| | | const chartStyle = { |
| | | width: '100%', |
| | | height: '100%', // 设置图表容器的高度 |
| | |
| | | return `<div>${axisLabel}</div><div>${rows}</div>` |
| | | } |
| | | }) |
| | | const months = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']; |
| | | const lineSeries0 = ref([]) |
| | | const lineSeries1 = ref([]) |
| | | |
| | | // 根据月份范围生成 x 轴数据 |
| | | const generateMonthLabels = (startMonth, endMonth) => { |
| | | const labels = []; |
| | | let current = dayjs(startMonth); |
| | | const end = dayjs(endMonth); |
| | | |
| | | while (current.isBefore(end) || current.isSame(end, 'month')) { |
| | | labels.push(`${current.month() + 1}月`); |
| | | current = current.add(1, 'month'); |
| | | } |
| | | |
| | | return labels; |
| | | }; |
| | | |
| | | const xAxis0 = ref([ |
| | | { |
| | | type: 'category', |
| | | axisTick: { show: true, alignWithLabel: true }, |
| | | data: months, |
| | | data: [], |
| | | }, |
| | | ]); |
| | | const xAxis1 = ref([ |
| | | { |
| | | type: 'category', |
| | | axisTick: { show: true, alignWithLabel: true }, |
| | | data: months, |
| | | data: [], |
| | | }, |
| | | ]); |
| | | const yAxis0 = [ |
| | |
| | | return; |
| | | } |
| | | |
| | | // 更新 x 轴数据 |
| | | const monthLabels = generateMonthLabels(startDateStr, endDateStr); |
| | | xAxis0.value[0].data = monthLabels; |
| | | xAxis1.value[0].data = monthLabels; |
| | | |
| | | // 开始月份拼接第一天,结束月份拼接最后一天 |
| | | const entryDateStart = startDate.startOf('month').format('YYYY-MM-DD'); |
| | | const entryDateEnd = endDate.endOf('month').format('YYYY-MM-DD'); |
| | |
| | | }); |
| | | }); |
| | | |
| | | // 限制月份选择范围(最多12个月) |
| | | const disabledDate = (time) => { |
| | | // 如果没有选择开始月份,不禁用任何日期 |
| | | if (!dateRange.value || !Array.isArray(dateRange.value) || !dateRange.value[0]) { |
| | | return false; |
| | | } |
| | | |
| | | const startMonth = dayjs(dateRange.value[0]); |
| | | const currentMonth = dayjs(time); |
| | | |
| | | // 如果当前月份在开始月份之前,禁用 |
| | | if (currentMonth.isBefore(startMonth, 'month')) { |
| | | return true; |
| | | } |
| | | |
| | | // 计算最大允许的月份(开始月份 + 11个月 = 12个月) |
| | | const maxMonth = startMonth.add(11, 'month'); |
| | | |
| | | // 禁用超过12个月的月份 |
| | | return currentMonth.isAfter(maxMonth, 'month'); |
| | | }; |
| | | |
| | | // 处理月份范围变化 |
| | | const handleDateChange = (newRange) => { |
| | | if (!newRange || !Array.isArray(newRange) || newRange.length !== 2) { |
| | | return; |
| | | } |
| | | |
| | | // 验证月份范围不超过12个月 |
| | | const startDate = dayjs(newRange[0]); |
| | | const endDate = dayjs(newRange[1]); |
| | | const monthDiff = endDate.diff(startDate, 'month'); |
| | | |
| | | if (monthDiff > 11) { |
| | | proxy.$modal.msgWarning('最多只能选择12个月份'); |
| | | // 自动调整为12个月 |
| | | const adjustedEnd = startDate.add(11, 'month').format('YYYY-MM'); |
| | | dateRange.value = [newRange[0], adjustedEnd]; |
| | | getData(); |
| | | return; |
| | | } |
| | | |
| | | dateRange.value = newRange; |
| | | getData(); |
| | | }; |