import React, { useState, useEffect } from 'react'; import { Card, Space, Table, Button, Typography, Modal, Checkbox, Input, message, DatePicker } from 'antd'; import { ArrowLeftOutlined, DollarOutlined, SettingOutlined, SearchOutlined, ReloadOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import { getFields, getMaterialConsumpList } from '../api'; import dayjs from 'dayjs'; const { RangePicker } = DatePicker; const toCamelCase = (str: string) => str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()); interface ConsumptionRecord { id: string; advertiser_id?: string; user_id?: string; consume_date?: string; [key: string]: any; } const ConsumePage: React.FC = () => { const navigate = useNavigate(); const [consumptionRecords, setConsumptionRecords] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [showModal, setShowModal] = useState(false); const [columnsData, setColumnsData] = useState<{ name: string; description: string }[]>([]); const [selectedColumns, setSelectedColumns] = useState([]); const [searchText, setSearchText] = useState(''); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [advertiserId, setAdvertiserId] = useState(''); const [userId, setUserId] = useState(''); const [consumeDateRange, setConsumeDateRange] = useState<[string, string] | undefined>(); useEffect(() => { loadColumns(); loadData(); }, [page, pageSize, consumeDateRange]); const loadData = async () => { setLoading(true); console.log(consumeDateRange); try { const res = await getMaterialConsumpList({ advertiser_id: advertiserId || undefined, user_id: userId || undefined, consume_date: consumeDateRange, page, page_size: pageSize, }); setConsumptionRecords(res.data || []); setTotal(res.pagination?.total || 0); } catch (e: any) { message.error('加载数据失败'); } finally { setLoading(false); } }; const loadColumns = async () => { try { const res = await getFields(); const fields = res.data || []; const formattedFields = fields.map((item: { field: string; description: string }) => ({ name: toCamelCase(item.field), description: item.description, })); setColumnsData(formattedFields); const saved = localStorage.getItem('consumeColumns'); if (saved) { setSelectedColumns(JSON.parse(saved)); } else { setSelectedColumns(formattedFields.map((item: { name: string }) => item.name)); } } catch (e: any) { message.error('加载表头字段失败'); } }; const tableData = consumptionRecords.map((item, index) => ({ ...item, index: index + 1, key: item.id, })); const handleBack = () => { navigate('/authorization'); }; const handleSearch = () => { setPage(1); loadData(); }; const handleReset = () => { setAdvertiserId(''); setUserId(''); setConsumeDateRange(undefined); setPage(1); loadData(); }; const dynamicColumns = selectedColumns .map(colName => columnsData.find(col => col.name === colName)) .filter((col): col is { name: string; description: string } => !!col) .map(col => ({ title: col.description, dataIndex: col.name, key: col.name, ellipsis: true, })); return (
{/* */} 消耗记录
setAdvertiserId(e.target.value)} style={{ width: 200 }} /> setUserId(e.target.value)} style={{ width: 200 }} /> { if (dates && dates[0] && dates[1]) { setConsumeDateRange([dates[0].format('YYYY-MM-DD'), dates[1].format('YYYY-MM-DD')]); } else { setConsumeDateRange(undefined); } }} />
`共 ${t} 条记录`, size: 'small', onChange: (p, ps) => { setPage(p); setPageSize(ps); }, }} /> { localStorage.setItem('consumeColumns', JSON.stringify(selectedColumns)); message.success('表头设置已保存'); setShowModal(false); }} onCancel={() => { setShowModal(false); setSearchText(''); }} okText="确定" cancelText="取消" width={800} >
setSearchText(e.target.value)} style={{ marginBottom: 8 }} /> 输入指标名称进行搜索
任务详情指标
0} indeterminate={selectedColumns.length > 0 && selectedColumns.length < columnsData.length} onChange={(e) => { if (e.target.checked) { setSelectedColumns(columnsData.map(item => item.name)); } else { setSelectedColumns([]); } }} style={{ marginBottom: 12 }} > 全选
{columnsData .filter(item => item.description.toLowerCase().includes(searchText.toLowerCase()) || item.name.toLowerCase().includes(searchText.toLowerCase()) ) .map(item => ( { if (e.target.checked) { setSelectedColumns(prev => [...prev, item.name]); } else { setSelectedColumns(prev => prev.filter(col => col !== item.name)); } }} > {item.description} ))}
已添加({selectedColumns.length})
{selectedColumns.length === 0 ? ( 暂无已选指标 ) : (
{selectedColumns.map((colName, index) => { const col = columnsData.find(c => c.name === colName); return (
{ e.dataTransfer.setData('index', String(index)); }} onDragOver={(e) => { e.preventDefault(); }} onDrop={(e) => { const fromIndex = parseInt(e.dataTransfer.getData('index')); const toIndex = index; if (fromIndex !== toIndex) { const newSelected = [...selectedColumns]; const [removed] = newSelected.splice(fromIndex, 1); newSelected.splice(toIndex, 0, removed); setSelectedColumns(newSelected); } }} > {col?.description || colName} {index + 1}
); })}
)}
); }; export default ConsumePage;