import React, { useState } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import { Button, Table, Space, Form, Input, DatePicker, message, Modal, Card, Row, Col, Popconfirm, Tag } from 'antd'; import { useQuery, } from '@tanstack/react-query'; import dayjs from 'dayjs'; import weekday from 'dayjs/plugin/weekday'; import localeData from 'dayjs/plugin/localeData'; import 'dayjs/locale/zh-cn'; import type { DateNote } from '../share/types.ts'; import { DateNotesAPI } from './api/date_notes.ts'; // 配置 dayjs 插件 dayjs.extend(weekday); dayjs.extend(localeData); // 设置 dayjs 语言 dayjs.locale('zh-cn'); export const DateNotesPage = () => { const queryClient = useQueryClient(); const [modalVisible, setModalVisible] = useState(false); const [formMode, setFormMode] = useState<'create' | 'edit'>('create'); const [editingId, setEditingId] = useState(null); const [form] = Form.useForm(); const [searchForm] = Form.useForm(); const [searchParams, setSearchParams] = useState({ code: '', start_date: '', end_date: '', page: 1, limit: 10, }); // 使用React Query获取日期备注列表 const { data: notesData, isLoading: isListLoading, refetch } = useQuery({ queryKey: ['dateNotes', searchParams], queryFn: () => DateNotesAPI.getDateNotes({ page: searchParams.page, pageSize: searchParams.limit, code: searchParams.code, start_date: searchParams.start_date, end_date: searchParams.end_date }), placeholderData: { data: [], pagination: { current: 1, pageSize: 10, total: 0, totalPages: 1 } } }); const notes = React.useMemo(() => notesData?.data || [], [notesData]); const pagination = React.useMemo(() => ({ current: notesData?.pagination?.current || 1, pageSize: notesData?.pagination?.pageSize || 10, total: notesData?.pagination?.total || 0, totalPages: notesData?.pagination?.totalPages || 1 }), [notesData]); // 获取单个日期备注 const fetchNote = async (id: number) => { try { const response = await DateNotesAPI.getDateNote(id); return response.data; } catch (error) { message.error('获取日期备注详情失败'); return null; } }; // 处理表单提交 const handleSubmit = async (values: Partial) => { try { const response = formMode === 'create' ? await DateNotesAPI.createDateNote(values) : await DateNotesAPI.updateDateNote(editingId!, values); message.success(formMode === 'create' ? '创建日期备注成功' : '更新日期备注成功'); setModalVisible(false); form.resetFields(); refetch(); } catch (error) { message.error((error as Error).message); } }; // 处理编辑 const handleEdit = async (id: number) => { const note = await fetchNote(id); if (note) { setFormMode('edit'); setEditingId(id); form.setFieldsValue({ ...note, note_date: note.note_date ? dayjs(note.note_date) : null }); setModalVisible(true); } }; // 处理删除 const handleDelete = async (id: number) => { try { await DateNotesAPI.deleteDateNote(id); message.success('删除日期备注成功'); refetch(); } catch (error) { message.error((error as Error).message); } }; // 处理搜索 const handleSearch = async (values: any) => { try { queryClient.removeQueries({ queryKey: ['dateNotes'] }); setSearchParams({ code: values.code || '', start_date: values.dateRange?.[0]?.format('YYYY-MM-DD') || '', end_date: values.dateRange?.[1]?.format('YYYY-MM-DD') || '', page: 1, limit: searchParams.limit, }); } catch (error) { message.error('搜索失败'); } }; // 处理分页 const handlePageChange = (page: number, pageSize?: number) => { setSearchParams(prev => ({ ...prev, page, limit: pageSize || prev.limit, })); }; // 处理添加 const handleAdd = () => { setFormMode('create'); setEditingId(null); form.resetFields(); setModalVisible(true); }; // 表格列定义 const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 80, }, { title: '股票代码', dataIndex: 'code', key: 'code', }, { title: '日期', dataIndex: 'note_date', key: 'note_date', render: (date: string) => dayjs(date).format('YYYY-MM-DD'), }, { title: '备注内容', dataIndex: 'note', key: 'note', ellipsis: true, }, { title: '更新时间', dataIndex: 'updated_at', key: 'updated_at', render: (date: string) => dayjs(date).format('YYYY-MM-DD HH:mm:ss'), }, { title: '操作', key: 'action', render: (_: any, record: DateNote) => ( handleDelete(record.id)} okText="确定" cancelText="取消" > ), }, ]; return (
`共 ${total} 条`, }} /> { form.validateFields() .then(values => { handleSubmit({ ...values, note_date: values.note_date?.format('YYYY-MM-DD') }); }) .catch(info => { console.log('表单验证失败:', info); }); }} onCancel={() => setModalVisible(false)} width={800} okText="确定" cancelText="取消" destroyOnClose >
); };