import React, { useState } from 'react'; import { Card, CardBody, HStack, Text, Button, Input, InputGroup, InputLeftElement, Modal, ModalOverlay, ModalContent, ModalHeader, ModalFooter, ModalBody, ModalCloseButton, Badge, Table, Thead, Tbody, Tr, Th, Td, Tag, TagLabel, Wrap, WrapItem, useColorModeValue, useToast, Tooltip, Divider, Alert, AlertIcon, } from '@chakra-ui/react'; import { formatTooltipText, getFormattedTextProps } from '../../../utils/textUtils'; import { SearchIcon, DownloadIcon } from '@chakra-ui/icons'; // 简化版搜索组件 - 仅支持股票代码/名称精确匹配 export const AdvancedSearch = ({ onSearch, loading }) => { const [searchKeyword, setSearchKeyword] = useState(''); const cardBg = useColorModeValue('white', 'gray.800'); const toast = useToast(); const handleSearch = () => { if (!searchKeyword.trim()) { toast({ title: '请输入股票代码或名称', status: 'warning', duration: 2000, }); return; } const searchParams = { query: searchKeyword.trim(), mode: 'exact', // 固定为精确匹配 page: 1, page_size: 50, }; onSearch(searchParams); }; const clearSearch = () => { setSearchKeyword(''); }; return ( setSearchKeyword(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSearch()} fontSize="md" /> ); }; // 搜索结果弹窗组件 export const SearchResultsModal = ({ isOpen, onClose, searchResults, onStockClick }) => { const [currentPage, setCurrentPage] = useState(1); const itemsPerPage = 20; if (!searchResults) return null; const { stocks = [], total = 0 } = searchResults; const totalPages = Math.ceil(total / itemsPerPage); const startIndex = (currentPage - 1) * itemsPerPage; const endIndex = startIndex + itemsPerPage; const currentStocks = stocks.slice(startIndex, endIndex); const exportResults = () => { const csvContent = [ ['股票代码', '股票名称', '涨停时间', '涨停原因', '所属板块'].join(','), ...stocks.map(stock => [ stock.scode, stock.sname, stock.zt_time || '-', (stock.brief || stock.summary || '-').replace(/,/g, ','), (stock.core_sectors || []).join(';') ].join(',')) ].join('\n'); const blob = new Blob(['\uFEFF' + csvContent], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `搜索结果_${new Date().toISOString().split('T')[0]}.csv`; link.click(); }; return ( 搜索结果 共找到 {total} 只股票 {stocks.length === 0 ? ( 没有找到符合条件的股票,请尝试调整搜索条件。 ) : ( {currentStocks.map((stock, index) => ( ))}
序号 股票代码 股票名称 涨停时间 连板天数 涨停原因 所属板块 K线
{startIndex + index + 1} {stock.scode} {stock.sname} {stock.zt_time || '-'} {stock.continuous_days && ( {stock.continuous_days} )} {getFormattedTextProps(stock.brief || stock.summary || '-').children} {(stock.core_sectors || []).slice(0, 3).map((sector, i) => ( {sector} ))} {stock.core_sectors && stock.core_sectors.length > 3 && ( +{stock.core_sectors.length - 3} )}
)} {totalPages > 1 && ( <> 第 {currentPage} / {totalPages} 页 )}
); }; export default { AdvancedSearch, SearchResultsModal };