import React, { useEffect, useState, useMemo } from 'react'; import { Card, Select, Button, Space, Spin, Empty, Row, Col, message } from 'antd'; import { Line } from '@ant-design/charts'; import { getIndustryTrend } from '@/services/analysis/industry'; import dayjs from 'dayjs'; import { useRequest } from '@umijs/max'; const { Option } = Select; type IndustryDataItem = { date: string; category: string; value: number; }; const IndustryTrendPage: React.FC = () => { const [params, setParams] = useState({ timeDimension: '月' as '月' | '季度' | '年', type: '岗位发布数量' as '岗位发布数量' | '招聘增长率', startTime: dayjs().subtract(6, 'month').format('YYYY-MM'), endTime: dayjs().format('YYYY-MM'), selectedIndustry: '' }); const [allData, setAllData] = useState([]); const [prevSelectedIndustry, setPrevSelectedIndustry] = useState(''); const { loading, run } = useRequest( () => getIndustryTrend({ ...params, startTime: formatTimeParam(params.startTime, params.timeDimension), endTime: formatTimeParam(params.endTime, params.timeDimension) }), { manual: true, onError: (error) => message.error('数据加载失败: ' + error.message), onSuccess: (responseData) => { const formattedData = convertApiData(responseData); setAllData(formattedData); const industryToSelect = prevSelectedIndustry || (formattedData.length > 0 ? formattedData[0].category : ''); setParams(prev => ({ ...prev, selectedIndustry: industryToSelect })); } } ); const convertApiData = (apiData: any): IndustryDataItem[] => { if (!apiData) return []; try { const result: IndustryDataItem[] = []; if (typeof apiData === 'object' && !Array.isArray(apiData)) { Object.entries(apiData).forEach(([month, monthData]) => { if (Array.isArray(monthData)) { (monthData as any[]).forEach(item => { const convertedItem = { date: month, category: item.name || item.category, value: Number(item.data || item.value) || 0 }; console.log('转换后的数据项:', convertedItem); result.push(convertedItem); }); } }); return result; } if (Array.isArray(apiData)) { return apiData.map(item => { const convertedItem = { date: item.time || item.date, category: item.name || item.category, value: Number(item.data || item.value) || 0 }; console.log('转换后的数据项:', convertedItem); return convertedItem; }); } return []; } catch (error) { console.error('数据转换错误:', error); return []; } }; const industries = useMemo(() => { if (allData.length === 0) return []; const categories = new Set(); allData.forEach(item => categories.add(item.category)); return Array.from(categories).sort(); }, [allData]); const formatTimeParam = (dateStr: string, dimension: string) => { const date = dayjs(dateStr); switch (dimension) { case '季度': return `${date.year()}-Q${Math.ceil((date.month() + 1) / 3)}`; case '年': return `${date.year()}`; default: return date.format('YYYY-MM'); } }; const handleIndustryChange = (value: string) => { setPrevSelectedIndustry(value); setParams(p => ({ ...p, selectedIndustry: value })); }; const currentIndustryData = useMemo(() => { if (!params.selectedIndustry) return []; const filteredData = allData .filter(item => item.category === params.selectedIndustry) .map(item => ({ date: item.date, category: item.category, value: item.value ?? 0, })) .sort((a, b) => dayjs(a.date).valueOf() - dayjs(b.date).valueOf()); console.log("当前行业数据 (过滤后):", filteredData); return filteredData; }, [allData, params.selectedIndustry]); console.log("最终图表数据:", currentIndustryData); const chartConfig = { data: currentIndustryData, height: 180, xField: 'date', yField: 'value', seriesField: 'category', xAxis: { type: 'cat', tickCount: 5, label: { formatter: (text: string) => { if (params.timeDimension === '年') return text.split('-')[0]; if (params.timeDimension === '季度') return text.split('-')[1]; return text.split('-')[1]; }, }, }, yAxis: { label: { formatter: (val: string) => `${val}${params.type === '招聘增长率' ? '%' : '个'}`, }, }, tooltip: false, point: { size: 4, shape: 'circle', }, animation: { appear: { animation: 'path-in', duration: 1000, }, }, }; useEffect(() => { run(); }, [params.timeDimension, params.startTime, params.endTime]); return (
{currentIndustryData.length > 0 ? ( ) : ( )}
); }; export default IndustryTrendPage;