update pay ui
This commit is contained in:
@@ -6,30 +6,6 @@ import { logger } from '@utils/logger';
|
||||
import axios from '@utils/axiosConfig';
|
||||
import NewsEventsTab from '../../CompanyOverview/NewsEventsTab';
|
||||
|
||||
/**
|
||||
* 标准化股票代码(补全后缀)
|
||||
* @param {string} code - 股票代码(可能不带后缀)
|
||||
* @returns {string} 带后缀的股票代码
|
||||
*/
|
||||
const normalizeStockCode = (code) => {
|
||||
if (!code) return code;
|
||||
// 已有后缀则直接返回
|
||||
if (code.includes('.')) return code;
|
||||
|
||||
const pureCode = code.replace(/\D/g, '');
|
||||
if (pureCode.length !== 6) return code;
|
||||
|
||||
const prefix = pureCode[0];
|
||||
// 上交所:6、9 开头
|
||||
if (prefix === '6' || prefix === '9') return `${pureCode}.SH`;
|
||||
// 深交所:0、2、3 开头
|
||||
if (prefix === '0' || prefix === '2' || prefix === '3') return `${pureCode}.SZ`;
|
||||
// 北交所:8、4 开头
|
||||
if (prefix === '8' || prefix === '4') return `${pureCode}.BJ`;
|
||||
|
||||
return code;
|
||||
};
|
||||
|
||||
const NewsPanel = ({ stockCode }) => {
|
||||
const [newsEvents, setNewsEvents] = useState([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
@@ -42,39 +18,22 @@ const NewsPanel = ({ stockCode }) => {
|
||||
has_prev: false,
|
||||
});
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [stockName, setStockName] = useState('');
|
||||
|
||||
// 获取股票名称
|
||||
const fetchStockName = useCallback(async () => {
|
||||
try {
|
||||
const { data: result } = await axios.get(
|
||||
`/api/stock/${stockCode}/basic-info`
|
||||
);
|
||||
if (result.success && result.data) {
|
||||
const name = result.data.SECNAME || result.data.ORGNAME || stockCode;
|
||||
setStockName(name);
|
||||
return name;
|
||||
}
|
||||
return stockCode;
|
||||
} catch (err) {
|
||||
logger.error('NewsPanel', 'fetchStockName', err, { stockCode });
|
||||
return stockCode;
|
||||
}
|
||||
}, [stockCode]);
|
||||
|
||||
// 加载新闻事件
|
||||
const loadNewsEvents = useCallback(
|
||||
async (query, page = 1) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
// 优先使用自定义查询,否则用股票名称,最后用带后缀的股票代码
|
||||
const searchTerm = query || stockName || normalizeStockCode(stockCode);
|
||||
// 优先使用自定义查询,否则用股票代码(6位纯数字即可)
|
||||
const searchTerm = query || stockCode.replace(/\.\w+$/, ''); // 移除后缀如 .SZ
|
||||
const { data: result } = await axios.get(
|
||||
`/api/events?q=${encodeURIComponent(searchTerm)}&page=${page}&per_page=10`
|
||||
`/api/events?sort=new&importance=all&q=${encodeURIComponent(searchTerm)}&page=${page}&mode=vertical&per_page=10`
|
||||
);
|
||||
|
||||
if (result.success) {
|
||||
setNewsEvents(result.data || []);
|
||||
// API 返回结构: { data: { events: [...] }, pagination: {...} }
|
||||
const events = result.data?.events || result.data || [];
|
||||
setNewsEvents(events);
|
||||
setPagination({
|
||||
page: result.pagination?.page || page,
|
||||
per_page: result.pagination?.per_page || 10,
|
||||
@@ -91,19 +50,15 @@ const NewsPanel = ({ stockCode }) => {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[stockCode, stockName]
|
||||
[stockCode]
|
||||
);
|
||||
|
||||
// 首次加载
|
||||
// 首次加载 - 直接用股票代码搜索
|
||||
useEffect(() => {
|
||||
const initLoad = async () => {
|
||||
if (stockCode) {
|
||||
const name = await fetchStockName();
|
||||
await loadNewsEvents(name, 1);
|
||||
}
|
||||
};
|
||||
initLoad();
|
||||
}, [stockCode, fetchStockName, loadNewsEvents]);
|
||||
if (stockCode) {
|
||||
loadNewsEvents(null, 1);
|
||||
}
|
||||
}, [stockCode, loadNewsEvents]);
|
||||
|
||||
// 搜索处理
|
||||
const handleSearchChange = (value) => {
|
||||
@@ -111,12 +66,12 @@ const NewsPanel = ({ stockCode }) => {
|
||||
};
|
||||
|
||||
const handleSearch = () => {
|
||||
loadNewsEvents(searchQuery || stockName, 1);
|
||||
loadNewsEvents(searchQuery || null, 1);
|
||||
};
|
||||
|
||||
// 分页处理
|
||||
const handlePageChange = (page) => {
|
||||
loadNewsEvents(searchQuery || stockName, page);
|
||||
loadNewsEvents(searchQuery || null, page);
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user