import type { AnalysisMoneyAmount } from '@/types/money/analysis' import dayjs from 'dayjs' import { useEffect, useState } from 'react' import { ScrollView, Text, TouchableOpacity, View } from 'react-native' import { VictoryChart, VictoryLabel, VictoryLine, VictoryPie, VictoryTheme, VictoryTooltip } from 'victory-native' import { ADatePicker, ADateRangePicker, ASegmentedTabs, LucideIcon } from '@/components/common/ao' import EmptyState from '@/components/common/EmptyStatus' import CustomHeader from '@/components/custom/Header' import PagerTabs from '@/components/custom/PagerTabs' import { analysisMoneyLineApi, analysisMoneyPieApi } from '@/request/api/money/analysis' import { MoneyCategoryEnum } from '@/types/money/category' import { add } from '@/utils/math' import { getCurrentYear, getCurrentYearMonth, getEndOfMonth, getStartOfMonth } from '@/utils/time' interface AnalysisContentProps { analysisType: MoneyCategoryEnum } export default function Analysis() { function AnalysisContent({ analysisType }: AnalysisContentProps) { // 按月0 按年1 自定义2 const [timeType, setTimeType] = useState(0) // 开始结束时间 const [startDate, setStartDate] = useState(getCurrentYearMonth()) const [endDate, setEndDate] = useState('') // 显示 const [showDatePicker, setShowDatePicker] = useState(false) // 数据 const [lineRecords, setLineRecords] = useState([]) const [pieRecords, setPieRecords] = useState([]) // 请求 function fetchChartsData() { let start = '' let end = '' const selectedStartDate = dayjs(startDate) const selectedEndDate = dayjs(endDate) let periodType = 0 if (timeType === 0) { start = selectedStartDate.startOf('month').format('YYYY-MM-DD') end = selectedStartDate.endOf('month').format('YYYY-MM-DD') periodType = 0 } else if (timeType === 1) { start = selectedStartDate.startOf('year').format('YYYY-MM-DD') end = selectedStartDate.endOf('year').format('YYYY-MM-DD') periodType = 1 } else { if (selectedStartDate.isSame(selectedEndDate, 'month')) { periodType = 0 start = selectedStartDate.startOf('month').format('YYYY-MM-DD') end = selectedEndDate.endOf('month').format('YYYY-MM-DD') } else if (selectedStartDate.isSame(selectedEndDate, 'year')) { periodType = 1 start = selectedStartDate.startOf('year').format('YYYY-MM-DD') end = selectedEndDate.endOf('year').format('YYYY-MM-DD') } else { periodType = 2 start = selectedStartDate.format('YYYY-MM-DD') end = selectedEndDate.format('YYYY-MM-DD') } } analysisMoneyLineApi({ start_date: start, end_date: end, type: analysisType, period_type: periodType, }).then((res) => { if (res.isSuccess) { setLineRecords(res.data.records) } }) analysisMoneyPieApi({ start_date: start, end_date: end, type: analysisType, period_type: periodType, }).then((res) => { if (res.isSuccess) { setPieRecords(res.data.records) } }) } const totalAmount: number = pieRecords.reduce( (sum, item) => Number(add(sum, Number(item.y) || 0)), 0, ) useEffect(() => { fetchChartsData() }, [timeType, startDate, endDate]) return ( { setTimeType(index) if (index === 2) { // 自定义类型,本月的 1号 - 终止号 setStartDate(getStartOfMonth()) setEndDate(getEndOfMonth()) } else if (index === 1) { // 按年 setStartDate(getCurrentYear()) setEndDate('') } else { // 按月 setStartDate(getCurrentYearMonth()) setEndDate('') } }} tabs={[ { key: '1', label: '按月' }, { key: '2', label: '按年' }, { key: '3', label: '自定义' }, ]} /> {startDate} {timeType === 2 && ( <> - {endDate} )} 趋势分析 分类构成 { pieRecords.length > 0 ? ( ) : ( ) } 分类详细 总: {totalAmount} {' '} 元 { pieRecords.length > 0 ? ( {pieRecords.map((item, index) => ( {item.x} {item.y} {' '} 元 ))} ) : ( ) } { timeType === 2 ? ( { setStartDate(startDate) setEndDate(endDate) setShowDatePicker(false) }} onClose={() => { setShowDatePicker(false) }} /> ) : ( { setStartDate(val) setShowDatePicker(false) }} onClose={() => { setShowDatePicker(false) }} /> ) } ) } return ( , }, { key: 'income', title: '收入', element: , }, ]} /> ) }